Exemple #1
0
        private void Start()
        {
            _vrikManager  = GetComponentInChildren <VRIKManager>();
            _dynamicBones = GetComponentsInChildren <BeatSaberDynamicBone::DynamicBone>();

            _vrik = _ikHelper.InitializeVRIK(_vrikManager, transform);

            _fixTransforms      = _vrikManager.fixTransforms;
            _vrik.fixTransforms = false; // FixTransforms is manually called in Update

            foreach (TwistRelaxer twistRelaxer in _twistRelaxers)
            {
                twistRelaxer.ik      = _vrik;
                twistRelaxer.enabled = true;
            }

            if (_vrikManager.solver_spine_maintainPelvisPosition > 0 && !_input.allowMaintainPelvisPosition)
            {
                _logger.Warning("solver.spine.maintainPelvisPosition > 0 is not recommended because it can cause strange pelvis rotation issues. To allow maintainPelvisPosition > 0, please set allowMaintainPelvisPosition to true for your avatar in the configuration file.");
                _vrik.solver.spine.maintainPelvisPosition = 0;
            }

            _input.inputChanged += OnInputChanged;

            UpdateSolverTargets();
            SetLocomotionEnabled(_avatar.isLocomotionEnabled);
        }
 private void CopyReferencesFromExistingVrik(VRIKManager vrikManager, VRIK.References references)
 {
     vrikManager.references_root          = references.root;
     vrikManager.references_pelvis        = references.pelvis;
     vrikManager.references_spine         = references.spine;
     vrikManager.references_chest         = references.chest;
     vrikManager.references_neck          = references.neck;
     vrikManager.references_head          = references.head;
     vrikManager.references_leftShoulder  = references.leftShoulder;
     vrikManager.references_leftUpperArm  = references.leftUpperArm;
     vrikManager.references_leftForearm   = references.leftForearm;
     vrikManager.references_leftHand      = references.leftHand;
     vrikManager.references_rightShoulder = references.rightShoulder;
     vrikManager.references_rightUpperArm = references.rightUpperArm;
     vrikManager.references_rightForearm  = references.rightForearm;
     vrikManager.references_rightHand     = references.rightHand;
     vrikManager.references_leftThigh     = references.leftThigh;
     vrikManager.references_leftCalf      = references.leftCalf;
     vrikManager.references_leftFoot      = references.leftFoot;
     vrikManager.references_leftToes      = references.leftToes;
     vrikManager.references_rightThigh    = references.rightThigh;
     vrikManager.references_rightCalf     = references.rightCalf;
     vrikManager.references_rightFoot     = references.rightFoot;
     vrikManager.references_rightToes     = references.rightToes;
 }
Exemple #3
0
        /// <summary>
        /// Measure avatar arm span. Since the player's measured arm span is actually from palm to palm
        /// (approximately) due to the way the controllers are held, this isn't "true" arm span.
        /// </summary>
        private float GetArmSpan(VRIKManager vrikManager)
        {
            if (!vrikManager)
            {
                return(BeatSaberUtilities.kDefaultPlayerArmSpan);
            }

            Transform leftShoulder = vrikManager.references_leftShoulder;
            Transform leftUpperArm = vrikManager.references_leftUpperArm;
            Transform leftLowerArm = vrikManager.references_leftForearm;

            Transform rightShoulder = vrikManager.references_rightShoulder;
            Transform rightUpperArm = vrikManager.references_rightUpperArm;
            Transform rightLowerArm = vrikManager.references_rightForearm;

            if (!leftShoulder || !leftUpperArm || !leftLowerArm || !rightShoulder || !rightUpperArm || !rightLowerArm)
            {
                _logger.Warning("Could not calculate avatar arm span due to missing bones");
                return(BeatSaberUtilities.kDefaultPlayerArmSpan);
            }

            if (!leftHand || !rightHand)
            {
                _logger.Warning("Could not calculate avatar arm span due to missing tracking references");
                return(BeatSaberUtilities.kDefaultPlayerArmSpan);
            }

            float leftArmLength              = Vector3.Distance(leftShoulder.position, leftUpperArm.position) + Vector3.Distance(leftUpperArm.position, leftLowerArm.position) + Vector3.Distance(leftLowerArm.position, leftHand.position);
            float rightArmLength             = Vector3.Distance(rightShoulder.position, rightUpperArm.position) + Vector3.Distance(rightUpperArm.position, rightLowerArm.position) + Vector3.Distance(rightLowerArm.position, rightHand.position);
            float shoulderToShoulderDistance = Vector3.Distance(leftShoulder.position, rightShoulder.position);

            float totalLength = leftArmLength + shoulderToShoulderDistance + rightArmLength;

            return(totalLength);
        }
 private void FixTrackingReferences(VRIKManager vrikManager)
 {
     FixTrackingReference("Head", head, vrikManager.references_head, vrikManager.solver_spine_headTarget);
     FixTrackingReference("Left Hand", leftHand, vrikManager.references_leftHand, vrikManager.solver_leftArm_target);
     FixTrackingReference("Right Hand", rightHand, vrikManager.references_rightHand, vrikManager.solver_rightArm_target);
     FixTrackingReference("Waist", pelvis, vrikManager.references_pelvis, vrikManager.solver_spine_pelvisTarget);
     FixTrackingReference("Left Foot", leftLeg, vrikManager.references_leftToes ?? vrikManager.references_leftFoot, vrikManager.solver_leftLeg_target);
     FixTrackingReference("Right Foot", rightLeg, vrikManager.references_rightToes ?? vrikManager.references_rightFoot, vrikManager.solver_rightLeg_target);
 }
