48 lines
1.2 KiB
Python
48 lines
1.2 KiB
Python
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
|
|
|
|
@property
|
|
def car_screen_pos(self) -> Vec:
|
|
return Vec(self.size.x / 2, 3 * self.size.y / 4)
|
|
|
|
def screen2world(self, screen_pos: Vec) -> Vec:
|
|
delta: Vec = screen_pos - self.car_screen_pos
|
|
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.car_screen_pos + screen_delta
|
|
return screen_pos
|