def update(self): """ called on every frame apply transformation matrix and project every polygon to 2d for color avg_z function is used polygons are sorted on avg_z value finally painting on surface is called """ # Clock vector vector = Matrix3D.get_rot_z_matrix(self.angle).v_dot(self.vector) # projected = self.__project(self.vector, self.center) projected = self.__projectm(vector, self.center) pygame.draw.polygon(self.surface, pygame.Color(255,255,255,0), (self.center, projected), 1) # Cube mesh = self.model.transform(Matrix3D.get_rot_z_matrix(self.angle)) #mesh = mesh.transform(Matrix3D.get_rot_x_matrix(self.angle)) mesh = mesh.transform(Matrix3D.get_scale_matrix(SCALE, SCALE, SCALE)) mesh = mesh.transform(Matrix3D.get_shift_matrix(X_SHIFT, Y_SHIFT, Z_SHIFT)) for face in mesh: vertices = [self.__projectm(vertice, self.center) for vertice in face] pygame.draw.polygon(self.surface, pygame.Color(255,255,255,0), vertices, 1) self.angle += self.angle_step # axis vectors pygame.draw.polygon(self.surface, pygame.Color(255,0,0,0), (self.center, self.__projectm(self.x_axis, self.center)), 1) pygame.draw.polygon(self.surface, pygame.Color(0,255,0,0), (self.center, self.__projectm(self.y_axis, self.center)), 1) pygame.draw.polygon(self.surface, pygame.Color(0,0,255,0), (self.center, self.__projectm(self.z_axis, self.center)), 1)
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 test_m_transforms(self): v = Vector3D(1, 1, 0, 1) m = Matrix3D.get_shift_matrix(5, 5, 0) print "shift matrix:\n", m print "shifted vector:", m.v_dot(v) m = Matrix3D.get_scale_matrix(2, 2, 0) print "scale matrix:\n", m print "scaled vector:", m.v_dot(v)
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)
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 update(self): """ called on every frame apply transformation matrix and project every polygon to 2d for color avg_z function is used polygons are sorted on avg_z value finally painting on surface is called """ # Clock vector vector = Matrix3D.get_rot_z_matrix(self.angle).v_dot(self.vector) # projected = self.__project(self.vector, self.center) projected = self.__projectm(vector, self.center) pygame.draw.polygon(self.surface, pygame.Color(255, 255, 255, 0), (self.center, projected), 1) # Cube mesh = self.model.transform(Matrix3D.get_rot_z_matrix(self.angle)) #mesh = mesh.transform(Matrix3D.get_rot_x_matrix(self.angle)) mesh = mesh.transform(Matrix3D.get_scale_matrix(SCALE, SCALE, SCALE)) mesh = mesh.transform( Matrix3D.get_shift_matrix(X_SHIFT, Y_SHIFT, Z_SHIFT)) for face in mesh: vertices = [ self.__projectm(vertice, self.center) for vertice in face ] pygame.draw.polygon(self.surface, pygame.Color(255, 255, 255, 0), vertices, 1) self.angle += self.angle_step # axis vectors pygame.draw.polygon( self.surface, pygame.Color(255, 0, 0, 0), (self.center, self.__projectm(self.x_axis, self.center)), 1) pygame.draw.polygon( self.surface, pygame.Color(0, 255, 0, 0), (self.center, self.__projectm(self.y_axis, self.center)), 1) pygame.draw.polygon( self.surface, pygame.Color(0, 0, 255, 0), (self.center, self.__projectm(self.z_axis, self.center)), 1)
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)