Files
rally-racer/src/camera.py

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