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); }
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); }
public void Initialize(IVRMLoadable vrmLoadable, IMessageReceiver receiver, IKTargetTransforms ikTargets) { _bodyIk = ikTargets.Body; vrmLoadable.VrmLoaded += OnVrmLoaded; vrmLoadable.VrmDisposing += OnVrmDisposing; var _ = new BodyMotionManagerReceiver(receiver, this); }
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; }
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() ); }