// 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; }
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; }
// 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; }