public static Vector3 InterporatePosition(VMDReader vmdReader, BoneKeyFrameGroup.BoneNames boneName, int frameNumber) { VMDReader.BoneKeyFrameGroup vmdBoneFrameGroup = vmdReader.GetBoneKeyFrameGroup(boneName); VMD.BoneKeyFrame lastFrame = vmdBoneFrameGroup.LastPositionKeyFrame; VMD.BoneKeyFrame nextFrame = vmdBoneFrameGroup.NextPositionKeyFrame; if (lastFrame != null && nextFrame != null) { float xInterpolationRate = vmdBoneFrameGroup.Interpolation.GetInterpolationValue(VMD.BoneKeyFrame.Interpolation.BezierCurveNames.X, frameNumber, lastFrame.FrameNumber, nextFrame.FrameNumber); float yInterpolationRate = vmdBoneFrameGroup.Interpolation.GetInterpolationValue(VMD.BoneKeyFrame.Interpolation.BezierCurveNames.Y, frameNumber, lastFrame.FrameNumber, nextFrame.FrameNumber); float zInterpolationRate = vmdBoneFrameGroup.Interpolation.GetInterpolationValue(VMD.BoneKeyFrame.Interpolation.BezierCurveNames.Z, frameNumber, lastFrame.FrameNumber, nextFrame.FrameNumber); float xInterpolation = Mathf.Lerp(lastFrame.Position.x, nextFrame.Position.x, xInterpolationRate); float yInterpolation = Mathf.Lerp(lastFrame.Position.y, nextFrame.Position.y, yInterpolationRate); float zInterpolation = Mathf.Lerp(lastFrame.Position.z, nextFrame.Position.z, zInterpolationRate); return(new Vector3(xInterpolation, yInterpolation, zInterpolation)); } else if (lastFrame == null && nextFrame != null) { float xInterpolationRate = vmdBoneFrameGroup.Interpolation.GetInterpolationValue(VMD.BoneKeyFrame.Interpolation.BezierCurveNames.X, frameNumber, 0, nextFrame.FrameNumber); float yInterpolationRate = vmdBoneFrameGroup.Interpolation.GetInterpolationValue(VMD.BoneKeyFrame.Interpolation.BezierCurveNames.Y, frameNumber, 0, nextFrame.FrameNumber); float zInterpolationRate = vmdBoneFrameGroup.Interpolation.GetInterpolationValue(VMD.BoneKeyFrame.Interpolation.BezierCurveNames.Z, frameNumber, 0, nextFrame.FrameNumber); float xInterpolation = Mathf.Lerp(0, nextFrame.Position.x, xInterpolationRate); float yInterpolation = Mathf.Lerp(0, nextFrame.Position.y, yInterpolationRate); float zInterpolation = Mathf.Lerp(0, nextFrame.Position.z, zInterpolationRate); return(new Vector3(xInterpolation, yInterpolation, zInterpolation)); } else if (nextFrame == null && lastFrame != null) { return(lastFrame.Position); } return(Vector3.zero); }
public void AddKeyFrame(VMD.BoneKeyFrame vmdBoneFrame) { BoneKeyFrames.Add(vmdBoneFrame); if (vmdBoneFrame.Position != Vector3.zero) { BonePositionKeyFrames.Add(vmdBoneFrame); } if (vmdBoneFrame.Rotation != ZeroQuaternion) { BoneRotationKeyFrames.Add(vmdBoneFrame); } }
private VMD.BoneKeyFrame GetKeyFrameUsingCash(int frameNumber) { CurrentKeyFrame = BoneKeyFrames.Find(x => x.FrameNumber == frameNumber); if (CurrentKeyFrame == null && (NextPositionKeyFrame != null || NextRotationKeyFrame != null)) { return(null); } if (CurrentKeyFrame != null && CurrentKeyFrame.Position != Vector3.zero) { LastPositionKeyFrame = CurrentKeyFrame; NextPositionKeyFrame = BonePositionKeyFrames.Find(x => x.FrameNumber > frameNumber); } if (CurrentKeyFrame != null && CurrentKeyFrame.Rotation != ZeroQuaternion) { LastRotationKeyFrame = CurrentKeyFrame; NextRotationKeyFrame = BoneRotationKeyFrames.Find(x => x.FrameNumber > frameNumber); } if (NextPositionKeyFrame == null && NextRotationKeyFrame == null) { NextKeyFrame = null; } else if (NextPositionKeyFrame != null && NextRotationKeyFrame != null) { NextKeyFrame = NextRotationKeyFrame.FrameNumber < NextPositionKeyFrame.FrameNumber ? NextRotationKeyFrame : NextPositionKeyFrame; } else if (NextPositionKeyFrame == null) { NextKeyFrame = NextRotationKeyFrame; } else if (NextRotationKeyFrame == null) { NextKeyFrame = NextPositionKeyFrame; } if (NextKeyFrame != null) { Interpolation = NextKeyFrame.BoneInterpolation; } else { Interpolation = null; } return(CurrentKeyFrame); }
private VMD.BoneKeyFrame GetKeyFrameWithoutCash(int frameNumber) { CurrentKeyFrame = BoneKeyFrames.Find(x => x.FrameNumber == frameNumber); LastPositionKeyFrame = BonePositionKeyFrames.FindLast(x => x.FrameNumber <= frameNumber); LastRotationKeyFrame = BoneRotationKeyFrames.FindLast(x => x.FrameNumber <= frameNumber); NextPositionKeyFrame = BonePositionKeyFrames.Find(x => x.FrameNumber > frameNumber); NextRotationKeyFrame = BoneRotationKeyFrames.Find(x => x.FrameNumber > frameNumber); if (NextPositionKeyFrame == null && NextRotationKeyFrame == null) { NextKeyFrame = null; } else if (NextPositionKeyFrame != null && NextRotationKeyFrame != null) { NextKeyFrame = NextRotationKeyFrame.FrameNumber < NextPositionKeyFrame.FrameNumber ? NextRotationKeyFrame : NextPositionKeyFrame; } else if (NextPositionKeyFrame == null) { NextKeyFrame = NextRotationKeyFrame; } else if (NextRotationKeyFrame == null) { NextKeyFrame = NextPositionKeyFrame; } if (NextKeyFrame != null) { Interpolation = NextKeyFrame.BoneInterpolation; } else { Interpolation = null; } return(CurrentKeyFrame); }
public static Quaternion InterporateRotation(VMDReader vmdReader, BoneKeyFrameGroup.BoneNames boneName, int frameNumber) { VMDReader.BoneKeyFrameGroup vmdBoneFrameGroup = vmdReader.GetBoneKeyFrameGroup(boneName); VMD.BoneKeyFrame lastFrame = vmdBoneFrameGroup.LastRotationKeyFrame; VMD.BoneKeyFrame nextFrame = vmdBoneFrameGroup.NextRotationKeyFrame; if (lastFrame != null && nextFrame != null) { float rotationInterpolationRate = vmdBoneFrameGroup.Interpolation.GetInterpolationValue(VMD.BoneKeyFrame.Interpolation.BezierCurveNames.Rotation, frameNumber, lastFrame.FrameNumber, nextFrame.FrameNumber); return(Quaternion.identity.PlusRotation(Quaternion.Slerp(lastFrame.Rotation, nextFrame.Rotation, rotationInterpolationRate))); } else if (lastFrame == null && nextFrame != null) { float rotationInterpolationRate = vmdBoneFrameGroup.Interpolation.GetInterpolationValue(VMD.BoneKeyFrame.Interpolation.BezierCurveNames.Rotation, frameNumber, 0, nextFrame.FrameNumber); return(Quaternion.identity.PlusRotation(Quaternion.Slerp(Quaternion.identity, nextFrame.Rotation, rotationInterpolationRate))); } else if (lastFrame != null && nextFrame == null) { return(Quaternion.identity.PlusRotation(lastFrame.Rotation)); } return(Quaternion.identity); }