Esempio n. 1
0
        // Set to binding pose ("T" pose)
        public static void SetToBindingPose([NotNull] this PmxBone bone)
        {
            if (bone.IsTransformCalculated)
            {
                return;
            }

            var parent = bone.Parent;

            Vector3 localPosition;

            if (parent == null)
            {
                localPosition = bone.InitialPosition;
            }
            else
            {
                parent.SetToBindingPose();
                localPosition = bone.InitialPosition - parent.InitialPosition;
            }

            bone.LocalMatrix = CalculateTransform(localPosition, Quaternion.Identity);
            bone.WorldMatrix = bone.CalculateWorldMatrix();

            bone.IsTransformCalculated = true;
        }
Esempio n. 2
0
        internal static void SetToVmdPose([NotNull] this PmxBone bone, bool forced = false)
        {
            if (!forced && bone.IsTransformCalculated)
            {
                return;
            }

            // Ignore append parent.

            bone.CurrentRotation = bone.AnimatedRotation;

            var parent = bone.Parent;

            Vector3 localPosition;

            if (parent == null)
            {
                localPosition = bone.AnimatedTranslation + bone.InitialPosition;
            }
            else
            {
                parent.SetToVmdPose();
                localPosition = bone.AnimatedTranslation + bone.InitialPosition - parent.InitialPosition;
            }

            bone.LocalMatrix = CalculateTransform(localPosition, bone.CurrentRotation);
            bone.WorldMatrix = bone.CalculateWorldMatrix();

            bone.SkinMatrix = bone.BindingPoseMatrixInverse * bone.WorldMatrix;

            bone.CurrentPosition = Vector3.TransformPosition(bone.InitialPosition, bone.SkinMatrix);

            bone.IsTransformCalculated = true;
        }
Esempio n. 3
0
        // https://github.com/sn0w75/MMP/blob/master/libmmp/motioncontroller.cpp
        internal static void SetToVmdPose([NotNull] this PmxBone bone)
        {
            if (bone.IsTransformCalculated)
            {
                return;
            }

            bone.CurrentRotation = bone.AnimatedRotation;

            var parent = bone.ParentBone;

            Vector3 localPosition;

            if (parent == null)
            {
                localPosition = bone.AnimatedTranslation + bone.InitialPosition;
            }
            else
            {
                parent.SetToVmdPose();
                localPosition = bone.AnimatedTranslation + bone.InitialPosition - parent.InitialPosition;
            }

            bone.LocalMatrix = CalculateTransform(localPosition, bone.CurrentRotation);
            bone.WorldMatrix = bone.CalculateWorldMatrix();

            bone.IsTransformCalculated = true;
        }