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; }
/// <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); }
public VRIK InitializeVRIK(VRIKManager vrikManager, Transform root) { VRIK vrik = vrikManager.gameObject.AddComponent <VRIK>(); CreateTargetsIfMissing(vrikManager, root); CopyManagerFieldsToVRIK(vrikManager, vrik); return(vrik); }
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")); }
/// <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); } } } }
#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 }
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); }
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(); }
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; }
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); }