Files
3DRenderer/3d_renderer/object.py

39 lines
1.4 KiB
Python
Raw Normal View History

2024-04-20 22:27:45 +02:00
import numpy as np
import pygame as pg
import os
from src.vertex import Vertex
2024-04-09 17:24:02 +02:00
class Object:
vertices: list[Vertex]
2024-04-20 22:27:45 +02:00
lines: list[(Vertex, Vertex)]
2024-04-09 17:24:02 +02:00
def __init__(self, vertices: list[Vertex], lines: list[(Vertex, Vertex)]):
self.vertices = vertices
self.lines = lines
2024-04-20 22:27:45 +02:00
def attach_renderer(self, renderer):
self.__renderer = renderer
def draw(self):
vertices_matrix = np.array([[v.x, v.y, v.z, 1.0] for v in self.vertices])
vertices_matrix = vertices_matrix @ self.__renderer.camera.camera_matrix()
2024-04-23 14:53:26 +02:00
hidden_vertices = [row[0, 2] <= 0 for row in vertices_matrix]
2024-04-20 22:27:45 +02:00
vertices_matrix = vertices_matrix @ self.__renderer.camera.projection_matrix()
vertices_matrix /= vertices_matrix[:, -1].reshape(-1, 1)
2024-04-23 12:18:18 +02:00
vertices_matrix = vertices_matrix @ self.__renderer.camera.screen_matrix()
2024-04-20 22:27:45 +02:00
vertices_matrix = vertices_matrix[:, :2]
vertices = {}
for i in range(len(self.vertices)):
2024-04-23 14:53:26 +02:00
if not hidden_vertices[i]:
vertices[self.vertices[i]] = vertices_matrix[i].tolist()[0]
2024-04-20 22:27:45 +02:00
for v in vertices.values():
pg.draw.circle(self.__renderer.screen, pg.Color("black"), v, 2)
for l in self.lines:
2024-04-23 14:53:26 +02:00
v1 = vertices.get(l[0])
v2 = vertices.get(l[1])
if (v1 is None or v2 is None):
continue
2024-04-20 22:27:45 +02:00
pg.draw.line(self.__renderer.screen, pg.Color("black"), v1, v2, 1)