Exemplo n.º 1
0
        public static void SetupVrm(GameObject go, VrmLoadSetting setting)
        {
            var animator = go.GetComponent <Animator>();

            animator.applyRootMotion           = false;
            animator.runtimeAnimatorController = setting.runtimeAnimatorController;

            var bipedReferences = LoadReferencesFromVrm(go.transform, animator);

            //FBBIKの前と後どっちだと適切に動くか要チェック
            AddTwistRelaxers(go, animator);

            AddFBBIK(go, setting, bipedReferences);

            var vrmLookAt = go.GetComponent <VRMLookAtHead>();

            vrmLookAt.Target = setting.headTarget;

            AddLookAtIK(go, setting.headTarget, animator, bipedReferences.root);
            //要らない: FBBIKのrotation weightでやった方がよい
            //AddHorizontalHand(go, animator);
            AddFingerAnimator(go, animator);

            go.AddComponent <VRMBlink>();
            setting.inputToMotion.rightHandBone = animator.GetBoneTransform(HumanBodyBones.RightHand);
        }
        private static FullBodyBipedIK AddFBBIK(GameObject go, VrmLoadSetting setting, BipedReferences reference)
        {
            var fbbik = go.AddComponent <FullBodyBipedIK>();

            fbbik.SetReferences(reference, null);

            //IK目標をロードしたVRMのspineに合わせることで、BodyIKがいきなり動いてしまうのを防ぐ。
            //bodyTargetは実際には多階層なので当て方に注意
            setting.bodyTarget.position              = reference.spine[0].position;
            fbbik.solver.bodyEffector.target         = setting.bodyTarget;
            fbbik.solver.bodyEffector.positionWeight = 0.5f;
            //Editorで "FBBIK > Body > Mapping > Maintain Head Rot"を選んだ時の値を↓で入れてる(デフォルト0、ある程度大きくするとLook Atの見栄えがよい)
            fbbik.solver.boneMappings[0].maintainRotationWeight = 0.7f;

            fbbik.solver.leftHandEffector.target         = setting.leftHandTarget;
            fbbik.solver.leftHandEffector.positionWeight = 1.0f;
            fbbik.solver.leftHandEffector.rotationWeight = 1.0f;

            fbbik.solver.rightHandEffector.target         = setting.rightHandTarget;
            fbbik.solver.rightHandEffector.positionWeight = 1.0f;
            fbbik.solver.rightHandEffector.rotationWeight = 1.0f;

            //small pull: プレゼンモード中にキャラが吹っ飛んでいかないための対策
            fbbik.solver.rightArmChain.pull = 0.1f;

            return(fbbik);
        }
Exemplo n.º 3
0
        private static void AddFBBIK(GameObject go, VrmLoadSetting setting, BipedReferences reference)
        {
            var fbbik = go.AddComponent <FullBodyBipedIK>();

            fbbik.SetReferences(reference, null);

            fbbik.solver.leftHandEffector.target         = setting.leftHandTarget;
            fbbik.solver.leftHandEffector.positionWeight = 1.0f;

            fbbik.solver.rightHandEffector.target         = setting.rightHandTarget;
            fbbik.solver.rightHandEffector.positionWeight = 1.0f;
        }
        private static void AddFingerRigToRightIndex(Animator animator, VrmLoadSetting setting)
        {
            //NOTE: FinalIKのサンプルにあるFingerRigを持ち込んでみる。
            var rightHand = animator.GetBoneTransform(HumanBodyBones.RightHand);

            var fingerRig = rightHand.gameObject.AddComponent <FingerRig>();

            fingerRig.AddFinger(
                animator.GetBoneTransform(HumanBodyBones.RightIndexProximal),
                animator.GetBoneTransform(HumanBodyBones.RightIndexIntermediate),
                animator.GetBoneTransform(HumanBodyBones.RightIndexDistal),
                setting.rightIndexTarget
                );
            //とりあえず無効化し、有効にするのはInputDeviceToMotionの責務にする
            fingerRig.weight = 0.0f;
            fingerRig.fingers[0].rotationDOF    = Finger.DOF.One;
            fingerRig.fingers[0].weight         = 1.0f;
            fingerRig.fingers[0].rotationWeight = 0;
        }
Exemplo n.º 5
0
        private static void AddFBBIK(GameObject go, VrmLoadSetting setting, BipedReferences reference)
        {
            var fbbik = go.AddComponent <FullBodyBipedIK>();

            fbbik.SetReferences(reference, null);

            //weightを仕込んでも最初でいきなり動かないようにする。
            //このとき、bodyTarget自体は(呼吸ライクに動かしたいので)別のスクリプトが入ってるため、親を移動する
            setting.bodyTarget.parent.position       = reference.spine[0].position;
            fbbik.solver.bodyEffector.target         = setting.bodyTarget;
            fbbik.solver.bodyEffector.positionWeight = 0.5f;
            //Editorで "FBBIK > Body > Mapping > Maintain Head Rot"を選んだ時の値を↓で入れてる(デフォルト0、ある程度大きくするとLook Atの見栄えがよい)
            fbbik.solver.boneMappings[0].maintainRotationWeight = 0.7f;

            fbbik.solver.leftHandEffector.target         = setting.leftHandTarget;
            fbbik.solver.leftHandEffector.positionWeight = 1.0f;
            fbbik.solver.leftHandEffector.rotationWeight = 1.0f;

            fbbik.solver.rightHandEffector.target         = setting.rightHandTarget;
            fbbik.solver.rightHandEffector.positionWeight = 1.0f;
            fbbik.solver.rightHandEffector.rotationWeight = 1.0f;
        }
        public static void SetIK(GameObject root, VrmLoadSetting setting)
        {
            var animator = root.GetComponent <Animator>();

            animator.applyRootMotion = false;

            var bipedReferences = LoadReferencesFromVrm(root.transform, animator);
            var ik = AddFBBIK(root, setting, bipedReferences);

            var vrmLookAt = root.GetComponent <VRMLookAtHead>();

            vrmLookAt.Target = setting.headTarget;

            var vrmLookAtBoneApplier = root.GetComponent <VRMLookAtBoneApplyer>();

//            vrmLookAtBoneApplier.HorizontalInner.CurveYRangeDegree = 15;
//           vrmLookAtBoneApplier.HorizontalOuter.CurveYRangeDegree = 15;
            //vrmLookAtBoneApplier.VerticalDown.CurveYRangeDegree = 10;
            //vrmLookAtBoneApplier.VerticalUp.CurveYRangeDegree = 20;

            AddLookAtIK(root, setting.headTarget, animator, bipedReferences.root);
            AddFingerRigToRightIndex(animator, setting);
        }