コード例 #1
0
        /// <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);
            }
        }
 public override void Execute()
 {
     Constraint = Chain.bendConstraint;
 }
コード例 #3
0
        /// <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.Length != 5) chain = new FBIKChain[5];
            for (int i = 0; i < chain.Length; i++) {
                if (chain[i] == null) {
                    chain[i] = new FBIKChain();
                    chain[i].reach = 0.05f;
                }
            }

            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)

            };

            // 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);
        }