-
Notifications
You must be signed in to change notification settings - Fork 1
/
camera.py
76 lines (63 loc) · 2.63 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
import glm
import math
from PyQt5.QtCore import Qt
from PyQt5 import QtGui
class FirstPersonCamera:
def __init__(self, aspect_ratio):
self._position = glm.vec3(80, 60, 0.0)
self._direction = glm.vec3(-1.0, -1.0, -1.0)
self._velocity = glm.vec3(0.0, 0.0, 0.0)
self.on_resize(aspect_ratio)
self._speed = 5 # units per second
self._mouse_sensibility = 0.1
def controls(self):
return (Qt.Key_A, Qt.Key_S, Qt.Key_D, Qt.Key_W, Qt.Key_Space)
def on_key_down(self, key, modifiers, last_modifiers):
if key == Qt.Key_W:
self._velocity.x += 1
if key == Qt.Key_S:
self._velocity.x -= 1
if key == Qt.Key_A:
self._velocity.y -= 1
if key == Qt.Key_D:
self._velocity.y += 1
if key == Qt.Key_Space:
self._velocity.z += 1
if modifiers & Qt.ShiftModifier:
self._velocity.z -= 1
def on_key_up(self, key, modifiers, last_modifiers):
if key == Qt.Key_W:
self._velocity.x -= 1
if key == Qt.Key_S:
self._velocity.x += 1
if key == Qt.Key_A:
self._velocity.y += 1
if key == Qt.Key_D:
self._velocity.y -= 1
if key == Qt.Key_Space:
self._velocity.z -= 1
if not (modifiers & Qt.ShiftModifier) and (last_modifiers & Qt.ShiftModifier):
self._velocity.z += 1
def on_mouse_move(self, dx, dy):
yaw_axis = glm.vec3(0.0, 1.0, 0.0)
pitch_axis = glm.cross(self._direction, yaw_axis)
# TODO radians conversion can be avoided w/ lower sensibility
yaw_angle = math.radians(-dx * self._mouse_sensibility)
pitch_angle = math.radians(-dy * self._mouse_sensibility)
self._direction = (glm.rotate(glm.mat4(1.0), yaw_angle, yaw_axis) * glm.vec4(self._direction, 1.0)).xyz
self._direction = (glm.rotate(glm.mat4(1.0), pitch_angle, pitch_axis) * glm.vec4(self._direction, 1.0)).xyz
def on_resize(self, aspect_ratio):
self._projection = glm.perspective(45.0, aspect_ratio, 0.1, 1000.0)
def update(self, ms): # Add
up = glm.vec3(0.0, 1.0, 0.0)
right = glm.cross(self._direction, up)
self._position += self._direction * self._velocity.x * self._speed
self._position += right * self._velocity.y * self._speed
self._position += up * self._velocity.z * self._speed
@property
def view(self):
# Could be cached..
return glm.lookAt(self._position, self._position + self._direction, glm.vec3(0.0, 1.0, 0.0))
@property
def projection(self):
return self._projection