Exemple #5
0
        public VRIK InitializeVRIK(VRIKManager vrikManager, Transform root)
        {
            VRIK vrik = vrikManager.gameObject.AddComponent <VRIK>();

            CreateTargetsIfMissing(vrikManager, root);
            CopyManagerFieldsToVRIK(vrikManager, vrik);

            return(vrik);
        }
Exemple #6
0
 private void CreateTargetsIfMissing(VRIKManager vrikManager, Transform root)
 {
     vrikManager.solver_spine_headTarget   = CreateTargetIfMissing(vrikManager.solver_spine_headTarget, vrikManager.references_head, root.Find("Head"));
     vrikManager.solver_leftArm_target     = CreateTargetIfMissing(vrikManager.solver_leftArm_target, vrikManager.references_leftHand, root.Find("LeftHand"));
     vrikManager.solver_rightArm_target    = CreateTargetIfMissing(vrikManager.solver_rightArm_target, vrikManager.references_rightHand, root.Find("RightHand"));
     vrikManager.solver_spine_pelvisTarget = CreateTargetIfMissing(vrikManager.solver_spine_pelvisTarget, vrikManager.references_pelvis, root.Find("Pelvis"));
     vrikManager.solver_leftLeg_target     = CreateTargetIfMissing(vrikManager.solver_leftLeg_target, vrikManager.references_leftToes ?? vrikManager.references_leftFoot, root.Find("LeftLeg"));
     vrikManager.solver_rightLeg_target    = CreateTargetIfMissing(vrikManager.solver_rightLeg_target, vrikManager.references_rightToes ?? vrikManager.references_rightFoot, root.Find("RightLeg"));
 }
Exemple #7
0
        /// <summary>
        /// Gets the offset between the head target and the actual head bone. Avoids issues when using
        /// the Head transform for calculations.
        /// </summary>
        private Vector3 GetHeadTargetOffset()
        {
            Transform headReference = null;
            Transform headTarget    = null;

            #pragma warning disable 618
            VRIK              vrik              = gameObject.GetComponentInChildren <VRIK>();
            IKManager         ikManager         = gameObject.GetComponentInChildren <IKManager>();
            IKManagerAdvanced ikManagerAdvanced = gameObject.GetComponentInChildren <IKManagerAdvanced>();
            #pragma warning restore 618

            VRIKManager vrikManager = gameObject.GetComponentInChildren <VRIKManager>();

            if (vrikManager)
            {
                if (!vrikManager.references_head)
                {
                    vrikManager.AutoDetectReferences();
                }

                headReference = vrikManager.references_head;
                headTarget    = vrikManager.solver_spine_headTarget;
            }
            else if (vrik)
            {
                vrik.AutoDetectReferences();
                headReference = vrik.references.head;

                if (ikManagerAdvanced)
                {
                    headTarget = ikManagerAdvanced.HeadTarget;
                }
                else if (ikManager)
                {
                    headTarget = ikManager.HeadTarget;
                }
            }

            if (!headReference)
            {
                Plugin.logger.Warn("Could not find head reference; height adjust may be broken");
                return(Vector3.zero);
            }

            if (!headTarget)
            {
                Plugin.logger.Warn("Could not find head target; height adjust may be broken");
                return(Vector3.zero);
            }

            return(headTarget.position - headReference.position);
        }
        public void Start()
        {
            Plugin.logger.Warn("Avatar is still using the legacy IKManagerAdvanced; please migrate to VRIKManager");

            VRIKManager vrikManager = gameObject.AddComponent <VRIKManager>();

            vrikManager.solver_spine_headTarget = this.HeadTarget;
            vrikManager.solver_leftArm_target   = this.LeftHandTarget;
            vrikManager.solver_rightArm_target  = this.RightHandTarget;

            Type type = this.GetType();

            FieldInfo[] fieldInfos = type.GetFields(BindingFlags.Instance | BindingFlags.Public);
            foreach (FieldInfo fieldInfo in fieldInfos)
            {
                string[] propertyName = fieldInfo.Name.Split('_');
                var      value        = fieldInfo.GetValue(this);

                if (propertyName.Length > 1)
                {
                    if ("Spine" == propertyName[0])
                    {
                        SetProperty(vrikManager, "solver_spine_" + propertyName[1], value);
                    }
                    else if ("LeftArm" == propertyName[0])
                    {
                        SetProperty(vrikManager, "solver_leftArm_" + propertyName[1], value);
                    }
                    else if ("RightArm" == propertyName[0])
                    {
                        SetProperty(vrikManager, "solver_rightArm_" + propertyName[1], value);
                    }
                    else if ("LeftLeg" == propertyName[0])
                    {
                        SetProperty(vrikManager, "solver_leftLeg_" + propertyName[1], value);
                    }
                    else if ("RightLeg" == propertyName[0])
                    {
                        SetProperty(vrikManager, "solver_rightLeg_" + propertyName[1], value);
                    }
                    else if ("Locomotion" == propertyName[0])
                    {
                        SetProperty(vrikManager, "solver_locomotion_" + propertyName[1], value);
                    }
                }
            }
        }
