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