Esempio n. 1
0
    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()
Esempio n. 2
0
    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)
Esempio n. 3
0
    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)
Esempio n. 4
0
    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)
Esempio n. 5
0
    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)
Esempio n. 6
0
    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()