예제 #1
0
def get_cube_mesh():
    # a cube Mesh consist of six Faces
    # left
    faces = []
    rec = Face3D(get_rectangle_points())
    t = Matrix3D.get_shift_matrix(-1, 0, 0).dot(
        Matrix3D.get_rot_y_matrix(math.pi / 2))
    faces.append(rec.transform(t))
    # right
    t = Matrix3D.get_shift_matrix(1, 0, 0).dot(
        Matrix3D.get_rot_y_matrix(math.pi / 2))
    faces.append(rec.transform(t))
    # bottom
    t = Matrix3D.get_shift_matrix(0, -1, 0).dot(
        Matrix3D.get_rot_x_matrix(math.pi / 2))
    faces.append(rec.transform(t))
    # top
    t = Matrix3D.get_shift_matrix(0, 1, 0).dot(
        Matrix3D.get_rot_x_matrix(math.pi / 2))
    faces.append(rec.transform(t))
    # front
    t = Matrix3D.get_shift_matrix(0, 0, -1)
    faces.append(rec.transform(t))
    # back
    t = Matrix3D.get_shift_matrix(0, 0, 1)
    faces.append(rec.transform(t))
    return Mesh3D(faces)
예제 #2
0
 def test_rot_matrices(self):
     m = Matrix3D.get_rot_x_matrix(100)
     assert m.dot(Matrix3D.identity()) == m
     m = Matrix3D.get_rot_y_matrix(100)
     assert m.dot(Matrix3D.identity()) == m
     m = Matrix3D.get_rot_z_matrix(100)
     assert m.dot(Matrix3D.identity()) == m
     # rotate vector only in x-axis around x - nothing should happen
     v1 = Vector3D(1, 0, 0, 1)
     assert Matrix3D.get_rot_x_matrix(100).v_dot(v1) == v1
     v1 = Vector3D(0, 1, 0, 1)
     assert Matrix3D.get_rot_y_matrix(100).v_dot(v1) == v1
     v1 = Vector3D(0, 0, 1, 1)
     assert Matrix3D.get_rot_z_matrix(100).v_dot(v1) == v1
     # rotate vectors really
     v1 = Vector3D(1.0, 0.0, 0.0, 1.0)
     # 90 degrees or pi/2
     real_v = Matrix3D.get_rot_z_matrix(math.pi / 2).v_dot(v1)
     test_v = Vector3D.from_list([0.000000, 1.000000, 0.000000, 1.000000])
     assert real_v.nearly_equal(test_v)
     # 180 degrees
     real_v = Matrix3D.get_rot_z_matrix(math.pi).v_dot(v1)
     test_v = Vector3D.from_list([-1.000000, 0.000000, 0.000000, 1.000000])
     assert real_v.nearly_equal(test_v)
     # 270 degrees
     real_v = Matrix3D.get_rot_z_matrix(math.pi + math.pi / 2).v_dot(v1)
     test_v = Vector3D.from_list([0.000000, -1.000000, 0.000000, 1.000000])
     assert real_v.nearly_equal(test_v)
     # 360 degrees
     real_v = Matrix3D.get_rot_z_matrix(2 * math.pi).v_dot(v1)
     test_v = Vector3D.from_list([1.000000, 0.000000, 0.000000, 1.000000])
     assert real_v.nearly_equal(test_v)
     # rotate around Y-Axis about 180 degrees
     real_v = Matrix3D.get_rot_y_matrix(math.pi).v_dot(v1)
     test_v = Vector3D.from_list([-1.000000, 0.000000, 0.000000, 1.000000])
     assert real_v.nearly_equal(test_v)
     # rotate y:90 and x:90 -> (0, 1, 0, 1)
     real_v = Matrix3D.get_rot_y_matrix(math.pi / 2).v_dot(v1)
     test_v = Vector3D.from_list([0.000000, 0.000000, -1.000000, 1.000000])
     assert real_v.nearly_equal(test_v)
     real_v = Matrix3D.get_rot_x_matrix(math.pi / 2).v_dot(real_v)
     test_v = Vector3D.from_list([0.000000, 1.000000, 0.000000, 1.000000])
     assert real_v.nearly_equal(test_v)
     # and this is the combined version
     rot_y = Matrix3D.get_rot_y_matrix(math.pi / 2)
     print "rotation around y:\n", rot_y
     rot_x = Matrix3D.get_rot_x_matrix(math.pi / 2)
     print "rotation around x:\n", rot_x
     rot_z = Matrix3D.get_rot_z_matrix(math.pi / 2)
     print "rotation around z:\n", rot_z
     rot_m = rot_x.dot(rot_y.dot(rot_z))
     print "combined rotation matrix:\n", rot_m
     real_v = rot_m.v_dot(v1)
     print "resulting vector:", real_v
     test_v = Vector3D.from_list([0.000000, 1.000000, 0.000000, 1.000000])
     assert real_v.nearly_equal(test_v)
