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)
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)
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)
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
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
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)
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)
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)