-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathcamera.py
79 lines (57 loc) · 3.37 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
import OpenGL
from OpenGL.GL import *
from OpenGL.GLU import *
from math_utils import *
class camera():
def __init__(self, pos, orient):
self.pos = pos
self.orient = orient
def get_pos(self):
return self.pos
def get_orient(self):
return self.orient
def set_pos(self, new_pos):
req_trans = [new_pos[0] - self.pos[0],
new_pos[1] - self.pos[1],
new_pos[2] - self.pos[2]]
glTranslate(req_trans[0], req_trans[1], req_trans[2])
self.pos = new_pos
def move_local(self, movement):
glTranslate((movement[0] * self.orient[0][0]) + (movement[1] * self.orient[1][0]) + (movement[2] * self.orient[2][0]),
(movement[0] * self.orient[0][1]) + (movement[1] * self.orient[1][1]) + (movement[2] * self.orient[2][1]),
(movement[0] * self.orient[0][2]) + (movement[1] * self.orient[1][2]) + (movement[2] * self.orient[2][2]))
self.pos = [self.pos[0] + (movement[0] * self.orient[0][0]) + (movement[1] * self.orient[1][0]) + (movement[2] * self.orient[2][0]),
self.pos[1] + (movement[0] * self.orient[0][1]) + (movement[1] * self.orient[1][1]) + (movement[2] * self.orient[2][1]),
self.pos[2] + (movement[0] * self.orient[0][2]) + (movement[1] * self.orient[1][2]) + (movement[2] * self.orient[2][2])]
def move_absolute(self, movement):
glTranslate(movement[0], movement[1], movement[2])
self.pos = [self.pos[0] + movement[0],
self.pos[1] + movement[1],
self.pos[2] + movement[2]]
def rotate(self, rotation, about=None, rot_lock=False):
if about:
about_pos = [-about.get_pos()[0], -about.get_pos()[1], -about.get_pos()[2]]
else:
about_pos = self.pos
if not rot_lock:
glTranslate(-about_pos[0], -about_pos[1], -about_pos[2])
glRotate(-rotation[0], self.orient[0][0], self.orient[0][1], self.orient[0][2])
glTranslate(about_pos[0], about_pos[1], about_pos[2])
glTranslate(-about_pos[0], -about_pos[1], -about_pos[2])
glRotate(-rotation[1], self.orient[1][0], self.orient[1][1], self.orient[1][2])
glTranslate(about_pos[0], about_pos[1], about_pos[2])
glTranslate(-about_pos[0], -about_pos[1], -about_pos[2])
glRotate(-rotation[2], self.orient[2][0], self.orient[2][1], self.orient[2][2])
glTranslate(about_pos[0], about_pos[1], about_pos[2])
self.orient = rotate_matrix(self.orient, rotation)
elif about and rot_lock:
glTranslate(-about_pos[0], -about_pos[1], -about_pos[2])
glRotate(-rotation[0], about.orient[0][0], about.orient[0][1], about.orient[0][2])
glTranslate(about_pos[0], about_pos[1], about_pos[2])
glTranslate(-about_pos[0], -about_pos[1], -about_pos[2])
glRotate(-rotation[1], about.orient[1][0], about.orient[1][1], about.orient[1][2])
glTranslate(about_pos[0], about_pos[1], about_pos[2])
glTranslate(-about_pos[0], -about_pos[1], -about_pos[2])
glRotate(-rotation[2], about.orient[2][0], about.orient[2][1], about.orient[2][2])
glTranslate(about_pos[0], about_pos[1], about_pos[2])
self.orient = rotate_matrix(self.orient, rotation, about)