예제 #3
0
 def test_rot_matrices(self):
     m = Matrix3D.get_rot_x_matrix(100)
     assert m.dot(Matrix3D.identity()) == m
     m = Matrix3D.get_rot_y_matrix(100)
     assert m.dot(Matrix3D.identity()) == m
     m = Matrix3D.get_rot_z_matrix(100)
     assert m.dot(Matrix3D.identity()) == m
     # rotate vector only in x-axis around x - nothing should happen
     v1 = Vector3D(1, 0, 0, 1)
     assert Matrix3D.get_rot_x_matrix(100).v_dot(v1) == v1
     v1 = Vector3D(0, 1, 0, 1)
     assert Matrix3D.get_rot_y_matrix(100).v_dot(v1) == v1
     v1 = Vector3D(0, 0, 1, 1)
     assert Matrix3D.get_rot_z_matrix(100).v_dot(v1) == v1
     # rotate vectors really
     v1 = Vector3D(1.0, 0.0, 0.0, 1.0)
     # 90 degrees or pi/2
     real_v = Matrix3D.get_rot_z_matrix(math.pi/2).v_dot(v1)
     test_v = Vector3D.from_list([0.000000, 1.000000, 0.000000, 1.000000])
     assert real_v.nearly_equal(test_v)
     # 180 degrees
     real_v = Matrix3D.get_rot_z_matrix(math.pi).v_dot(v1)
     test_v = Vector3D.from_list([-1.000000, 0.000000, 0.000000, 1.000000])
     assert real_v.nearly_equal(test_v)
     # 270 degrees
     real_v = Matrix3D.get_rot_z_matrix(math.pi + math.pi/2).v_dot(v1)
     test_v = Vector3D.from_list([0.000000, -1.000000, 0.000000, 1.000000])
     assert real_v.nearly_equal(test_v)
     # 360 degrees
     real_v = Matrix3D.get_rot_z_matrix(2 * math.pi).v_dot(v1)
     test_v = Vector3D.from_list([1.000000, 0.000000, 0.000000, 1.000000])
     assert real_v.nearly_equal(test_v)
     # rotate around Y-Axis about 180 degrees
     real_v = Matrix3D.get_rot_y_matrix(math.pi).v_dot(v1)
     test_v = Vector3D.from_list([-1.000000, 0.000000, 0.000000, 1.000000])
     assert real_v.nearly_equal(test_v)
     # rotate y:90 and x:90 -> (0, 1, 0, 1)
     real_v = Matrix3D.get_rot_y_matrix(math.pi/2).v_dot(v1)
     test_v = Vector3D.from_list([0.000000, 0.000000, -1.000000, 1.000000])
     assert real_v.nearly_equal(test_v)
     real_v = Matrix3D.get_rot_x_matrix(math.pi/2).v_dot(real_v)
     test_v = Vector3D.from_list([0.000000, 1.000000, 0.000000, 1.000000])
     assert real_v.nearly_equal(test_v)
     # and this is the combined version
     rot_y = Matrix3D.get_rot_y_matrix(math.pi/2)
     print "rotation around y:\n", rot_y
     rot_x = Matrix3D.get_rot_x_matrix(math.pi/2)
     print "rotation around x:\n", rot_x
     rot_z = Matrix3D.get_rot_z_matrix(math.pi/2)
     print "rotation around z:\n", rot_z
     rot_m = rot_x.dot(rot_y.dot(rot_z))
     print "combined rotation matrix:\n", rot_m
     real_v = rot_m.v_dot(v1)
     print "resulting vector:", real_v
     test_v = Vector3D.from_list([0.000000, 1.000000, 0.000000, 1.000000])
     assert real_v.nearly_equal(test_v)
예제 #4
0
    def __projectm(vector, center):
        """
        apply 
        clipping matrix
        camera transformation matrix
        camera rotation matrix

        TODO: finally sort out vertices out of clipping area

        and return tuple on 2D Coordinates
        taken from : http://stackoverflow.com/questions/724219/how-to-convert-a-3d-point-into-2d-perspective-projection
        """
        clipping_m = Matrix3D([
            [FOV * ASPECT_RATIO, 0.0, 0.0                            , 0.0],
            [0.0               , FOV, 0.0                            , 0.0],
            [0.0               , 0.0, (far + near) / (far-near)      , (2.0 * near * far) / (near-far)],
            [0.0               , 0.0, 1.0                            , 0.0]
        ])
        cam_translation_m = Matrix3D.get_shift_matrix(0, 0, -10)
        cam_rot_m = Matrix3D.get_rot_y_matrix(Y_ANGLE).dot(Matrix3D.get_rot_x_matrix(X_ANGLE))
        # mind the order !!
        new_vector = clipping_m.dot(cam_translation_m.dot(cam_rot_m)).v_dot(vector)
        new_x = center[0] + new_vector.x * 16.0 / ( 2.0 * new_vector.z) + 8.0
        new_y = center[1] + new_vector.y * 9.0 / ( 2.0 * new_vector.z) + 4.5
        return new_x, new_y
