def rasterTriangles(triangles: list[Triangle]): for x in triangles: triProjected = Triangle(Vec3d(1, 1, 1), Vec3d(1, 1, 1), Vec3d(1, 1, 1)) # Calculate normal vector for drawing of faces normal = Vec3d(0, 0, 0) line1 = Vec3d(0, 0, 0) line2 = Vec3d(0, 0, 0) line1.setX(x.getV1().getX() - x.getV0().getX()) line1.setY(x.getV1().getY() - x.getV0().getY()) line1.setZ(x.getV1().getZ() - x.getV0().getZ()) line2.setX(x.getV2().getX() - x.getV0().getX()) line2.setY(x.getV2().getY() - x.getV0().getY()) line2.setZ(x.getV2().getZ() - x.getV0().getZ()) normal.setX(line1.getY() * line2.getZ() - line1.getZ() * line2.getY()) normal.setY(line1.getZ() * line2.getX() - line1.getX() * line2.getZ()) normal.setZ(line1.getX() * line2.getY() - line1.getY() * line2.getX()) length = math.sqrt( math.pow(normal.getX(), 2) + math.pow(normal.getY(), 2) + math.pow(normal.getZ(), 2)) normal.setX(normal.getX() / length) normal.setY(normal.getY() / length) normal.setZ(normal.getZ() / length) if (normal.getX() * (x.getV0().getX() - vCamera.getX()) + normal.getY() * (x.getV0().getY() - vCamera.getY()) + normal.getZ() * (x.getV0().getZ() - vCamera.getZ()) < 0): # Illumination light_direction = Vec3d(0, 0, -1) length = math.sqrt( math.pow(light_direction.getX(), 2) + math.pow(light_direction.getY(), 2) + math.pow(light_direction.getZ(), 2)) light_direction.setX(light_direction.getX() / length) light_direction.setY(light_direction.getY() / length) light_direction.setZ(light_direction.getZ() / length) dp = normal.getX() * light_direction.getX() + normal.getY( ) * light_direction.getY() + normal.getZ() * light_direction.getZ( ) triProjected.setDp(dp) # Project triangles from 3D --> 2D multiplyMatrixVector(x.getV0(), triProjected.getV0(), matProj) multiplyMatrixVector(x.getV1(), triProjected.getV1(), matProj) multiplyMatrixVector(x.getV2(), triProjected.getV2(), matProj) # Scale into view triProjected.getV0().setX(triProjected.getV0().getX() + 1.0) triProjected.getV0().setY(triProjected.getV0().getY() + 1.0) triProjected.getV1().setX(triProjected.getV1().getX() + 1.0) triProjected.getV1().setY(triProjected.getV1().getY() + 1.0) triProjected.getV2().setX(triProjected.getV2().getX() + 1.0) triProjected.getV2().setY(triProjected.getV2().getY() + 1.0) triProjected.getV0().setX(triProjected.getV0().getX() * float(0.5) * screen_width) triProjected.getV0().setY(triProjected.getV0().getY() * float(0.5) * screen_height) triProjected.getV1().setX(triProjected.getV1().getX() * float(0.5) * screen_width) triProjected.getV1().setY(triProjected.getV1().getY() * float(0.5) * screen_height) triProjected.getV2().setX(triProjected.getV2().getX() * float(0.5) * screen_width) triProjected.getV2().setY(triProjected.getV2().getY() * float(0.5) * screen_height) pygame.draw.polygon( screen, (255 * triProjected.getDp(), 255 * triProjected.getDp(), 255 * triProjected.getDp()), [(triProjected.getV0().getX(), triProjected.getV0().getY()), (triProjected.getV1().getX(), triProjected.getV1().getY()), (triProjected.getV2().getX(), triProjected.getV2().getY()), (triProjected.getV0().getX(), triProjected.getV0().getY())], 0) # Draw lines of triangles, for debugging pygame.draw.line( screen, (0, 0, 0), (triProjected.getV0().getX(), triProjected.getV0().getY()), (triProjected.getV1().getX(), triProjected.getV1().getY()), 3) pygame.draw.line( screen, (0, 0, 0), (triProjected.getV1().getX(), triProjected.getV1().getY()), (triProjected.getV2().getX(), triProjected.getV2().getY()), 3) pygame.draw.line( screen, (0, 0, 0), (triProjected.getV2().getX(), triProjected.getV2().getY()), (triProjected.getV0().getX(), triProjected.getV0().getY()), 3)
def drawObject(mesh, xOffset=0, yOffset=0, zOffset=0, vCamera=Vec3d(0, 0, 0)): trianglesToRaster: list[Triangle] = [] for tri in mesh.getMesh(): triTranslated = Triangle(Vec3d(1, 1, 1), Vec3d(1, 1, 1), Vec3d(1, 1, 1)) triRotatedZ = Triangle(Vec3d(1, 1, 1), Vec3d(1, 1, 1), Vec3d(1, 1, 1)) triRotatedZX = Triangle(Vec3d(1, 1, 1), Vec3d(1, 1, 1), Vec3d(1, 1, 1)) # Rotate object multiplyMatrixVector(tri.getV0(), triRotatedZ.getV0(), matRotZ) multiplyMatrixVector(tri.getV1(), triRotatedZ.getV1(), matRotZ) multiplyMatrixVector(tri.getV2(), triRotatedZ.getV2(), matRotZ) multiplyMatrixVector(triRotatedZ.getV0(), triRotatedZX.getV0(), matRotY) multiplyMatrixVector(triRotatedZ.getV1(), triRotatedZX.getV1(), matRotY) multiplyMatrixVector(triRotatedZ.getV2(), triRotatedZX.getV2(), matRotY) # Add coordinate offset triTranslated = triRotatedZX triTranslated.getV0().setZ(triRotatedZX.getV0().getZ() + zOffset + vCamera.getZ()) triTranslated.getV1().setZ(triRotatedZX.getV1().getZ() + zOffset + vCamera.getZ()) triTranslated.getV2().setZ(triRotatedZX.getV2().getZ() + zOffset + vCamera.getZ()) triTranslated.getV0().setY(triRotatedZX.getV0().getY() + yOffset + vCamera.getY()) triTranslated.getV1().setY(triRotatedZX.getV1().getY() + yOffset + vCamera.getY()) triTranslated.getV2().setY(triRotatedZX.getV2().getY() + yOffset + vCamera.getY()) triTranslated.getV0().setX(triRotatedZX.getV0().getX() + xOffset + vCamera.getX()) triTranslated.getV1().setX(triRotatedZX.getV1().getX() + xOffset + vCamera.getX()) triTranslated.getV2().setX(triRotatedZX.getV2().getX() + xOffset + vCamera.getX()) trianglesToRaster.append(triTranslated) trianglesToRaster.sort(key=lambda x: ( (x.getV0().getZ() + x.getV1().getZ() + x.getV2().getZ()) / 3), reverse=True) rasterTriangles(trianglesToRaster)