Exemple #9
0
        #pragma warning disable CS0618
        private void ApplyIKManagerFields(VRIKManager vrikManager, IKManager ikManager)
        {
            vrikManager.solver_spine_headTarget = ikManager.HeadTarget;
            vrikManager.solver_leftArm_target   = ikManager.LeftHandTarget;
            vrikManager.solver_rightArm_target  = ikManager.RightHandTarget;

            if (!(ikManager is IKManagerAdvanced ikManagerAdvanced))
            {
                return;
            }

            FieldInfo[] fieldInfos = typeof(IKManagerAdvanced).GetFields(BindingFlags.Instance | BindingFlags.Public);
            foreach (FieldInfo fieldInfo in fieldInfos)
            {
                string[] propertyName = fieldInfo.Name.Split('_');
                var      value        = fieldInfo.GetValue(ikManagerAdvanced);

                if (propertyName.Length > 1)
                {
                    if ("Spine" == propertyName[0])
                    {
                        SetField(vrikManager, "solver_spine_" + propertyName[1], value);
                    }
                    else if ("LeftArm" == propertyName[0])
                    {
                        SetField(vrikManager, "solver_leftArm_" + propertyName[1], value);
                    }
                    else if ("RightArm" == propertyName[0])
                    {
                        SetField(vrikManager, "solver_rightArm_" + propertyName[1], value);
                    }
                    else if ("LeftLeg" == propertyName[0])
                    {
                        SetField(vrikManager, "solver_leftLeg_" + propertyName[1], value);
                    }
                    else if ("RightLeg" == propertyName[0])
                    {
                        SetField(vrikManager, "solver_rightLeg_" + propertyName[1], value);
                    }
                    else if ("Locomotion" == propertyName[0])
                    {
                        SetField(vrikManager, "solver_locomotion_" + propertyName[1], value);
                    }
                }
            }
        }
        public void Start()
        {
            VRIKManager vrikManager = gameObject.AddComponent <VRIKManager>();

            vrikManager.solver_spine_headTarget = this.HeadTarget;
            vrikManager.solver_leftArm_target   = this.LeftHandTarget;
            vrikManager.solver_rightArm_target  = this.RightHandTarget;

            Type type = this.GetType();

            FieldInfo[] fieldInfos = type.GetFields(BindingFlags.Instance | BindingFlags.Public);
            foreach (FieldInfo fieldInfo in fieldInfos)
            {
                string[] propertyName = fieldInfo.Name.Split('_');
                var      value        = fieldInfo.GetValue(this);

                if (propertyName.Count() > 1)
                {
                    if ("Spine" == propertyName[0])
                    {
                        SetProperty(vrikManager, "solver_spine_" + propertyName[1], value);
                    }
                    else if ("LeftArm" == propertyName[0])
                    {
                        SetProperty(vrikManager, "solver_leftArm_" + propertyName[1], value);
                    }
                    else if ("RightArm" == propertyName[0])
                    {
                        SetProperty(vrikManager, "solver_rightArm_" + propertyName[1], value);
                    }
                    else if ("LeftLeg" == propertyName[0])
                    {
                        SetProperty(vrikManager, "solver_leftLeg_" + propertyName[1], value);
                    }
                    else if ("RightLeg" == propertyName[0])
                    {
                        SetProperty(vrikManager, "solver_rightLeg_" + propertyName[1], value);
                    }
                    else if ("Locomotion" == propertyName[0])
                    {
                        SetProperty(vrikManager, "solver_locomotion_" + propertyName[1], value);
                    }
                }
            }
        }
        protected override void Start()
        {
            base.Start();

            _vrikManager  = GetComponentInChildren <VRIKManager>();
            _dynamicBones = GetComponentsInChildren <BeatSaberDynamicBone::DynamicBone>();

            _vrik = _vrikManager.vrik;
            _vrik.fixTransforms = false;

            _fixTransforms = _vrikManager.fixTransforms;

            _vrikManager.referencesUpdated += OnReferencesUpdated;

            OnReferencesUpdated();

            foreach (TwistRelaxer twistRelaxer in _twistRelaxers)
            {
                twistRelaxer.ik      = _vrik;
                twistRelaxer.enabled = true;
            }

            input.inputChanged += OnInputChanged;
        }
        private void Start()
        {
            _vrikManager  = GetComponentInChildren <VRIKManager>();
            _dynamicBones = GetComponentsInChildren <BeatSaberDynamicBone::DynamicBone>();

            _vrik = _vrikManager.vrik;
            _vrik.fixTransforms = false;

            _fixTransforms = _vrikManager.fixTransforms;

            CreateTargetsIfMissing();

            foreach (TwistRelaxer twistRelaxer in _twistRelaxers)
            {
                twistRelaxer.ik      = _vrik;
                twistRelaxer.enabled = true;
            }

            if (_vrikManager.solver_spine_maintainPelvisPosition > 0 && !_input.allowMaintainPelvisPosition)
            {
                _logger.Warning("solver.spine.maintainPelvisPosition > 0 is not recommended because it can cause strange pelvis rotation issues. To allow maintainPelvisPosition > 0, please set allowMaintainPelvisPosition to true for your avatar in the configuration file.");
                _vrik.solver.spine.maintainPelvisPosition = 0;
            }
        }
        internal void Construct(string fullPath, ILogger <AvatarPrefab> logger, IKHelper ikHelper, DiContainer container)
        {
            this.fullPath = fullPath ?? throw new ArgumentNullException(nameof(fullPath));
            descriptor    = GetComponent <AvatarDescriptor>() ?? throw new AvatarLoadException($"Avatar at '{fullPath}' does not have an AvatarDescriptor");

            fileName = Path.GetFileName(fullPath);

            _logger      = logger;
            _logger.name = descriptor.name;

#pragma warning disable CS0618
            VRIKManager vrikManager = GetComponentInChildren <VRIKManager>();
            IKManager   ikManager   = GetComponentInChildren <IKManager>();
#pragma warning restore CS0618

            // migrate IKManager/IKManagerAdvanced to VRIKManager
            if (ikManager)
            {
                if (!vrikManager)
                {
                    vrikManager = container.InstantiateComponent <VRIKManager>(gameObject);
                }

                _logger.Warning("IKManager and IKManagerAdvanced are deprecated; please migrate to VRIKManager");

                ApplyIKManagerFields(vrikManager, ikManager);
                Destroy(ikManager);
            }

            if (vrikManager)
            {
                if (!vrikManager.areReferencesFilled)
                {
                    _logger.Warning($"References are not filled on '{vrikManager.name}'; detecting references automatically");
                    vrikManager.AutoDetectReferences();
                }
            }

            // remove any existing VRIK instances
            foreach (VRIK existingVrik in GetComponentsInChildren <VRIK>())
            {
                _logger.Warning($"Found VRIK on '{existingVrik.name}'; manually adding VRIK to an avatar is no longer needed, please remove it");

                if (existingVrik && vrikManager && existingVrik.references.isFilled && !vrikManager.areReferencesFilled)
                {
                    _logger.Warning($"Copying references from VRIK on '{existingVrik.name}'; this is deprecated behaviour and will be removed in a future release");
                    CopyReferencesFromExistingVrik(vrikManager, existingVrik.references);
                }

                Destroy(existingVrik);
            }

            if (vrikManager)
            {
                ikHelper.CreateOffsetTargetsIfMissing(vrikManager, transform);
            }

            head      = transform.Find("Head");
            leftHand  = transform.Find("LeftHand");
            rightHand = transform.Find("RightHand");
            pelvis    = transform.Find("Pelvis");
            leftLeg   = transform.Find("LeftLeg");
            rightLeg  = transform.Find("RightLeg");

            if (vrikManager)
            {
                if (vrikManager.references_root != vrikManager.transform)
                {
                    _logger.Warning("VRIKManager is not on the root reference transform; this may cause unexpected issues");
                }

                CheckTargetWeight("Left Arm", leftHand, vrikManager.solver_leftArm_positionWeight, vrikManager.solver_leftArm_rotationWeight);
                CheckTargetWeight("Right Arm", rightHand, vrikManager.solver_rightArm_positionWeight, vrikManager.solver_rightArm_rotationWeight);
                CheckTargetWeight("Pelvis", pelvis, vrikManager.solver_spine_pelvisPositionWeight, vrikManager.solver_spine_pelvisRotationWeight);
                CheckTargetWeight("Left Leg", leftLeg, vrikManager.solver_leftLeg_positionWeight, vrikManager.solver_leftLeg_rotationWeight);
                CheckTargetWeight("Right Leg", rightLeg, vrikManager.solver_rightLeg_positionWeight, vrikManager.solver_rightLeg_rotationWeight);

                FixTrackingReferences(vrikManager);
            }

            if (transform.localPosition.sqrMagnitude > 0)
            {
                _logger.Warning("Avatar root position is not at origin; this may cause unexpected issues");
            }

            var poseManager = GetComponentInChildren <PoseManager>();

            isIKAvatar             = vrikManager;
            supportsFingerTracking = poseManager && poseManager.isValid;

            eyeHeight = GetEyeHeight();
            armSpan   = GetArmSpan(vrikManager);

#pragma warning disable CS0612, CS0618
            loadedAvatar = new LoadedAvatar(this);
#pragma warning restore CS0612, CS0618
        }