예제 #5
0
    def __projectm(vector, center):
        """
        apply 
        clipping matrix
        camera transformation matrix
        camera rotation matrix

        TODO: finally sort out vertices out of clipping area

        and return tuple on 2D Coordinates
        taken from : http://stackoverflow.com/questions/724219/how-to-convert-a-3d-point-into-2d-perspective-projection
        """
        clipping_m = Matrix3D([[FOV * ASPECT_RATIO, 0.0, 0.0, 0.0],
                               [0.0, FOV, 0.0, 0.0],
                               [
                                   0.0, 0.0, (far + near) / (far - near),
                                   (2.0 * near * far) / (near - far)
                               ], [0.0, 0.0, 1.0, 0.0]])
        cam_translation_m = Matrix3D.get_shift_matrix(0, 0, -10)
        cam_rot_m = Matrix3D.get_rot_y_matrix(Y_ANGLE).dot(
            Matrix3D.get_rot_x_matrix(X_ANGLE))
        # mind the order !!
        new_vector = clipping_m.dot(
            cam_translation_m.dot(cam_rot_m)).v_dot(vector)
        new_x = center[0] + new_vector.x * 16.0 / (2.0 * new_vector.z) + 8.0
        new_y = center[1] + new_vector.y * 9.0 / (2.0 * new_vector.z) + 4.5
        return new_x, new_y
예제 #6
0
def get_pyramid_mesh():
    faces = []
    # front
    tri = Face3D(get_triangle_points())
    #t = Matrix3D.get_shift_matrix(0, 0, 1).dot(Matrix3D.get_rot_x_matrix(-math.pi/4))
    face = tri.transform(Matrix3D.get_rot_x_matrix(-math.pi / 4))
    face = face.transform(Matrix3D.get_shift_matrix(0, 0, 1))
    faces.append(face)
    # back
    face = tri.transform(Matrix3D.get_rot_x_matrix(math.pi / 4))
    face = face.transform(Matrix3D.get_shift_matrix(0, 0, -1))
    faces.append(face)
    # left
    face = tri.transform(Matrix3D.get_rot_x_matrix(-math.pi / 4))
    face = face.transform(Matrix3D.get_rot_y_matrix(-math.pi / 2))
    face = face.transform(Matrix3D.get_shift_matrix(1, 0, 0))
    faces.append(face)
    # right
    face = tri.transform(Matrix3D.get_rot_x_matrix(-math.pi / 4))
    face = face.transform(Matrix3D.get_rot_y_matrix(math.pi / 2))
    face = face.transform(Matrix3D.get_shift_matrix(-1, 0, 0))
    faces.append(face)
    return Mesh3D(faces)
예제 #7
0
def get_cube_mesh():
    # a cube Mesh consist of six Faces
    # left
    faces = []
    rec = Face3D(get_rectangle_points())
    t = Matrix3D.get_shift_matrix(-1, 0, 0).dot(Matrix3D.get_rot_y_matrix(math.pi/2))
    faces.append(rec.transform(t))
    # right
    t = Matrix3D.get_shift_matrix(1, 0, 0).dot(Matrix3D.get_rot_y_matrix(math.pi/2))
    faces.append(rec.transform(t))
    # bottom
    t = Matrix3D.get_shift_matrix(0, -1, 0).dot(Matrix3D.get_rot_x_matrix(math.pi/2))
    faces.append(rec.transform(t))
    # top
    t = Matrix3D.get_shift_matrix(0, 1, 0).dot(Matrix3D.get_rot_x_matrix(math.pi/2))
    faces.append(rec.transform(t))
    # front
    t = Matrix3D.get_shift_matrix(0, 0, -1)
    faces.append(rec.transform(t))
    # back
    t = Matrix3D.get_shift_matrix(0, 0, 1)
    faces.append(rec.transform(t))
    return Mesh3D(faces)
예제 #8
0
def get_pyramid_mesh():
    faces = []
    # front
    tri = Face3D(get_triangle_points())
    #t = Matrix3D.get_shift_matrix(0, 0, 1).dot(Matrix3D.get_rot_x_matrix(-math.pi/4))
    face = tri.transform(Matrix3D.get_rot_x_matrix(-math.pi/4))
    face = face.transform(Matrix3D.get_shift_matrix(0, 0, 1))
    faces.append(face)
    # back
    face = tri.transform(Matrix3D.get_rot_x_matrix(math.pi/4))
    face = face.transform(Matrix3D.get_shift_matrix(0, 0, -1))
    faces.append(face)
    # left
    face = tri.transform(Matrix3D.get_rot_x_matrix(-math.pi/4))
    face = face.transform(Matrix3D.get_rot_y_matrix(-math.pi/2))
    face = face.transform(Matrix3D.get_shift_matrix(1, 0, 0))
    faces.append(face)
    # right
    face = tri.transform(Matrix3D.get_rot_x_matrix(-math.pi/4))
    face = face.transform(Matrix3D.get_rot_y_matrix(math.pi/2))
    face = face.transform(Matrix3D.get_shift_matrix(-1, 0, 0))
    faces.append(face)
    return Mesh3D(faces)