7 def radian_to_degree(x):
\r
8 """darian to deglee"""
\r
10 return x/math.pi * 180.0
\r
16 class ParseException(Exception):
\r
20 class Vector2(object):
\r
22 2D coordinate for uv value
\r
24 __slots__=['x', 'y']
\r
25 def __init__(self, x=0, y=0):
\r
30 return "<%f %f>" % (self.x, self.y)
\r
32 def __getitem__(self, key):
\r
41 return (self.x, self.y)
\r
44 class Vector3(object):
\r
46 3D coordinate for vertex position, normal direction
\r
48 __slots__=['x', 'y', 'z']
\r
49 def __init__(self, x=0, y=0, z=0):
\r
55 return "<%f %f %f>" % (self.x, self.y, self.z)
\r
57 def __getitem__(self, key):
\r
68 return (self.x, self.y, self.z)
\r
71 return Vector3(l.x+r.x, l.y+r.y, l.z+r.z)
\r
74 class Quaternion(object):
\r
76 rotation representation in vmd motion
\r
78 __slots__=['x', 'y', 'z', 'w']
\r
79 def __init__(self, x=0, y=0, z=0, w=1):
\r
86 return "<%f %f %f %f>" % (self.x, self.y, self.z, self.w)
\r
88 def __mul__(self, rhs):
\r
89 u=numpy.array([self.x, self.y, self.z], 'f')
\r
90 v=numpy.array([rhs.x, rhs.y, rhs.z], 'f')
\r
91 xyz=self.w*v+rhs.w*u+numpy.cross(u, v)
\r
92 q=Quaternion(xyz[0], xyz[1], xyz[2], self.w*rhs.w-numpy.dot(u, v))
\r
96 return self.x*rhs.x+self.y*rhs.y+self.z*rhs.z+self.w*rhs.w
\r
98 def getMatrix(self):
\r
108 return numpy.array([
\r
110 [1-2*sqY-2*sqZ, 2*xy+2*wz, 2*xz-2*wy, 0],
\r
112 [2*xy-2*wz, 1-2*sqX-2*sqZ, 2*yz+2*wx, 0],
\r
114 [2*xz+2*wy, 2*yz-2*wx, 1-2*sqX-2*sqY, 0],
\r
119 def getRHMatrix(self):
\r
133 return numpy.array([
\r
135 [1-2*sqY-2*sqZ, 2*xy+2*wz, 2*xz-2*wy, 0],
\r
137 [2*xy-2*wz, 1-2*sqX-2*sqZ, 2*yz+2*wx, 0],
\r
139 [2*xz+2*wy, 2*yz-2*wx, 1-2*sqX-2*sqY, 0],
\r
144 def getRollPitchYaw(self):
\r
147 roll = math.atan2(m[0, 1], m[1, 1])
\r
148 pitch = math.asin(-m[2, 1])
\r
149 yaw = math.atan2(m[2, 0], m[2, 2])
\r
151 if math.fabs(math.cos(pitch)) < 1.0e-6:
\r
152 roll += m[0, 1] > math.pi if 0.0 else -math.pi
\r
153 yaw += m[2, 0] > math.pi if 0.0 else -math.pi
\r
155 return roll, pitch, yaw
\r
157 def getSqNorm(self):
\r
158 return self.x*self.x+self.y*self.y+self.z*self.z+self.w*self.w
\r
160 def getNormalized(self):
\r
161 f=1.0/self.getSqNorm()
\r
162 q=Quaternion(self.x*f, self.y*f, self.z*f, self.w*f)
\r
165 def getRightHanded(self):
\r
166 "swap y and z axis"
\r
167 return Quaternion(-self.x, -self.z, -self.y, self.w)
\r
170 def createFromAxisAngle(axis, rad):
\r
173 c=math.cos(half_rad)
\r
174 s=math.sin(half_rad)
\r
175 return Quaternion(axis[0]*s, axis[1]*s, axis[2]*s, c)
\r
182 __slots__=['r', 'g', 'b']
\r
183 def __init__(self, r=0, g=0, b=0):
\r
188 def __getitem__(self, key):
\r
199 class RGBA(object):
\r
203 __slots__=['r', 'g', 'b', 'a']
\r
204 def __init__(self, r=0, g=0, b=0, a=1):
\r
210 def __getitem__(self, key):
\r