Exemple #14
0
        internal LoadedAvatar(string fullPath, GameObject avatarGameObject, ILoggerProvider loggerProvider, DiContainer container)
        {
            this.fullPath = fullPath ?? throw new ArgumentNullException(nameof(fullPath));
            prefab        = avatarGameObject ? avatarGameObject : throw new ArgumentNullException(nameof(avatarGameObject));
            descriptor    = avatarGameObject.GetComponent <AvatarDescriptor>() ?? throw new AvatarLoadException($"Avatar at '{fullPath}' does not have an AvatarDescriptor");

            fileName = Path.GetFileName(fullPath);

            prefab.name = $"LoadedAvatar({descriptor.name})";

            _logger = loggerProvider.CreateLogger <LoadedAvatar>(descriptor.name);

            head      = prefab.transform.Find("Head");
            leftHand  = prefab.transform.Find("LeftHand");
            rightHand = prefab.transform.Find("RightHand");
            pelvis    = prefab.transform.Find("Pelvis");
            leftLeg   = prefab.transform.Find("LeftLeg");
            rightLeg  = prefab.transform.Find("RightLeg");

            #pragma warning disable CS0618
            VRIKManager vrikManager = prefab.GetComponentInChildren <VRIKManager>();
            IKManager   ikManager   = prefab.GetComponentInChildren <IKManager>();
            #pragma warning restore CS0618

            // migrate IKManager/IKManagerAdvanced to VRIKManager
            if (ikManager)
            {
                if (!vrikManager)
                {
                    vrikManager = container.InstantiateComponent <VRIKManager>(prefab);
                }

                _logger.Warning("IKManager and IKManagerAdvanced are deprecated; please migrate to VRIKManager");

                ApplyIKManagerFields(vrikManager, ikManager);
                Object.Destroy(ikManager);
            }

            if (vrikManager)
            {
                if (!vrikManager.areReferencesFilled)
                {
                    _logger.Warning($"References are not filled on '{vrikManager.name}'; detecting references automatically");
                    vrikManager.AutoDetectReferences();
                }
            }

            // remove any existing VRIK instances
            foreach (VRIK existingVrik in prefab.GetComponentsInChildren <VRIK>())
            {
                _logger.Warning($"Found VRIK on '{existingVrik.name}'; manually adding VRIK to an avatar is no longer needed, please remove it");

                if (existingVrik && vrikManager && existingVrik.references.isFilled && !vrikManager.areReferencesFilled)
                {
                    _logger.Warning($"Copying references from VRIK on '{existingVrik.name}'; this is deprecated behaviour and will be removed in a future release");
                    CopyReferencesFromExistingVrik(vrikManager, existingVrik.references);
                }

                Object.Destroy(existingVrik);
            }

            if (vrikManager)
            {
                if (vrikManager.references_root != vrikManager.transform)
                {
                    _logger.Warning("VRIKManager is not on the root reference transform; this may cause unexpected issues");
                }

                FixTrackingReferences(vrikManager);
            }

            if (prefab.transform.localPosition.sqrMagnitude > 0)
            {
                _logger.Warning("Avatar root position is not at origin; this may cause unexpected issues");
            }

            var poseManager = prefab.GetComponentInChildren <PoseManager>();

            isIKAvatar = vrikManager;
            supportsFullBodyTracking = pelvis || leftLeg || rightLeg;
            supportsFingerTracking   = poseManager && poseManager.isValid;

            eyeHeight = GetEyeHeight();
            armSpan   = GetArmSpan(vrikManager);
        }
