-
Notifications
You must be signed in to change notification settings - Fork 1
/
Camera.py
80 lines (65 loc) · 2.84 KB
/
Camera.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
from pyrr import Vector3, Matrix44, vector, vector3
from math import sin, cos, radians
class Camera:
def __init__(self):
self.camera_pos = Vector3([0.0, 0.0, 1000.0])
self.camera_front = Vector3([0.0, 0.0, -1.0])
self.camera_up = Vector3([0.0, 1.0, 0.0])
self.camera_right = Vector3([1.0, 0.0, 0.0])
self.mouse_sensitivity = 0.25
self.yaw = -90.0
self.pitch = 0.0
def get_view_matrix(self):
return self.look_at(self.camera_pos, self.camera_pos + self.camera_front, self.camera_up)
def process_keyboard(self, direction, velocity):
if direction == "FORWARD":
self.camera_pos += self.camera_front * velocity
if direction == "BACKWARD":
self.camera_pos -= self.camera_front * velocity
if direction == "LEFT":
self.camera_pos -= self.camera_right * velocity
if direction == "RIGHT":
self.camera_pos += self.camera_right * velocity
def process_mouse_movement(self, xoffset, yoffset, constrain_pitch=True):
xoffset *= self.mouse_sensitivity
yoffset *= self.mouse_sensitivity
self.yaw += xoffset
self.pitch += yoffset
if constrain_pitch:
if self.pitch > 45.0:
self.pitch = 45.0
if self.pitch < -45.0:
self.pitch = -45.0
self.update_camera_vectors()
def update_camera_vectors(self):
front = Vector3([0.0, 0.0, 0.0])
front.x = cos(radians(self.yaw)) * cos(radians(self.pitch))
front.y = sin(radians(self.pitch))
front.z = sin(radians(self.yaw)) * cos(radians(self.pitch))
self.camera_front = vector.normalise(front)
self.camera_right = vector.normalise(vector3.cross(self.camera_front, Vector3([0.0, 1.0, 0.0])))
self.camera_up = vector.normalise(vector3.cross(self.camera_right, self.camera_front))
def look_at(self, position, target, world_up):
# 1.Position = known
# 2.Calculate cameraDirection
zaxis = vector.normalise(position - target)
# 3.Get positive right axis vector
xaxis = vector.normalise(vector3.cross(vector.normalise(world_up), zaxis))
# 4.Calculate the camera up vector
yaxis = vector3.cross(zaxis, xaxis)
# create translation and rotation matrix
translation = Matrix44.identity()
translation[3][0] = -position.x
translation[3][1] = -position.y
translation[3][2] = -position.z
rotation = Matrix44.identity()
rotation[0][0] = xaxis[0]
rotation[1][0] = xaxis[1]
rotation[2][0] = xaxis[2]
rotation[0][1] = yaxis[0]
rotation[1][1] = yaxis[1]
rotation[2][1] = yaxis[2]
rotation[0][2] = zaxis[0]
rotation[1][2] = zaxis[1]
rotation[2][2] = zaxis[2]
return translation * rotation