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