def calc_bf_pos(self, prev_bf: VmdBoneFrame, fill_bf: VmdBoneFrame, next_bf: VmdBoneFrame): # 補間曲線を元に間を埋める if prev_bf.position != next_bf.position: # http://rantyen.blog.fc2.com/blog-entry-65.html # X移動補間曲線 xx, xy, xt = MBezierUtils.evaluate(next_bf.interpolation[MBezierUtils.MX_x1_idxs[3]], next_bf.interpolation[MBezierUtils.MX_y1_idxs[3]], \ next_bf.interpolation[MBezierUtils.MX_x2_idxs[3]], next_bf.interpolation[MBezierUtils.MX_y2_idxs[3]], \ prev_bf.fno, fill_bf.fno, next_bf.fno) # Y移動補間曲線 yx, yy, yt = MBezierUtils.evaluate(next_bf.interpolation[MBezierUtils.MY_x1_idxs[3]], next_bf.interpolation[MBezierUtils.MY_y1_idxs[3]], \ next_bf.interpolation[MBezierUtils.MY_x2_idxs[3]], next_bf.interpolation[MBezierUtils.MY_y2_idxs[3]], \ prev_bf.fno, fill_bf.fno, next_bf.fno) # Z移動補間曲線 zx, zy, zt = MBezierUtils.evaluate(next_bf.interpolation[MBezierUtils.MZ_x1_idxs[3]], next_bf.interpolation[MBezierUtils.MZ_y1_idxs[3]], \ next_bf.interpolation[MBezierUtils.MZ_x2_idxs[3]], next_bf.interpolation[MBezierUtils.MZ_y2_idxs[3]], \ prev_bf.fno, fill_bf.fno, next_bf.fno) fill_pos = MVector3D() fill_pos.setX(prev_bf.position.x() + ((next_bf.position.x() - prev_bf.position.x()) * xy)) fill_pos.setY(prev_bf.position.y() + ((next_bf.position.y() - prev_bf.position.y()) * yy)) fill_pos.setZ(prev_bf.position.z() + ((next_bf.position.z() - prev_bf.position.z()) * zy)) return fill_pos return prev_bf.position.copy()
def test_MBezierUtils_evaluate05(self): x, y, t = MBezierUtils.evaluate(0, 127, 127, 0, 0, 2, 30) print("x: %s" % x) print("y: %s" % y) print("t: %s" % t) self.assertAlmostEqual(x, 0.06, delta=0.01) self.assertAlmostEqual(y, 0.34, delta=0.01) self.assertAlmostEqual(t, 0.16, delta=0.01)
def test_MBezierUtils_evaluate03(self): x, y, t = MBezierUtils.evaluate(104, 63, 13, 111, 0, 5, 10) print("x: %s" % x) print("y: %s" % y) print("t: %s" % t) self.assertAlmostEqual(x, 0.5, delta=0.01) self.assertAlmostEqual(y, 0.74, delta=0.01) self.assertAlmostEqual(t, 0.61, delta=0.01)
def test_MBezierUtils_evaluate02(self): x, y, t = MBezierUtils.evaluate(20, 20, 107, 107, 181, 200, 205) print("x: %s" % x) print("y: %s" % y) print("t: %s" % t) self.assertAlmostEqual(x, 0.79, delta=0.01) self.assertAlmostEqual(y, 0.79, delta=0.01) self.assertAlmostEqual(t, 0.74, delta=0.01)
def test_MBezierUtils_evaluate01(self): x, y, t = MBezierUtils.evaluate(20, 20, 107, 107, 0, 5, 10) print("x: %s" % x) print("y: %s" % y) print("t: %s" % t) self.assertAlmostEqual(x, 0.5, delta=0.01) self.assertAlmostEqual(y, 0.5, delta=0.01) self.assertAlmostEqual(t, 0.5, delta=0.01)
def calc_bf_rot(self, prev_bf: VmdBoneFrame, fill_bf: VmdBoneFrame, next_bf: VmdBoneFrame): if prev_bf.rotation != next_bf.rotation: # 回転補間曲線 rx, ry, rt = MBezierUtils.evaluate(next_bf.interpolation[MBezierUtils.R_x1_idxs[3]], next_bf.interpolation[MBezierUtils.R_y1_idxs[3]], \ next_bf.interpolation[MBezierUtils.R_x2_idxs[3]], next_bf.interpolation[MBezierUtils.R_y2_idxs[3]], \ prev_bf.fno, fill_bf.fno, next_bf.fno) return MQuaternion.slerp(prev_bf.rotation, next_bf.rotation, ry) return prev_bf.rotation.copy()