public override void Execute() { Head = Solver.headMapping; LeftArmLimbMapping = Solver.leftArmMapping; RightArmLimbMapping = Solver.rightArmMapping; LeftLegLimbMapping = Solver.leftLegMapping; RightLegLimbMapping = Solver.rightLegMapping; SpineMapping = Solver.spineMapping; }
/// <summary> /// Sets up the solver to BipedReferences and reinitiates (if in runtime). /// </summary> /// <param name="references">Biped references.</param> /// <param name="rootNode">Root node (optional). if null, will try to detect the root node bone automatically. </param> public void SetToReferences(BipedReferences references, Transform rootNode = null) { if (rootNode == null) { rootNode = DetectRootNodeBone(references); } this.rootNode = rootNode; // Root Node if (chain == null) { chain = new FBIKChain(); } chain.pin = 0f; chain.SetNodes(rootNode); if (chain.children.Length != 4) { chain.children = new FBIKChain[4]; } // Left Arm if (chain.children[0] == null) { chain.children[0] = new FBIKChain(); chain.children[0].reach = 0.05f; } chain.children[0].SetNodes(references.leftUpperArm, references.leftForearm, references.leftHand); // Right Arm if (chain.children[1] == null) { chain.children[1] = new FBIKChain(); chain.children[1].reach = 0.05f; } chain.children[1].SetNodes(references.rightUpperArm, references.rightForearm, references.rightHand); // Left Leg if (chain.children[2] == null) { chain.children[2] = new FBIKChain(); chain.children[2].reach = 0.05f; } chain.children[2].SetNodes(references.leftThigh, references.leftCalf, references.leftFoot); // Right Leg if (chain.children[3] == null) { chain.children[3] = new FBIKChain(); chain.children[3].reach = 0.05f; } chain.children[3].SetNodes(references.rightThigh, references.rightCalf, references.rightFoot); // Effectors if (effectors.Length != 9) { effectors = new IKEffector[9] { new IKEffector(), new IKEffector(), new IKEffector(), new IKEffector(), new IKEffector(), new IKEffector(), new IKEffector(), new IKEffector(), new IKEffector() } } ; effectors[0].bone = rootNode; effectors[0].childBones = new Transform[2] { references.leftThigh, references.rightThigh }; effectors[1].bone = references.leftUpperArm; effectors[2].bone = references.rightUpperArm; effectors[3].bone = references.leftThigh; effectors[4].bone = references.rightThigh; effectors[5].bone = references.leftHand; effectors[6].bone = references.rightHand; effectors[7].bone = references.leftFoot; effectors[8].bone = references.rightFoot; effectors[5].planeBone1 = references.leftUpperArm; effectors[5].planeBone2 = references.rightUpperArm; effectors[5].planeBone3 = rootNode; effectors[6].planeBone1 = references.rightUpperArm; effectors[6].planeBone2 = references.leftUpperArm; effectors[6].planeBone3 = rootNode; effectors[7].planeBone1 = references.leftThigh; effectors[7].planeBone2 = references.rightThigh; effectors[7].planeBone3 = rootNode; effectors[7].mode = IKEffector.Mode.MaintainAnimatedPosition; effectors[8].planeBone1 = references.rightThigh; effectors[8].planeBone2 = references.leftThigh; effectors[8].planeBone3 = rootNode; effectors[8].mode = IKEffector.Mode.MaintainAnimatedPosition; effectors[5].isEndEffector = true; effectors[6].isEndEffector = true; effectors[7].isEndEffector = true; effectors[8].isEndEffector = true; // Child Constraints chain.childConstraints = new FBIKChain.ChildConstraint[4] { new FBIKChain.ChildConstraint(references.leftUpperArm, references.rightThigh, 0f, 1f), new FBIKChain.ChildConstraint(references.rightUpperArm, references.leftThigh, 0f, 1f), new FBIKChain.ChildConstraint(references.leftUpperArm, references.rightUpperArm), new FBIKChain.ChildConstraint(references.leftThigh, references.rightThigh) }; // Bend Constraints if (bendConstraints.Length != 4) { bendConstraints = new IKConstraintBend[4] { new IKConstraintBend(), new IKConstraintBend(), new IKConstraintBend(), new IKConstraintBend() }; } bendConstraints[0].SetBones(references.leftUpperArm, references.leftForearm, references.leftHand); bendConstraints[1].SetBones(references.rightUpperArm, references.rightForearm, references.rightHand); bendConstraints[2].SetBones(references.leftThigh, references.leftCalf, references.leftFoot); bendConstraints[3].SetBones(references.rightThigh, references.rightCalf, references.rightFoot); // IKMappingSpine Transform[] spineBones = new Transform[references.spine.Length + 1]; spineBones[0] = references.pelvis; for (int i = 0; i < references.spine.Length; i++) { spineBones[i + 1] = references.spine[i]; } if (spineMapping == null) { spineMapping = new IKMappingSpine(); spineMapping.iterations = 3; } spineMapping.SetBones(spineBones, references.leftUpperArm, references.rightUpperArm, references.leftThigh, references.rightThigh); // IKMappingBone int boneMappingsCount = references.head != null? 1: 0; if (boneMappings.Length != boneMappingsCount) { boneMappings = new IKMappingBone[boneMappingsCount]; for (int i = 0; i < boneMappings.Length; i++) { boneMappings[i] = new IKMappingBone(); } if (boneMappingsCount == 1) { boneMappings[0].maintainRotationWeight = 0f; } } if (boneMappings.Length > 0) { boneMappings[0].bone = references.head; } // IKMappingLimb if (limbMappings.Length != 4) { limbMappings = new IKMappingLimb[4] { new IKMappingLimb(), new IKMappingLimb(), new IKMappingLimb(), new IKMappingLimb() }; limbMappings[2].maintainRotationWeight = 1f; limbMappings[3].maintainRotationWeight = 1f; } limbMappings[0].SetBones(references.leftUpperArm, references.leftForearm, references.leftHand, GetLeftClavicle(references)); limbMappings[1].SetBones(references.rightUpperArm, references.rightForearm, references.rightHand, GetRightClavicle(references)); limbMappings[2].SetBones(references.leftThigh, references.leftCalf, references.leftFoot); limbMappings[3].SetBones(references.rightThigh, references.rightCalf, references.rightFoot); if (Application.isPlaying) { Initiate(references.root); } }
/// <summary> /// Sets up the solver to BipedReferences and reinitiates (if in runtime). /// </summary> /// <param name="references">Biped references.</param> /// <param name="rootNode">Root node (optional). if null, will try to detect the root node bone automatically. </param> public void SetToReferences(BipedReferences references, Transform rootNode = null) { root = references.root; if (rootNode == null) rootNode = DetectRootNodeBone(references); this.rootNode = rootNode; // Root Node if (chain == null || chain.Length != 5) chain = new FBIKChain[5]; for (int i = 0; i < chain.Length; i++) { if (chain[i] == null) { chain[i] = new FBIKChain(); } } chain[0].pin = 0f; chain[0].SetNodes(rootNode); chain[0].children = new int[4] { 1, 2, 3, 4 }; // Left Arm chain[1].SetNodes(references.leftUpperArm, references.leftForearm, references.leftHand); // Right Arm chain[2].SetNodes(references.rightUpperArm, references.rightForearm, references.rightHand); // Left Leg chain[3].SetNodes(references.leftThigh, references.leftCalf, references.leftFoot); // Right Leg chain[4].SetNodes(references.rightThigh, references.rightCalf, references.rightFoot); // Effectors if (effectors.Length != 9) effectors = new IKEffector[9] { new IKEffector(), new IKEffector(), new IKEffector(), new IKEffector(), new IKEffector(), new IKEffector(), new IKEffector(), new IKEffector(), new IKEffector() }; effectors[0].bone = rootNode; effectors[0].childBones = new Transform[2] { references.leftThigh, references.rightThigh }; effectors[1].bone = references.leftUpperArm; effectors[2].bone = references.rightUpperArm; effectors[3].bone = references.leftThigh; effectors[4].bone = references.rightThigh; effectors[5].bone = references.leftHand; effectors[6].bone = references.rightHand; effectors[7].bone = references.leftFoot; effectors[8].bone = references.rightFoot; effectors[5].planeBone1 = references.leftUpperArm; effectors[5].planeBone2 = references.rightUpperArm; effectors[5].planeBone3 = rootNode; effectors[6].planeBone1 = references.rightUpperArm; effectors[6].planeBone2 = references.leftUpperArm; effectors[6].planeBone3 = rootNode; effectors[7].planeBone1 = references.leftThigh; effectors[7].planeBone2 = references.rightThigh; effectors[7].planeBone3 = rootNode; effectors[8].planeBone1 = references.rightThigh; effectors[8].planeBone2 = references.leftThigh; effectors[8].planeBone3 = rootNode; // Child Constraints chain[0].childConstraints = new FBIKChain.ChildConstraint[4] { new FBIKChain.ChildConstraint(references.leftUpperArm, references.rightThigh, 0f, 1f), new FBIKChain.ChildConstraint(references.rightUpperArm, references.leftThigh, 0f, 1f), new FBIKChain.ChildConstraint(references.leftUpperArm, references.rightUpperArm), new FBIKChain.ChildConstraint(references.leftThigh, references.rightThigh) }; // IKMappingSpine Transform[] spineBones = new Transform[references.spine.Length + 1]; spineBones[0] = references.pelvis; for (int i = 0; i < references.spine.Length; i++) { spineBones[i + 1] = references.spine[i]; } if (spineMapping == null) { spineMapping = new IKMappingSpine(); spineMapping.iterations = 3; } spineMapping.SetBones(spineBones, references.leftUpperArm, references.rightUpperArm, references.leftThigh, references.rightThigh); // IKMappingBone int boneMappingsCount = references.head != null? 1: 0; if (boneMappings.Length != boneMappingsCount) { boneMappings = new IKMappingBone[boneMappingsCount]; for (int i = 0; i < boneMappings.Length; i++) { boneMappings[i] = new IKMappingBone(); } if (boneMappingsCount == 1) boneMappings[0].maintainRotationWeight = 0f; } if (boneMappings.Length > 0) boneMappings[0].bone = references.head; // IKMappingLimb if (limbMappings.Length != 4) { limbMappings = new IKMappingLimb[4] { new IKMappingLimb(), new IKMappingLimb(), new IKMappingLimb(), new IKMappingLimb() }; limbMappings[2].maintainRotationWeight = 1f; limbMappings[3].maintainRotationWeight = 1f; } limbMappings[0].SetBones(references.leftUpperArm, references.leftForearm, references.leftHand, GetLeftClavicle(references)); limbMappings[1].SetBones(references.rightUpperArm, references.rightForearm, references.rightHand, GetRightClavicle(references)); limbMappings[2].SetBones(references.leftThigh, references.leftCalf, references.leftFoot); limbMappings[3].SetBones(references.rightThigh, references.rightCalf, references.rightFoot); if (Application.isPlaying) Initiate(references.root); }