Exemple #15
0
        internal LoadedAvatar(string fullPath, GameObject avatarGameObject, ILoggerProvider loggerProvider)
        {
            this.fullPath = fullPath ?? throw new ArgumentNullException(nameof(avatarGameObject));
            prefab        = avatarGameObject ? avatarGameObject : throw new ArgumentNullException(nameof(avatarGameObject));
            descriptor    = avatarGameObject.GetComponent <AvatarDescriptor>() ?? throw new AvatarLoadException($"Avatar at '{fullPath}' does not have an AvatarDescriptor");

            fileName = Path.GetFileName(fullPath);

            _logger = loggerProvider.CreateLogger <LoadedAvatar>(descriptor.name);

            VRIKManager vrikManager = prefab.GetComponentInChildren <VRIKManager>();

            #pragma warning disable CS0618
            IKManager ikManager = prefab.GetComponentInChildren <IKManager>();
            #pragma warning restore CS0618

            // migrate IKManager/IKManagerAdvanced to VRIKManager
            if (ikManager)
            {
                if (!vrikManager)
                {
                    vrikManager = prefab.AddComponent <VRIKManager>();
                }

                _logger.Warning("IKManager and IKManagerAdvanced are deprecated; please migrate to VRIKManager");

                ApplyIKManagerFields(vrikManager, ikManager);
                Object.Destroy(ikManager);
            }

            // remove any existing VRIK instances
            foreach (VRIK existingVrik in prefab.GetComponentsInChildren <VRIK>())
            {
                _logger.Warning($"Found VRIK on '{existingVrik.name}'; manually adding VRIK to an avatar is no longer needed, please remove it");

                if (existingVrik && vrikManager && existingVrik.references.isFilled && !vrikManager.areReferencesFilled)
                {
                    _logger.Warning($"Copying references from VRIK on '{existingVrik.name}'; this is deprecated behaviour and will be removed in a future release");
                    CopyReferencesFromExistingVrik(vrikManager, existingVrik.references);
                }

                Object.Destroy(existingVrik);
            }

            _head      = prefab.transform.Find("Head");
            _leftHand  = prefab.transform.Find("LeftHand");
            _rightHand = prefab.transform.Find("RightHand");
            _pelvis    = prefab.transform.Find("Pelvis");
            _leftLeg   = prefab.transform.Find("LeftLeg");
            _rightLeg  = prefab.transform.Find("RightLeg");

            if (vrikManager)
            {
                if (!vrikManager.areReferencesFilled)
                {
                    vrikManager.AutoDetectReferences();
                }

                FixTrackingReferences(vrikManager);
            }

            var poseManager = prefab.GetComponentInChildren <PoseManager>();

            isIKAvatar = vrikManager;
            supportsFullBodyTracking = _pelvis || _leftLeg || _rightLeg;
            supportsFingerTracking   = poseManager && poseManager.isValid;

            eyeHeight = GetEyeHeight();
            armSpan   = GetArmSpan();
        }
