private float PerformOneIteration(Chain chain, Transform target) { int boneCount = chain.BoneCount; // FORWARD STEP chain.AttachBoneToChildPos(boneCount - 1, target.position, false); int i = boneCount - 2; while (i >= 0) { chain.AttachBoneToChild(i--, false); // TODO: Constraints } //BACKWARD STEP chain.AttachBoneToParentPos(0, chain.OriginalRootPos, false); i = 1; while (i < boneCount) { chain.AttachBoneToParent(i++, false); // TODO: Constraints } return(Vector3.Distance(chain.EndEffector.Position, target.position)); }
private static void BackwardStep(Chain chain, Transform target, int startJoint, Vector3 startJointPos) { chain.AttachBoneToParentPos(startJoint, startJointPos, false); int i = startJoint + 1; while (i < chain.BoneCount) { chain.AttachBoneToParent(i, false); i++; } }
private void Update() { if (Input.GetKeyDown(KeyCode.Space)) { show = !show; } if (Input.GetKeyDown(KeyCode.I)) { // Apply IK Chain c = visualizer.GetChain(); c.GetBone(1).Move(new Vector3(1, 0, 0)); visualizer.SetChain(c); } if (Input.GetKeyDown(KeyCode.Alpha1)) { Chain c = visualizer.GetChain(); c.AttachBoneToParent(1); visualizer.SetChain(c); } if (Input.GetKeyDown(KeyCode.Alpha2)) { Chain c = visualizer.GetChain(); c.AttachBoneToParent(1, false); visualizer.SetChain(c); } if (Input.GetKeyDown(KeyCode.Alpha3)) { Chain c = visualizer.GetChain(); c.AttachBoneToChild(0); visualizer.SetChain(c); } if (Input.GetKeyDown(KeyCode.Alpha4)) { Chain c = visualizer.GetChain(); c.AttachBoneToChild(0, false); visualizer.SetChain(c); } if (Input.GetKeyDown(KeyCode.F)) { if (target == null) { return; } Chain c = visualizer.GetChain(); Chain_FABRIK.Solve(c, target); visualizer.SetChain(c); } if (Input.GetKeyDown(KeyCode.A)) { applyTransforms = !applyTransforms; } if (show) { visualizer.Show(); } else { visualizer.Hide(); } }