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 Vector3 ForwardStep(Chain chain, Transform target, int startJoint) { Vector3 startJointPos = chain.GetJoints()[startJoint].Position; chain.AttachBoneToChildPos(chain.BoneCount - 1, target.position, false); int i = chain.BoneCount - 2; while (i >= startJoint) { chain.AttachBoneToChild(i, false); i--; } return(startJointPos); }
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(); } }