def create(self, objDest): vertices = [] faces = [] # read file and get rid of '\n' at the end of each line. with open(objDest) as f: lines = f.readlines() lines = [line.strip() for line in lines] # parse vertices for line in lines: if line != '' and line[0] is 'v': vertexLine = line.split(' ') # create vertex vertices.append( Vec3D(float(vertexLine[1]), float(vertexLine[2]), float(vertexLine[3]), 1.0)) # parse faces for line in lines: if line != '' and line[0] is 'f': # find vertex indices faceElements = [int(e) for e in line.split(' ')[1:]] faceVertices = [] for faceElement in faceElements: faceVertices.append(vertices[faceElement - 1].clone()) # create face with color faces.append(Face3D(faceVertices, [0.6, 0.6, 0.8])) # create object with faces return Model3D( Transform(Vec3D(0.0, 0.0, 0.0, 1.0), Vec3D(0.0, 0.0, 0.0, 1.0), Vec3D(1.0, 1.0, 1.0, 1.0)), faces)
def create(self, radius=1.0, sectorCount=12, stackCount=12): # generate vertices vertices = [] sectorStep = 2 * math.pi / sectorCount stackStep = math.pi / stackCount for i in range(stackCount + 1): stackAngle = math.pi / 2 - i * stackStep xy = radius * math.cos(stackAngle) z = radius * math.sin(stackAngle) for j in range(sectorCount + 1): sectorAngle = j * sectorStep x = xy * math.cos(sectorAngle) y = xy * math.sin(sectorAngle) vertices.append(Vec3D(x, y, z, 1.0)) # generate faces faces = [] for i in range(stackCount): k1 = i * (sectorCount + 1) k2 = k1 + sectorCount + 1 for j in range(sectorCount + 1): if i != 0: faces.append([k1, k2, k1 + 1]) if i != (stackCount - 1): faces.append([k1 + 1, k2, k2 + 1]) k1 += 1 k2 += 1 # generate face colors faceColors = [] for i in range(len(faces)): faceColors.append([0.8, 0.8, 1.0]) return Model3D( Transform(Vec3D(0.0, 0.0, 0.0, 1.0), Vec3D(0.0, 0.0, 0.0, 1.0), Vec3D(1.0, 1.0, 1.0, 1.0)), faces)
def subdivide(self): newFaces = [] for face in self.faces: # calculate center of faces centerOfFace = Vec3D(0.0, 0.0, 0.0, 1.0) for vertex in face.vertices: centerOfFace.add(vertex) centerOfFace.scale(1.0/len(face.vertices)) # calculate midpoints for each edge midPoints = [] for vertexIndex in range(len(face.vertices)): # find 2 vertices vertex1 = face.vertices[vertexIndex] vertex2 = face.vertices[0 if vertexIndex + 1 >= len(face.vertices) else vertexIndex + 1] # find average of position midPoint = vertex1.clone() # referance fix midPoint.add(vertex2) midPoint.scale(0.5) midPoints.append(midPoint) # the number of new faces is equal to number of vertices for vertexIndex in range(len(face.vertices)): # create faces with clockwise order # example of a square subdivision # v: vertex, m: midpoint, c: center of face # face1 vertices -> [v0, m01, c, m30] # face2 vertices -> [v1, m12, c, m01] # face3 vertices -> [v2, m23, c, m12] # face4 vertices -> [v3, m30, c, m23] newVertices = [face.vertices[vertexIndex], midPoints[vertexIndex], centerOfFace, midPoints[vertexIndex-1]] newFaces.append(Face3D(newVertices, face.color[:])) self.faces = newFaces
def reset(self): self.position = Vec3D(0.0, 0.0, 0.0, 1.0) self.rotation = Vec3D(0.0, 0.0, 0.0, 1.0) self.scaler = Vec3D(1.0, 1.0, 1.0, 1.0) self.finalMatrix = Mat3D.identityMatrix()
def scale(self, x, y, z): self.scaler.add(Vec3D(x, y, z, 1.0)) self.applyTransformationMatrix(Mat3D.scalingMatrix(x, y, z))
def translate(self, x, y, z): self.position.add(Vec3D(x, y, z, 1.0)) self.applyTransformationMatrix(Mat3D.translationMatrix(x, y, z))
def setScaler(self, x, y, z): self.scaler = Vec3D(x, y, z, 1.0)
def setRotation(self, x, y, z): self.rotation = Vec3D(x, y, z, 1.0)
def setPosition(self, x, y, z): self.position = Vec3D(x, y, z, 1.0)
def multiplyVector(self, vec3d): return Vec3D(self.matrix[0][0] * vec3d.x + self.matrix[0][1] * vec3d.y + self.matrix[0][2] * vec3d.z + self.matrix[0][3] * vec3d.w, self.matrix[1][0] * vec3d.x + self.matrix[1][1] * vec3d.y + self.matrix[1][2] * vec3d.z + self.matrix[1][3] * vec3d.w, self.matrix[2][0] * vec3d.x + self.matrix[2][1] * vec3d.y + self.matrix[2][2] * vec3d.z + self.matrix[2][3] * vec3d.w, 1.0)
def create(self, x, y, z): # creates and translates the camera camera = Camera(Transform(Vec3D(0.0, 0.0, 0.0, 1.0), Vec3D(0.0, 0.0, 0.0, 1.0), Vec3D(1.0, 1.0, 1.0, 1.0))) camera.transform.translate(x, y, z) return camera