Example #1
0
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)
Example #2
0
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)