def test_distance(self): self.assertAlmostEqual( quat.distance(quat.from_pyr(90, 0, 0), quat.from_pyr(-90, 0, 0)), 1) self.assertAlmostEqual( quat.distance(quat.from_pyr(0, -180, 0), quat.from_pyr(0, 180, 0)), 0) self.assertAlmostEqual(quat.distance(quat(), quat()), 0) self.assertAlmostEqual(quat.distance(quat(), quat(0, 0, 0, -1)), 0)
def test_multiply(self): a = vec3(1, 2, 3) self.assertAlmostEqual(quat() * a, a) self.assertAlmostEqual(a * quat(), a) self.assertAlmostEqual(quat.from_pyr(90, 0, 0) * vec3.forward, vec3.up) self.assertAlmostEqual(vec3.up * quat.from_pyr(90, 0, 0), vec3.forward) b = quat.from_pyr(10, 20, 30) c = quat.from_pyr(-40, 50, -60) self.assertAlmostEqual(b * (c * a), (b * c) * a) self.assertAlmostEqual((a * b) * c, a * (b * c))
def test_angles(self): q = quat.from_pyr(20, 40, 70) q2 = quat.from_pyr(0, 0, 70) * quat.from_pyr(0, 40, 0) * quat.from_pyr( 20, 0, 0) self.assertAlmostEqual(q, q2) for a in [-90, -40, 0, 40, 90]: self.assertAlmostEqual(quat.from_pyr(a, 0, 0).pitch, a) for a in [-180, -90, -40, 0, 40, 90, 180]: self.assertAlmostEqual(quat.from_pyr(0, a, 0).yaw, a) for a in [-90, -40, 0, 40, 90]: self.assertAlmostEqual(quat.from_pyr(0, 0, a).roll, a) for p in [-90, -40, 0, 40, 90]: for y in [-180, -90, -40, 0, 40, 90, 180]: q = quat.from_pyr(p, y, 0) self.assertAlmostEqual(q.pitch, p) self.assertAlmostEqual(q.yaw, y) q2 = quat.from_pyr(q.pitch, q.yaw, q.roll) self.assertAlmostEqual(q, q2)
def test_invert(self): a = quat.from_pyr(10, 20, 30) b = quat(a) #static quat.invert(a) self.assertEqual(a, b) #unchanged #instance self.assertAlmostEqual(a.invert(), quat.invert(b)) self.assertAlmostEqual(a, quat.invert(b)) self.assertAlmostEqual(quat.invert(quat()), quat()) self.assertAlmostEqual(a * quat.invert(a), quat()) self.assertAlmostEqual(a * (quat.invert(a) * b), b) c = vec3(1, 2, 3) self.assertAlmostEqual(quat.invert(a) * c, c * a)
def test_initialization_and_value_set(self): a = quat() self.assertEqual(a.x, 0) self.assertEqual(a.y, 0) self.assertEqual(a.z, 0) self.assertEqual(a.w, 1) b = quat.from_pyr(0, 0, 0) self.assertAlmostEqual(a, b) b.set(1, 2, 3, 4) self.assertAlmostEqual(b, quat(1, 2, 3, 4)) c = quat(b) self.assertFalse(c is b) self.assertEqual(b, c) d = c.copy() self.assertFalse(c is d) self.assertEqual(c, d)
def test_rot_direction(self): # https://github.com/beep39/pymikuvr/wiki/Coordinate-system self.assertAlmostEqual( quat.from_pyr(90, 0, 0) * vec3(0, 1, 0), vec3(0, 0, 1)) self.assertAlmostEqual( quat.from_pyr(0, 0, 90) * vec3(1, 0, 0), vec3(0, 1, 0)) self.assertAlmostEqual( quat.from_pyr(0, 90, 0) * vec3(0, 0, 1), vec3(1, 0, 0)) self.assertAlmostEqual(quat.from_pyr(90, 0, 0) * vec3.forward, vec3.up) self.assertAlmostEqual(quat.from_pyr(0, 0, 90) * vec3.right, vec3.up) self.assertAlmostEqual( quat.from_pyr(0, 90, 0) * vec3.right, vec3.forward)
def test_posrot(self): v = vec3(1, 2, 3) q = quat.from_pyr(10, 20, 30) a = transform() a.pos.set(v.x, v.y, v.z) self.assertAlmostEqual(a.pos, v) self.assertAlmostEqual(a.local_pos, v) a.rot.set(q.x, q.y, q.z, q.w) self.assertAlmostEqual(a.rot, q) self.assertAlmostEqual(a.local_rot, q) b = transform() b.pos = v self.assertAlmostEqual(b.pos, v) self.assertAlmostEqual(b.local_pos, v) b.rot = q self.assertAlmostEqual(b.rot, q) self.assertAlmostEqual(b.local_rot, q) c = transform() c.local_pos.set(v.x, v.y, v.z) self.assertAlmostEqual(c.pos, v) self.assertAlmostEqual(c.local_pos, v) c.local_rot.set(q.x, q.y, q.z, q.w) self.assertAlmostEqual(c.rot, q) self.assertAlmostEqual(c.local_rot, q) d = transform() d.local_pos = v self.assertAlmostEqual(d.pos, v) self.assertAlmostEqual(d.local_pos, v) d.local_rot = q self.assertAlmostEqual(d.rot, q) self.assertAlmostEqual(d.local_rot, q) gc.collect()