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)
Example #3
0
    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
Example #4
0
 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()
Example #5
0
 def scale(self, x, y, z):
     self.scaler.add(Vec3D(x, y, z, 1.0))
     self.applyTransformationMatrix(Mat3D.scalingMatrix(x, y, z))
Example #6
0
 def translate(self, x, y, z):
     self.position.add(Vec3D(x, y, z, 1.0))
     self.applyTransformationMatrix(Mat3D.translationMatrix(x, y, z))
Example #7
0
 def setScaler(self, x, y, z):
     self.scaler = Vec3D(x, y, z, 1.0)
Example #8
0
 def setRotation(self, x, y, z):
     self.rotation = Vec3D(x, y, z, 1.0)
Example #9
0
 def setPosition(self, x, y, z):
     self.position = Vec3D(x, y, z, 1.0)
Example #10
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