Exemple #16
0
        private void CopyManagerFieldsToVRIK(VRIKManager vrikManager, VRIK vrik)
        {
            vrik.references.root          = vrikManager.references_root;
            vrik.references.pelvis        = vrikManager.references_pelvis;
            vrik.references.spine         = vrikManager.references_spine;
            vrik.references.chest         = vrikManager.references_chest;
            vrik.references.neck          = vrikManager.references_neck;
            vrik.references.head          = vrikManager.references_head;
            vrik.references.leftShoulder  = vrikManager.references_leftShoulder;
            vrik.references.leftUpperArm  = vrikManager.references_leftUpperArm;
            vrik.references.leftForearm   = vrikManager.references_leftForearm;
            vrik.references.leftHand      = vrikManager.references_leftHand;
            vrik.references.rightShoulder = vrikManager.references_rightShoulder;
            vrik.references.rightUpperArm = vrikManager.references_rightUpperArm;
            vrik.references.rightForearm  = vrikManager.references_rightForearm;
            vrik.references.rightHand     = vrikManager.references_rightHand;
            vrik.references.leftThigh     = vrikManager.references_leftThigh;
            vrik.references.leftCalf      = vrikManager.references_leftCalf;
            vrik.references.leftFoot      = vrikManager.references_leftFoot;
            vrik.references.leftToes      = vrikManager.references_leftToes;
            vrik.references.rightThigh    = vrikManager.references_rightThigh;
            vrik.references.rightCalf     = vrikManager.references_rightCalf;
            vrik.references.rightFoot     = vrikManager.references_rightFoot;
            vrik.references.rightToes     = vrikManager.references_rightToes;

            vrik.solver.plantFeet = vrikManager.solver_plantFeet;

            vrik.solver.spine.headTarget                = vrikManager.solver_spine_headTarget;
            vrik.solver.spine.positionWeight            = vrikManager.solver_spine_positionWeight;
            vrik.solver.spine.rotationWeight            = vrikManager.solver_spine_rotationWeight;
            vrik.solver.spine.pelvisTarget              = vrikManager.solver_spine_pelvisTarget;
            vrik.solver.spine.pelvisPositionWeight      = vrikManager.solver_spine_pelvisPositionWeight;
            vrik.solver.spine.pelvisRotationWeight      = vrikManager.solver_spine_pelvisRotationWeight;
            vrik.solver.spine.chestGoal                 = vrikManager.solver_spine_chestGoal;
            vrik.solver.spine.chestGoalWeight           = vrikManager.solver_spine_chestGoalWeight;
            vrik.solver.spine.minHeadHeight             = vrikManager.solver_spine_minHeadHeight;
            vrik.solver.spine.bodyPosStiffness          = vrikManager.solver_spine_bodyPosStiffness;
            vrik.solver.spine.bodyRotStiffness          = vrikManager.solver_spine_bodyRotStiffness;
            vrik.solver.spine.neckStiffness             = vrikManager.solver_spine_neckStiffness;
            vrik.solver.spine.rotateChestByHands        = vrikManager.solver_spine_rotateChestByHands;
            vrik.solver.spine.chestClampWeight          = vrikManager.solver_spine_chestClampWeight;
            vrik.solver.spine.headClampWeight           = vrikManager.solver_spine_headClampWeight;
            vrik.solver.spine.moveBodyBackWhenCrouching = vrikManager.solver_spine_moveBodyBackWhenCrouching;
            vrik.solver.spine.maintainPelvisPosition    = vrikManager.solver_spine_maintainPelvisPosition;
            vrik.solver.spine.maxRootAngle              = vrikManager.solver_spine_maxRootAngle;

            vrik.solver.leftArm.target                 = vrikManager.solver_leftArm_target;
            vrik.solver.leftArm.bendGoal               = vrikManager.solver_leftArm_bendGoal;
            vrik.solver.leftArm.positionWeight         = vrikManager.solver_leftArm_positionWeight;
            vrik.solver.leftArm.rotationWeight         = vrikManager.solver_leftArm_rotationWeight;
            vrik.solver.leftArm.shoulderRotationMode   = vrikManager.solver_leftArm_shoulderRotationMode;
            vrik.solver.leftArm.shoulderRotationWeight = vrikManager.solver_leftArm_shoulderRotationWeight;
            vrik.solver.leftArm.shoulderTwistWeight    = vrikManager.solver_leftArm_shoulderTwistWeight;
            vrik.solver.leftArm.bendGoalWeight         = vrikManager.solver_leftArm_bendGoalWeight;
            vrik.solver.leftArm.swivelOffset           = vrikManager.solver_leftArm_swivelOffset;
            vrik.solver.leftArm.wristToPalmAxis        = vrikManager.solver_leftArm_wristToPalmAxis;
            vrik.solver.leftArm.palmToThumbAxis        = vrikManager.solver_leftArm_palmToThumbAxis;
            vrik.solver.leftArm.armLengthMlp           = vrikManager.solver_leftArm_armLengthMlp;
            vrik.solver.leftArm.stretchCurve           = vrikManager.solver_leftArm_stretchCurve;

            vrik.solver.rightArm.target                 = vrikManager.solver_rightArm_target;
            vrik.solver.rightArm.bendGoal               = vrikManager.solver_rightArm_bendGoal;
            vrik.solver.rightArm.positionWeight         = vrikManager.solver_rightArm_positionWeight;
            vrik.solver.rightArm.rotationWeight         = vrikManager.solver_rightArm_rotationWeight;
            vrik.solver.rightArm.shoulderRotationMode   = vrikManager.solver_rightArm_shoulderRotationMode;
            vrik.solver.rightArm.shoulderRotationWeight = vrikManager.solver_rightArm_shoulderRotationWeight;
            vrik.solver.rightArm.shoulderTwistWeight    = vrikManager.solver_rightArm_shoulderTwistWeight;
            vrik.solver.rightArm.bendGoalWeight         = vrikManager.solver_rightArm_bendGoalWeight;
            vrik.solver.rightArm.swivelOffset           = vrikManager.solver_rightArm_swivelOffset;
            vrik.solver.rightArm.wristToPalmAxis        = vrikManager.solver_rightArm_wristToPalmAxis;
            vrik.solver.rightArm.palmToThumbAxis        = vrikManager.solver_rightArm_palmToThumbAxis;
            vrik.solver.rightArm.armLengthMlp           = vrikManager.solver_rightArm_armLengthMlp;
            vrik.solver.rightArm.stretchCurve           = vrikManager.solver_rightArm_stretchCurve;

            vrik.solver.leftLeg.target             = vrikManager.solver_leftLeg_target;
            vrik.solver.leftLeg.bendGoal           = vrikManager.solver_leftLeg_bendGoal;
            vrik.solver.leftLeg.positionWeight     = vrikManager.solver_leftLeg_positionWeight;
            vrik.solver.leftLeg.rotationWeight     = vrikManager.solver_leftLeg_rotationWeight;
            vrik.solver.leftLeg.bendGoalWeight     = vrikManager.solver_leftLeg_bendGoalWeight;
            vrik.solver.leftLeg.swivelOffset       = vrikManager.solver_leftLeg_swivelOffset;
            vrik.solver.leftLeg.bendToTargetWeight = vrikManager.solver_leftLeg_bendToTargetWeight;
            vrik.solver.leftLeg.legLengthMlp       = vrikManager.solver_leftLeg_legLengthMlp;
            vrik.solver.leftLeg.stretchCurve       = vrikManager.solver_leftLeg_stretchCurve;

            vrik.solver.rightLeg.target             = vrikManager.solver_rightLeg_target;
            vrik.solver.rightLeg.bendGoal           = vrikManager.solver_rightLeg_bendGoal;
            vrik.solver.rightLeg.positionWeight     = vrikManager.solver_rightLeg_positionWeight;
            vrik.solver.rightLeg.rotationWeight     = vrikManager.solver_rightLeg_rotationWeight;
            vrik.solver.rightLeg.bendGoalWeight     = vrikManager.solver_rightLeg_bendGoalWeight;
            vrik.solver.rightLeg.swivelOffset       = vrikManager.solver_rightLeg_swivelOffset;
            vrik.solver.rightLeg.bendToTargetWeight = vrikManager.solver_rightLeg_bendToTargetWeight;
            vrik.solver.rightLeg.legLengthMlp       = vrikManager.solver_rightLeg_legLengthMlp;
            vrik.solver.rightLeg.stretchCurve       = vrikManager.solver_rightLeg_stretchCurve;

            vrik.solver.locomotion.weight                = vrikManager.solver_locomotion_weight;
            vrik.solver.locomotion.footDistance          = vrikManager.solver_locomotion_footDistance;
            vrik.solver.locomotion.stepThreshold         = vrikManager.solver_locomotion_stepThreshold;
            vrik.solver.locomotion.angleThreshold        = vrikManager.solver_locomotion_angleThreshold;
            vrik.solver.locomotion.comAngleMlp           = vrikManager.solver_locomotion_comAngleMlp;
            vrik.solver.locomotion.maxVelocity           = vrikManager.solver_locomotion_maxVelocity;
            vrik.solver.locomotion.velocityFactor        = vrikManager.solver_locomotion_velocityFactor;
            vrik.solver.locomotion.maxLegStretch         = vrikManager.solver_locomotion_maxLegStretch;
            vrik.solver.locomotion.rootSpeed             = vrikManager.solver_locomotion_rootSpeed;
            vrik.solver.locomotion.stepSpeed             = vrikManager.solver_locomotion_stepSpeed;
            vrik.solver.locomotion.stepHeight            = vrikManager.solver_locomotion_stepHeight;
            vrik.solver.locomotion.heelHeight            = vrikManager.solver_locomotion_heelHeight;
            vrik.solver.locomotion.relaxLegTwistMinAngle = vrikManager.solver_locomotion_relaxLegTwistMinAngle;
            vrik.solver.locomotion.relaxLegTwistSpeed    = vrikManager.solver_locomotion_relaxLegTwistSpeed;
            vrik.solver.locomotion.stepInterpolation     = vrikManager.solver_locomotion_stepInterpolation;
            vrik.solver.locomotion.offset                = vrikManager.solver_locomotion_offset;
            vrik.solver.locomotion.onLeftFootstep        = vrikManager.solver_locomotion_onLeftFootstep;
            vrik.solver.locomotion.onRightFootstep       = vrikManager.solver_locomotion_onRightFootstep;
        }
