12 class Vector2(object):
\r
14 2D coordinate for uv value
\r
16 __slots__=['x', 'y']
\r
17 def __init__(self, x=0, y=0):
\r
22 return "<%f %f>" % (self.x, self.y)
\r
24 def __getitem__(self, key):
\r
33 return (self.x, self.y)
\r
35 def cross(self, rhs):
\r
36 """cross(outer) product"""
\r
37 return self.x*rhs.y-self.y*rhs.x
\r
40 class Vector3(object):
\r
42 3D coordinate for vertex position, normal direction
\r
44 __slots__=['x', 'y', 'z']
\r
45 def __init__(self, x=0, y=0, z=0):
\r
51 return "<%f %f %f>" % (self.x, self.y, self.z)
\r
53 def __getitem__(self, key):
\r
64 return (self.x, self.y, self.z)
\r
66 def __add__(self, r):
\r
67 return Vector3(self.x+r.x, self.y+r.y, self.z+r.z)
\r
69 def __sub__(self, rhs):
\r
70 return Vector3(self.x-rhs.x, self.y-rhs.y, self.z-rhs.z)
\r
72 def getSqNorm(self):
\r
73 return self.x*self.x + self.y*self.y + self.z*self.z
\r
76 return math.sqrt(self.getSqNorm())
\r
78 def normalize(self):
\r
79 factor=1.0/self.getNorm()
\r
86 return [self.x, self.y, self.z]
\r
89 """dot(inner) product"""
\r
90 return self.x*rhs.x + self.y*rhs.y + self.z*rhs.z
\r
92 def cross(self, rhs):
\r
93 """cross(outer) product"""
\r
95 self.y*rhs.z - rhs.y*self.z,
\r
96 self.z*rhs.x - rhs.z*self.x,
\r
97 self.x*rhs.y - rhs.x*self.y,
\r
101 class Quaternion(object):
\r
103 rotation representation in vmd motion
\r
105 __slots__=['x', 'y', 'z', 'w']
\r
106 def __init__(self, x=0, y=0, z=0, w=1):
\r
113 return "<%f %f %f %f>" % (self.x, self.y, self.z, self.w)
\r
115 def __mul__(self, rhs):
\r
116 u=numpy.array([self.x, self.y, self.z], 'f')
\r
117 v=numpy.array([rhs.x, rhs.y, rhs.z], 'f')
\r
118 xyz=self.w*v+rhs.w*u+numpy.cross(u, v)
\r
119 q=Quaternion(xyz[0], xyz[1], xyz[2], self.w*rhs.w-numpy.dot(u, v))
\r
122 def dot(self, rhs):
\r
123 return self.x*rhs.x+self.y*rhs.y+self.z*rhs.z+self.w*rhs.w
\r
125 def getMatrix(self):
\r
135 return numpy.array([
\r
137 [1-2*sqY-2*sqZ, 2*xy+2*wz, 2*xz-2*wy, 0],
\r
139 [2*xy-2*wz, 1-2*sqX-2*sqZ, 2*yz+2*wx, 0],
\r
141 [2*xz+2*wy, 2*yz-2*wx, 1-2*sqX-2*sqY, 0],
\r
146 def getRHMatrix(self):
\r
160 return numpy.array([
\r
162 [1-2*sqY-2*sqZ, 2*xy+2*wz, 2*xz-2*wy, 0],
\r
164 [2*xy-2*wz, 1-2*sqX-2*sqZ, 2*yz+2*wx, 0],
\r
166 [2*xz+2*wy, 2*yz-2*wx, 1-2*sqX-2*sqY, 0],
\r
171 def getRollPitchYaw(self):
\r
174 roll = math.atan2(m[0, 1], m[1, 1])
\r
175 pitch = math.asin(-m[2, 1])
\r
176 yaw = math.atan2(m[2, 0], m[2, 2])
\r
178 if math.fabs(math.cos(pitch)) < 1.0e-6:
\r
179 roll += m[0, 1] > math.pi if 0.0 else -math.pi
\r
180 yaw += m[2, 0] > math.pi if 0.0 else -math.pi
\r
182 return roll, pitch, yaw
\r
184 def getSqNorm(self):
\r
185 return self.x*self.x+self.y*self.y+self.z*self.z+self.w*self.w
\r
187 def getNormalized(self):
\r
188 f=1.0/self.getSqNorm()
\r
189 q=Quaternion(self.x*f, self.y*f, self.z*f, self.w*f)
\r
192 def getRightHanded(self):
\r
193 "swap y and z axis"
\r
194 return Quaternion(-self.x, -self.z, -self.y, self.w)
\r
197 def createFromAxisAngle(axis, rad):
\r
200 c=math.cos(half_rad)
\r
201 s=math.sin(half_rad)
\r
202 return Quaternion(axis[0]*s, axis[1]*s, axis[2]*s, c)
\r
209 __slots__=['r', 'g', 'b']
\r
210 def __init__(self, r=0, g=0, b=0):
\r
215 def __getitem__(self, key):
\r
226 class RGBA(object):
\r
230 __slots__=['r', 'g', 'b', 'a']
\r
231 def __init__(self, r=0, g=0, b=0, a=1):
\r
237 def __getitem__(self, key):
\r
253 def radian_to_degree(x):
\r
254 """darian to deglee"""
\r
256 return x/math.pi * 180.0
\r
259 class ParseException(Exception):
\r
264 """read all bytes from path
\r
266 with open(path, "rb") as f:
\r
270 class BinaryLoader(object):
\r
271 """general BinaryLoader
\r
273 def __init__(self, io):
\r
277 return not self.io.readable()
\r
279 def unpack(self, fmt, size):
\r
280 result=struct.unpack(fmt, self.io.read(size))
\r
283 def read_uint(self, size):
\r
285 return self.unpack("B", size)
\r
287 return self.unpack("H", size)
\r
289 return self.unpack("I", size)
\r
290 print("not reach here")
\r
291 raise ParseException("invalid int size: "+size)
\r
293 def read_float(self):
\r
294 return self.unpack("f", 4)
\r
296 def read_vector2(self):
\r
298 self.read_float(),
\r
302 def read_vector3(self):
\r
304 self.read_float(),
\r
305 self.read_float(),
\r
309 def read_rgba(self):
\r
311 self.read_float(),
\r
312 self.read_float(),
\r
317 def read_rgb(self):
\r
319 self.read_float(),
\r
320 self.read_float(),
\r