-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTransform.py
88 lines (64 loc) · 2.04 KB
/
Transform.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
81
82
83
84
85
86
87
88
import math
import random
import mathutils
import numpy as np
class Transform():
RIGHT = mathutils.Vector((1, 0, 0))
UP = mathutils.Vector((0, 1, 0))
FORWARD = mathutils.Vector((0, 0, 1))
def __init__(self, pos=None, rot=None, scale=None):
self._pos = None
self._rot = None
self.scale = None
if not pos:
self._pos = mathutils.Vector((0, 0, 0))
else:
self._pos = mathutils.Vector(pos)
if not rot:
self._rot = mathutils.Quaternion()
elif rot == -1:
theta = math.acos(2.0 * random.random() - 1.0)
phi = 2.0 * math.pi * random.random()
x = math.cos(theta) * math.cos(phi)
y = math.sin(theta) * math.cos(phi)
z = math.sin(phi)
psi = random.random() * 2.0 * math.pi
self._rot = mathutils.Quaternion((x, y, z), psi)
else:
self._rot = mathutils.Quaternion(rot)
if not scale:
self.scale = mathutils.Vector((0, 0, 0))
else:
self.scale = mathutils.Vector(scale)
@property
def position(self):
return self._pos
def position4(self):
return mathutils.Vector((self._pos.x, self._pos.y, self_pos.z, 0))
@position.setter
def position(self, new_position):
self._pos = new_position
@property
def rotation(self):
return self._rot
@property
def up(self):
return self._rot * self.UP
@property
def forward(self):
return self._rot * self.FORWARD
@property
def right(self):
return self._rot * self.RIGHT
@staticmethod
def random_vector():
theta = math.acos(2.0 * random.random() - 1.0)
phi = 2.0 * math.pi * random.random()
x = math.cos(theta) * math.cos(phi)
y = math.sin(theta) * math.cos(phi)
z = math.sin(phi)
return mathutils.Vector((x, y, z))
def translate(self, delta):
self.position += delta
def rotate_around(self, axis, angle):
pass