#pragma warning disable CS0618
        private void ApplyIKManagerFields(VRIKManager vrikManager, IKManager ikManager)
        {
            vrikManager.solver_spine_headTarget = ikManager.HeadTarget;
            vrikManager.solver_leftArm_target   = ikManager.LeftHandTarget;
            vrikManager.solver_rightArm_target  = ikManager.RightHandTarget;

            if (!(ikManager is IKManagerAdvanced ikManagerAdvanced))
            {
                return;
            }

            vrikManager.solver_spine_pelvisTarget           = ikManagerAdvanced.Spine_pelvisTarget;
            vrikManager.solver_spine_pelvisPositionWeight   = ikManagerAdvanced.Spine_pelvisPositionWeight;
            vrikManager.solver_spine_pelvisRotationWeight   = ikManagerAdvanced.Spine_pelvisRotationWeight;
            vrikManager.solver_spine_positionWeight         = ikManagerAdvanced.Head_positionWeight;
            vrikManager.solver_spine_rotationWeight         = ikManagerAdvanced.Head_rotationWeight;
            vrikManager.solver_spine_chestGoal              = ikManagerAdvanced.Spine_chestGoal;
            vrikManager.solver_spine_chestGoalWeight        = ikManagerAdvanced.Spine_chestGoalWeight;
            vrikManager.solver_spine_minHeadHeight          = ikManagerAdvanced.Spine_minHeadHeight;
            vrikManager.solver_spine_bodyPosStiffness       = ikManagerAdvanced.Spine_bodyPosStiffness;
            vrikManager.solver_spine_bodyRotStiffness       = ikManagerAdvanced.Spine_bodyRotStiffness;
            vrikManager.solver_spine_neckStiffness          = ikManagerAdvanced.Spine_neckStiffness;
            vrikManager.solver_spine_chestClampWeight       = ikManagerAdvanced.Spine_chestClampWeight;
            vrikManager.solver_spine_headClampWeight        = ikManagerAdvanced.Spine_headClampWeight;
            vrikManager.solver_spine_maintainPelvisPosition = ikManagerAdvanced.Spine_maintainPelvisPosition;
            vrikManager.solver_spine_maxRootAngle           = ikManagerAdvanced.Spine_maxRootAngle;

            vrikManager.solver_leftArm_bendGoal               = ikManagerAdvanced.LeftArm_bendGoal;
            vrikManager.solver_leftArm_positionWeight         = ikManagerAdvanced.LeftArm_positionWeight;
            vrikManager.solver_leftArm_rotationWeight         = ikManagerAdvanced.LeftArm_rotationWeight;
            vrikManager.solver_leftArm_shoulderRotationMode   = ikManagerAdvanced.LeftArm_shoulderRotationMode;
            vrikManager.solver_leftArm_shoulderRotationWeight = ikManagerAdvanced.LeftArm_shoulderRotationWeight;
            vrikManager.solver_leftArm_bendGoalWeight         = ikManagerAdvanced.LeftArm_bendGoalWeight;
            vrikManager.solver_leftArm_swivelOffset           = ikManagerAdvanced.LeftArm_swivelOffset;
            vrikManager.solver_leftArm_wristToPalmAxis        = ikManagerAdvanced.LeftArm_wristToPalmAxis;
            vrikManager.solver_leftArm_palmToThumbAxis        = ikManagerAdvanced.LeftArm_palmToThumbAxis;

            vrikManager.solver_rightArm_bendGoal               = ikManagerAdvanced.RightArm_bendGoal;
            vrikManager.solver_rightArm_positionWeight         = ikManagerAdvanced.RightArm_positionWeight;
            vrikManager.solver_rightArm_rotationWeight         = ikManagerAdvanced.RightArm_rotationWeight;
            vrikManager.solver_rightArm_shoulderRotationMode   = ikManagerAdvanced.RightArm_shoulderRotationMode;
            vrikManager.solver_rightArm_shoulderRotationWeight = ikManagerAdvanced.RightArm_shoulderRotationWeight;
            vrikManager.solver_rightArm_bendGoalWeight         = ikManagerAdvanced.RightArm_bendGoalWeight;
            vrikManager.solver_rightArm_swivelOffset           = ikManagerAdvanced.RightArm_swivelOffset;
            vrikManager.solver_rightArm_wristToPalmAxis        = ikManagerAdvanced.RightArm_wristToPalmAxis;
            vrikManager.solver_rightArm_palmToThumbAxis        = ikManagerAdvanced.RightArm_palmToThumbAxis;

            vrikManager.solver_leftLeg_target         = ikManagerAdvanced.LeftLeg_target;
            vrikManager.solver_leftLeg_positionWeight = ikManagerAdvanced.LeftLeg_positionWeight;
            vrikManager.solver_leftLeg_rotationWeight = ikManagerAdvanced.LeftLeg_rotationWeight;
            vrikManager.solver_leftLeg_bendGoal       = ikManagerAdvanced.LeftLeg_bendGoal;
            vrikManager.solver_leftLeg_bendGoalWeight = ikManagerAdvanced.LeftLeg_bendGoalWeight;
            vrikManager.solver_leftLeg_swivelOffset   = ikManagerAdvanced.LeftLeg_swivelOffset;

            vrikManager.solver_rightLeg_target         = ikManagerAdvanced.RightLeg_target;
            vrikManager.solver_rightLeg_positionWeight = ikManagerAdvanced.RightLeg_positionWeight;
            vrikManager.solver_rightLeg_rotationWeight = ikManagerAdvanced.RightLeg_rotationWeight;
            vrikManager.solver_rightLeg_bendGoal       = ikManagerAdvanced.RightLeg_bendGoal;
            vrikManager.solver_rightLeg_bendGoalWeight = ikManagerAdvanced.RightLeg_bendGoalWeight;
            vrikManager.solver_rightLeg_swivelOffset   = ikManagerAdvanced.RightLeg_swivelOffset;

            vrikManager.solver_locomotion_weight                = ikManagerAdvanced.Locomotion_weight;
            vrikManager.solver_locomotion_footDistance          = ikManagerAdvanced.Locomotion_footDistance;
            vrikManager.solver_locomotion_stepThreshold         = ikManagerAdvanced.Locomotion_stepThreshold;
            vrikManager.solver_locomotion_angleThreshold        = ikManagerAdvanced.Locomotion_angleThreshold;
            vrikManager.solver_locomotion_comAngleMlp           = ikManagerAdvanced.Locomotion_comAngleMlp;
            vrikManager.solver_locomotion_maxVelocity           = ikManagerAdvanced.Locomotion_maxVelocity;
            vrikManager.solver_locomotion_velocityFactor        = ikManagerAdvanced.Locomotion_velocityFactor;
            vrikManager.solver_locomotion_maxLegStretch         = ikManagerAdvanced.Locomotion_maxLegStretch;
            vrikManager.solver_locomotion_rootSpeed             = ikManagerAdvanced.Locomotion_rootSpeed;
            vrikManager.solver_locomotion_stepSpeed             = ikManagerAdvanced.Locomotion_stepSpeed;
            vrikManager.solver_locomotion_stepHeight            = ikManagerAdvanced.Locomotion_stepHeight;
            vrikManager.solver_locomotion_heelHeight            = ikManagerAdvanced.Locomotion_heelHeight;
            vrikManager.solver_locomotion_relaxLegTwistMinAngle = ikManagerAdvanced.Locomotion_relaxLegTwistMinAngle;
            vrikManager.solver_locomotion_relaxLegTwistSpeed    = ikManagerAdvanced.Locomotion_relaxLegTwistSpeed;
            vrikManager.solver_locomotion_stepInterpolation     = ikManagerAdvanced.Locomotion_stepInterpolation;
            vrikManager.solver_locomotion_offset                = ikManagerAdvanced.Locomotion_offset;
            vrikManager.solver_locomotion_onLeftFootstep        = ikManagerAdvanced.Locomotion_onLeftFootstep;
            vrikManager.solver_locomotion_onRightFootstep       = ikManagerAdvanced.Locomotion_onRightFootstep;
        }
Exemple #18
0
 public void CreateOffsetTargetsIfMissing(VRIKManager vrikManager, Transform root)
 {
     CreateOffsetTargetIfMissing(root, "Pelvis", vrikManager.references_pelvis, ref vrikManager.solver_spine_pelvisPositionWeight, ref vrikManager.solver_spine_pelvisRotationWeight);
     CreateOffsetTargetIfMissing(root, "LeftLeg", vrikManager.references_leftToes ?? vrikManager.references_leftFoot, ref vrikManager.solver_leftLeg_positionWeight, ref vrikManager.solver_leftLeg_rotationWeight);
     CreateOffsetTargetIfMissing(root, "RightLeg", vrikManager.references_rightToes ?? vrikManager.references_rightFoot, ref vrikManager.solver_rightLeg_positionWeight, ref vrikManager.solver_rightLeg_rotationWeight);
 }