60 lines
1.2 KiB
Python
60 lines
1.2 KiB
Python
from dataclasses import dataclass
|
|
from tools import *
|
|
|
|
import numpy as np
|
|
|
|
class Camera:
|
|
def __init__(self, r1 : np.array, phi : float, theta : float):
|
|
assert r1.shape == (3,)
|
|
|
|
self.r1 = r1
|
|
self.r1_temp = 0, 0, 0
|
|
|
|
self.camThetaBase = 0
|
|
self.camPhiBase = 0
|
|
|
|
self.camTheta = theta
|
|
self.camPhi = phi
|
|
|
|
r1_temp = self.rotateCam()
|
|
self.camMat = self.getCam(r1_temp)
|
|
|
|
|
|
def getCam(self, r1):
|
|
camF = normalize(r1)
|
|
camR = normalize(cross(vec3(0, 1, 0), camF))
|
|
camU = cross(camF, camR)
|
|
|
|
mat_ = mat3(camR, camU, camF)
|
|
return mat_
|
|
|
|
def rotateCam(self):
|
|
yz = vec2(self.r1[1], self.r1[2])
|
|
new_yz = pR(yz, self.camTheta + self.camThetaBase)
|
|
xz = vec2(self.r1[0], new_yz[1])
|
|
new_xz = pR(xz, self.camPhi + self.camPhiBase)
|
|
|
|
vec = vec3(new_xz[0], new_yz[0], new_xz[1])
|
|
|
|
|
|
return vec
|
|
|
|
@staticmethod
|
|
def mouseToAngle(u_mouse, u_resolution):
|
|
m = (u_mouse - u_resolution / 2) / u_resolution
|
|
return m
|
|
|
|
def update(self):
|
|
self.r1_temp = self.rotateCam()
|
|
self.camMat = self.getCam(self.r1_temp)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|