public float MatchingCost(MotionPose pose, MatchingGoal goal) { var trajectoryCost = TrajectoryCost(pose, goal); var feetPoseCose = FeetPoseCost(pose, goal); return(trajectoryCost + feetPoseCose); }
public float TrajectoryCost(MotionPose pose, MatchingGoal goal) { float cost = 0; if (pose.Trajectory.Count < LoopCount) { return(float.MaxValue); } var count = Math.Min(goal.Trajectory.Count, pose.Trajectory.Count); for (int i = 0; i < LoopCount; ++i) { var p = pose.Trajectory[i].Position; p.Y = 0; var hostLoc = goal.HostPlacement.Location; hostLoc.Y = goal.Trajectory[i].Y; cost += (goal.HostPlacement.Rotation * p + hostLoc - goal.Trajectory[i]).Length(); if (i + 1 >= goal.Trajectory.Count) { cost += pose.Trajectory[i].Velocity.Length(); } else { cost += (goal.HostPlacement.Rotation * pose.Trajectory[i].Velocity - (goal.Trajectory[i + 1] - goal.Trajectory[i]) * 30).Length(); } } return(cost); }
public static MotionPose CreateMotionPose(AnimNode.AnimationClip clip, long frameTime) { Pose.CGfxSkeletonPose animationPose = clip.GetAnimationSkeletonPose(frameTime); MotionPose motionPose = new MotionPose(clip.Name.GetHashCode(), frameTime, animationPose); motionPose.CalculateTrajectory(clip); return(motionPose); }
public MotionPose GetBestMatchingPose(MotionField field, MatchingGoal goal) { MotionPose bestMotionPose = null; float bestCost = float.MaxValue; //CGfxAnimationSequence beastAnim = null; for (int i = 0; i < field.MotionPoses.Count; ++i) { var cost = MatchingCost(field.MotionPoses[i], goal); if (cost < bestCost) { bestCost = cost; bestMotionPose = field.MotionPoses[i]; } } //foreach (var anim in field.Motions) //{ // var skeleton = CEngine.Instance.SkeletonAssetManager.GetSkeleton(CEngine.Instance.RenderContext, anim.Value.SkeletonAssetName); // var pose = skeleton.BoneTab.Clone(); // var cost = TrajectoryCost(anim.Value, goal, ref pose); // if (cost < bestCost) // { // bestCost = cost; // bestPose = pose; // beastAnim = anim.Value; // } //} //if (CurrentAnim == beastAnim) //{ // AnimTime += CEngine.Instance.EngineElapseTime; // CurrentAnim.SkeletonAction.GetAnimaPose(AnimTime, ref bestPose); //} //else //{ // CurrentAnim = beastAnim; // CurrentAnim.SkeletonAction.GetAnimaPose(0, ref bestPose); // AnimTime = 0; // EngineNS.Profiler.Log.WriteLine(Profiler.ELogTag.Info, "haha", CurrentAnim.Name.PureName()); //} return(bestMotionPose); }
public float FeetPoseCost(MotionPose pose, MatchingGoal goal) { if (goal.CurrentPose == null) { return(0); } float cost = 0; if (curLFootBone == null) { curLFootBone = goal.CurrentPose.FindBonePose("foot_l"); } if (curRFootBone == null) { curRFootBone = goal.CurrentPose.FindBonePose("root_r"); } if (preLFootBone == null) { preLFootBone = pose.AnimationPose.FindBonePose("foot_l"); } if (preRFootBone == null) { preRFootBone = pose.AnimationPose.FindBonePose("foot_r"); } Skeleton.CGfxMotionState preData = new Skeleton.CGfxMotionState(); Skeleton.CGfxMotionState curData = new Skeleton.CGfxMotionState(); preLFootBone.GetMotionData(ref preData); preLFootBone.GetMotionData(ref curData); cost += (curData.Position - preData.Position).Length(); cost += (curData.Velocity - preData.Velocity).Length(); preRFootBone.GetMotionData(ref preData); preRFootBone.GetMotionData(ref curData); cost += (curData.Position - preData.Position).Length(); cost += (curData.Velocity - preData.Velocity).Length(); return(cost); }