feat: add camera class
This commit is contained in:
43
src/camera.py
Normal file
43
src/camera.py
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
from src.vec import Vec
|
||||||
|
|
||||||
|
|
||||||
|
class Camera:
|
||||||
|
UNIT_RATIO = 150
|
||||||
|
|
||||||
|
def __init__(self) -> None:
|
||||||
|
self.pos: Vec = Vec()
|
||||||
|
self.up: Vec = Vec(0, -1)
|
||||||
|
self.size: Vec = Vec(600, 600)
|
||||||
|
self.zoom: float = 1
|
||||||
|
|
||||||
|
def set_pos(self, pos: Vec):
|
||||||
|
self.pos = pos
|
||||||
|
|
||||||
|
def set_direction(self, up: Vec):
|
||||||
|
self.up = up.normalized
|
||||||
|
|
||||||
|
def set_size(self, size: Vec):
|
||||||
|
self.size = size
|
||||||
|
|
||||||
|
@property
|
||||||
|
def center(self) -> Vec:
|
||||||
|
return self.size / 2
|
||||||
|
|
||||||
|
def screen2world(self, screen_pos: Vec) -> Vec:
|
||||||
|
delta: Vec = screen_pos - self.center
|
||||||
|
delta /= self.zoom * self.UNIT_RATIO
|
||||||
|
dx: float = delta.x
|
||||||
|
dy: float = delta.y
|
||||||
|
|
||||||
|
v1: Vec = self.up.perp * dx
|
||||||
|
v2: Vec = self.up * dy
|
||||||
|
|
||||||
|
return self.pos + v1 + v2
|
||||||
|
|
||||||
|
def world2screen(self, world_pos: Vec) -> Vec:
|
||||||
|
delta: Vec = world_pos - self.pos
|
||||||
|
dy: float = -delta.dot(self.up)
|
||||||
|
dx: float = delta.dot(self.up.perp)
|
||||||
|
screen_delta: Vec = Vec(dx, dy) * self.zoom * self.UNIT_RATIO
|
||||||
|
screen_pos: Vec = self.center + screen_delta
|
||||||
|
return screen_pos
|
||||||
Reference in New Issue
Block a user