2024-04-09 17:24:02 +02:00
|
|
|
import pygame as pg
|
2024-04-09 13:05:50 +02:00
|
|
|
import numpy as np
|
|
|
|
|
from math import *
|
2024-04-09 17:24:02 +02:00
|
|
|
import src.constants as cn
|
|
|
|
|
import transformation as tm
|
|
|
|
|
from src.object_builder import ObjectBuilder
|
|
|
|
|
from src.object import Object
|
|
|
|
|
from src.camera import Camera
|
2024-04-09 13:05:50 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class App:
|
2024-04-09 17:24:02 +02:00
|
|
|
clock: pg.time.Clock
|
|
|
|
|
screen: pg.Surface
|
|
|
|
|
camera: Camera
|
|
|
|
|
objects = list[Object]
|
2024-04-09 13:05:50 +02:00
|
|
|
|
|
|
|
|
def __init__(self):
|
2024-04-09 17:24:02 +02:00
|
|
|
self.clock = pg.time.Clock()
|
|
|
|
|
self.screen = pg.display.set_mode(cn.WINDOW_SIZE)
|
|
|
|
|
self.objects = []
|
|
|
|
|
self.camera = Camera(-5, 6, -55)
|
|
|
|
|
self.create_objects()
|
|
|
|
|
|
|
|
|
|
def create_objects(self):
|
|
|
|
|
obj_builder = ObjectBuilder()
|
|
|
|
|
va = obj_builder.add_vertex(-1, -1, 1)
|
|
|
|
|
vb = obj_builder.add_vertex( 1, -1, 1)
|
|
|
|
|
vc = obj_builder.add_vertex( 1, 1, 1)
|
|
|
|
|
vd = obj_builder.add_vertex(-1, 1, 1)
|
|
|
|
|
ve = obj_builder.add_vertex(-1, -1, -1)
|
|
|
|
|
vf = obj_builder.add_vertex( 1, -1, -1)
|
|
|
|
|
vg = obj_builder.add_vertex( 1, 1, -1)
|
|
|
|
|
vh = obj_builder.add_vertex(-1, 1, -1)
|
|
|
|
|
obj_builder.add_vertices_connection(va, vb)
|
|
|
|
|
obj_builder.add_vertices_connection(va, vd)
|
|
|
|
|
obj_builder.add_vertices_connection(vd, vc)
|
|
|
|
|
obj_builder.add_vertices_connection(vb, vc)
|
|
|
|
|
obj_builder.add_vertices_connection(ve, vf)
|
|
|
|
|
obj_builder.add_vertices_connection(ve, vh)
|
|
|
|
|
obj_builder.add_vertices_connection(vh, vg)
|
|
|
|
|
obj_builder.add_vertices_connection(vf, vg)
|
|
|
|
|
obj_builder.add_vertices_connection(va, ve)
|
|
|
|
|
obj_builder.add_vertices_connection(vb, vf)
|
|
|
|
|
obj_builder.add_vertices_connection(vd, vh)
|
|
|
|
|
obj_builder.add_vertices_connection(vc, vg)
|
|
|
|
|
self.objects.append(obj_builder.build())
|
2024-04-09 13:05:50 +02:00
|
|
|
|
|
|
|
|
def main(self):
|
|
|
|
|
self.setup()
|
|
|
|
|
while True:
|
2024-04-09 17:24:02 +02:00
|
|
|
self.clock.tick(cn.FPS)
|
|
|
|
|
for event in pg.event.get():
|
2024-04-09 13:05:50 +02:00
|
|
|
self.handle_event(event)
|
|
|
|
|
self.update()
|
|
|
|
|
|
2024-04-09 17:24:02 +02:00
|
|
|
def handle_event(self, event: pg.event.Event):
|
2024-04-09 13:05:50 +02:00
|
|
|
match event.type:
|
2024-04-09 17:24:02 +02:00
|
|
|
case pg.QUIT:
|
2024-04-09 13:05:50 +02:00
|
|
|
self.quit()
|
2024-04-09 17:24:02 +02:00
|
|
|
case pg.KEYDOWN:
|
2024-04-09 13:05:50 +02:00
|
|
|
match event.key:
|
2024-04-09 17:24:02 +02:00
|
|
|
case pg.K_ESCAPE:
|
2024-04-09 13:05:50 +02:00
|
|
|
self.quit()
|
2024-04-09 17:24:02 +02:00
|
|
|
case pg.K_s:
|
|
|
|
|
self.camera.move_backward()
|
|
|
|
|
case pg.K_w:
|
|
|
|
|
self.camera.move_forward()
|
|
|
|
|
case pg.K_d:
|
|
|
|
|
self.camera.move_right()
|
|
|
|
|
case pg.K_a:
|
|
|
|
|
self.camera.move_left()
|
|
|
|
|
case pg.K_SPACE:
|
|
|
|
|
self.camera.move_up()
|
|
|
|
|
case pg.K_LSHIFT:
|
|
|
|
|
self.camera.move_down()
|
2024-04-09 13:05:50 +02:00
|
|
|
|
|
|
|
|
def transform(self, transformation_matrix: np.matrix):
|
|
|
|
|
for key in self.points.keys():
|
|
|
|
|
point = self.points[key]
|
|
|
|
|
self.points[key] = np.dot(transformation_matrix, point.reshape((3,1)))
|
|
|
|
|
|
|
|
|
|
def setup(self):
|
2024-04-09 17:24:02 +02:00
|
|
|
pg.display.set_caption("Virtual camera")
|
2024-04-09 13:05:50 +02:00
|
|
|
|
|
|
|
|
def update(self):
|
|
|
|
|
self.screen.fill((255,255,255))
|
2024-04-09 17:24:02 +02:00
|
|
|
for obj in self.objects:
|
|
|
|
|
obj.draw()
|
|
|
|
|
pg.display.update()
|
|
|
|
|
|
|
|
|
|
def quit(self):
|
|
|
|
|
pg.quit()
|
|
|
|
|
exit()
|
|
|
|
|
|
2024-04-09 13:05:50 +02:00
|
|
|
|
2024-04-09 17:24:02 +02:00
|
|
|
"""
|
2024-04-09 13:05:50 +02:00
|
|
|
projected_points = {}
|
|
|
|
|
|
|
|
|
|
for point_key in self.points.keys():
|
|
|
|
|
point = self.points[point_key]
|
|
|
|
|
projected_2D = np.dot(self.projection_matrix, point.reshape((3, 1)))
|
|
|
|
|
|
|
|
|
|
x = int(projected_2D[0][0] * self.scale) + (1280 / 2)
|
|
|
|
|
y = int(projected_2D[1][0] * self.scale) + (720 / 2)
|
|
|
|
|
|
2024-04-09 17:24:02 +02:00
|
|
|
pg.draw.circle(self.screen, (255, 0, 0), (x, y), 5)
|
2024-04-09 13:05:50 +02:00
|
|
|
|
|
|
|
|
projected_points[point_key] = (x, y)
|
|
|
|
|
|
|
|
|
|
for line in self.lines:
|
|
|
|
|
point_a = projected_points[line[0]]
|
|
|
|
|
point_b = projected_points[line[1]]
|
2024-04-09 17:24:02 +02:00
|
|
|
pg.draw.line(self.screen, (0,0,0), point_a, point_b)
|
|
|
|
|
"""
|