private static FullBodyBipedIK AddFBBIK(GameObject go, IKTargetTransforms ikTargets, BipedReferences reference)
        {
            var fbbik = go.AddComponent <FullBodyBipedIK>();

            fbbik.SetReferences(reference, null);

            //IK目標をロードしたVRMのspineに合わせることで、BodyIKがいきなり動いてしまうのを防ぐ。
            //bodyTargetは実際には多階層なので当て方に注意
            ikTargets.Body.position                  = reference.spine[0].position;
            fbbik.solver.bodyEffector.target         = ikTargets.Body;
            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         = ikTargets.LeftHand;
            fbbik.solver.leftHandEffector.positionWeight = 1.0f;
            fbbik.solver.leftHandEffector.rotationWeight = 1.0f;

            fbbik.solver.rightHandEffector.target         = ikTargets.RightHand;
            fbbik.solver.rightHandEffector.positionWeight = 1.0f;
            fbbik.solver.rightHandEffector.rotationWeight = 1.0f;

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

            return(fbbik);
        }
Esempio n. 2
0
        public void Initialize(
            IVRMLoadable vrmLoadable,
            Camera mainCam,
            IKTargetTransforms ikTargets,
            FaceControlConfiguration faceControlConfig)
        {
            _camera            = mainCam.transform;
            _lookAtTarget      = ikTargets.LookAt;
            _faceControlConfig = faceControlConfig;

            vrmLoadable.VrmLoaded += info =>
            {
                _head          = info.animator.GetBoneTransform(HumanBodyBones.Head);
                _lookAtIk      = info.vrmRoot.GetComponent <LookAtIK>();
                _vrmLookAtHead = info.vrmRoot.GetComponent <VRMLookAtHead>();
                _hasModel      = true;
            };
            vrmLoadable.VrmDisposing += () =>
            {
                _hasModel      = false;
                _lookAtIk      = null;
                _vrmLookAtHead = null;
                _head          = null;
            };
        }
        public static void SetupVrm(GameObject go, IKTargetTransforms ikTargets)
        {
            var animator = go.GetComponent <Animator>();

            animator.applyRootMotion = false;

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

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

            vrmLookAt.Target = ikTargets.LookAt;

            //NOTE: BlendShape式のはパラメータ調整をしない:
            //VRoidがBone方式を採用しているので、そっちだけやっとけばよいかなあという判断です。
            var vrmLookAtBoneApplier = go.GetComponent <VRMLookAtBoneApplyer>();

            if (vrmLookAtBoneApplier != null)
            {
                vrmLookAtBoneApplier.HorizontalInner.CurveYRangeDegree = 15;
                vrmLookAtBoneApplier.HorizontalOuter.CurveYRangeDegree = 15;
                vrmLookAtBoneApplier.VerticalDown.CurveYRangeDegree    = 10;
                vrmLookAtBoneApplier.VerticalUp.CurveYRangeDegree      = 20;
            }


            AddLookAtIK(go, ikTargets.LookAt, animator, bipedReferences.root);
            AddFingerRigToRightIndex(animator, ikTargets);
        }
Esempio n. 4
0
 public void Initialize(IVRMLoadable vrmLoadable, IMessageReceiver receiver, IKTargetTransforms ikTargets)
 {
     _bodyIk = ikTargets.Body;
     vrmLoadable.VrmLoaded    += OnVrmLoaded;
     vrmLoadable.VrmDisposing += OnVrmDisposing;
     var _ = new BodyMotionManagerReceiver(receiver, this);
 }
Esempio n. 5
0
        public void Initialize(
            IMessageSender sender,
            IMessageReceiver receiver,
            VRMPreviewCanvas previewCanvas,
            IKTargetTransforms ikTargets,
            ErrorIndicateSender errorSender,
            ErrorInfoFactory errorInfoFactory
            )
        {
            _sender        = sender;
            _previewCanvas = previewCanvas;
            _ikTargets     = ikTargets;

            _errorSender      = errorSender;
            _errorInfoFactory = errorInfoFactory;

            receiver.AssignCommandHandler(
                VmmCommands.OpenVrmPreview,
                message => LoadModelForPreview(message.Content)
                );
            receiver.AssignCommandHandler(
                VmmCommands.OpenVrm,
                message =>
            {
                previewCanvas.Hide();
                LoadModel(message.Content);
            });
            receiver.AssignCommandHandler(
                VmmCommands.CancelLoadVrm,
                _ => previewCanvas.Hide()
                );
        }
        private static void AddFingerRigToRightIndex(Animator animator, IKTargetTransforms ikTargets)
        {
            //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),
                ikTargets.RightIndex
                );
            //とりあえず無効化し、有効にするのはInputDeviceToMotionの責務にする
            fingerRig.weight = 0.0f;
            fingerRig.fingers[0].rotationDOF    = Finger.DOF.One;
            fingerRig.fingers[0].weight         = 1.0f;
            fingerRig.fingers[0].rotationWeight = 0;
        }
Esempio n. 7
0
 public void Initialize(
     IMessageReceiver receiver,
     VRMPreviewCanvas previewCanvas,
     IKTargetTransforms ikTargets
     )
 {
     _previewCanvas = previewCanvas;
     _ikTargets     = ikTargets;
     receiver.AssignCommandHandler(
         VmmCommands.OpenVrmPreview,
         message => LoadModelForPreview(message.Content)
         );
     receiver.AssignCommandHandler(
         VmmCommands.OpenVrm,
         message =>
     {
         previewCanvas.Hide();
         LoadModel(message.Content);
     });
     receiver.AssignCommandHandler(
         VmmCommands.CancelLoadVrm,
         _ => previewCanvas.Hide()
         );
 }