Component:VRIK: Difference between revisions

From Resonite Wiki
add image to page
add missing field info
 
(8 intermediate revisions by 5 users not shown)
Line 6: Line 6:
== Introduction == <!--T:1-->
== Introduction == <!--T:1-->
{{Quotation|''Oof''|Epsilion}}
{{Quotation|''Oof''|Epsilion}}
The '''VRIK''' component is used to configure Inverse Kinematics on an avatar, for posing joints based on the position of IK Targets such as a [https://en.wikipedia.org/wiki/Head-mounted_display VR HMD], [https://en.wikipedia.org/wiki/Hand_tracking hand tracking], or [https://www.vive.com/us/accessory/vive-tracker/ Vive Trackers]
The '''VRIK''' component is used to configure [[IK|Inverse Kinematics]] on an avatar, for posing joints based on the position of IK Targets such as a [https://en.wikipedia.org/wiki/Head-mounted_display VR HMD], [https://en.wikipedia.org/wiki/Hand_tracking hand tracking], or [https://www.vive.com/us/accessory/vive-tracker/ Vive Trackers]


<!--T:2-->
<!--T:2-->
Line 20: Line 20:
<!--T:5-->
<!--T:5-->
{{Table ComponentFields
{{Table ComponentFields
|AutoUpdate|Bool| Whether to update the VRIK regardless of whether or not the sync delegates are called by a VRIK avatar or similar sources. this can break systems still using a VRIKAvatar but can fix ones with a lack of such component.
|FixTransformsEnabled|Bool| Clamps IK transforms to reasonable values and Resets IK every update.
|FixTransformsEnabled|Bool| Clamps IK transforms to reasonable values and Resets IK every update.
|componentInitiated|Bool|  
|Solver|{{RootFieldType|IKSolverVR}}|TypeAdv2=true| The actual solver that contains most of the fields of this component.
|IKPosition|Float3|  
|componentInitiated|Bool| Marks this component as fully started and ready to solve IK transforms.
|IKPositionWeight|Float| Weight of the IK
|_drives|{{RootFieldType|SyncList`1|[[#BoneDrive|VRIK.BoneDrive]]}}|TypeAdv4=true| A list of fields to drive with <code>defaultLocalPositions</code> and <code>defaultLocalRotations</code> plus transforms solved by the IK using <code>defaultLocalPositions</code> and <code>defaultLocalRotations</code>  as a basis.
|SimulationSpace|Slot|  
}}
|OffsetSpace|Slot|  
 
|_initiated|Bool|  
== IKSolverVR ==
|OnPreInitiate|UpdateDelegate|
Most of the complexity in VRIK is actually stored in the '''IKSolverVR''' type. And even this is spread across multiple types.
|OnPostInitiate|UpdateDelegate|
{{Table TypeFields
|OnPreUpdate|UpdateDelegate|  
|IKPosition|Float3| Unused.
|OnPostUpdate|UpdateDelegate|  
|IKPositionWeight|Float| Weight of the IK. Makes the bones go back to <code>defaultLocalPositions</code> and <code>defaultLocalRotations</code> as this goes to 0. Also known as default pose.
|root|Slot|  
|SimulationSpace|Slot| The top most hiearchy this solver should simulate in. When on an Avatar this is usually the user's slot when equipped and the avatar root when unequipped.
|pelvis|Slot|
|OffsetSpace|Slot| Is used to determine if there is movement happening in user space. for example shuffling around in the player's physical room. This also tells the feet to try to find new footing, and to tell the feet the user is moving.
|spine|Slot|  
|_initiated|Bool| Whether or not this component is simulating and driving it's fields.
|chest|Slot|  
|OnPreInitiate|{{RootFieldType|SyncDelegate`1|[[Type:UpdateDelegate|UpdateDelegate]]}}|TypeAdv5=true| Currently unused. Fires the SyncDelegate inside when this component is started initializing(usually during loading)
|neck|Slot|  
|OnPostInitiate|{{RootFieldType|SyncDelegate`1|[[Type:UpdateDelegate|UpdateDelegate]]}}|TypeAdv6=true| Currently unused. Fires the SyncDelegate inside when this component is done initializing (usually during loading)
|head|Slot|  
|OnPreUpdate|{{RootFieldType|SyncDelegate`1|[[Type:UpdateDelegate|UpdateDelegate]]}}|TypeAdv7=true| Sync Delegate usually filled with calls to the [[Component:VRIKAvatar|VRIKAvatar component]].
|leftShoulder|Slot|  
|OnPostUpdate|{{RootFieldType|SyncDelegate`1|[[Type:UpdateDelegate|UpdateDelegate]]}}|TypeAdv8=true| Sync Delegate usually filled with calls to the [[Component:VRIKAvatar|VRIKAvatar component]].
|leftUpperArm|Slot|  
|root|Slot| The root of the solver simulation, on an avatar this will be the avatar root when equipped and nothing when dequipped.
|leftForearm|Slot|  
|BoneReferences|{{RootFieldType|(nested)|[[#References|References]]}}|TypeAdv10=true| The set of slots are what parts of the VRIK.
|leftHand|Slot|  
|defaultLocalPositions|{{RootFieldType|SyncArray`1|[[Type:Float3|Float3]]}}|TypeAdv11=true| This is internal, and stores the positions the bones should go to as IKPositionWeight goes to 0.
|rightShoulder|Slot|
|defaultLocalRotations|{{RootFieldType|SyncArray`1|[[Type:FloatQ|FloatQ]]}}|TypeAdv12=true| This is internal, and stores the rotations the bones should go to as IKPositionWeight goes to 0.
|rightUpperArm|Slot|  
|rightForearm|Slot|  
|rightHand|Slot|  
|leftThigh|Slot|  
|leftCalf|Slot|  
|leftFoot|Slot|  
|leftToes|Slot|  
|rightThigh|Slot|
|rightCalf|Slot|
|rightFoot|Slot|
|rightToes|Slot|
|defaultLocalPositions|Float3|
|defaultLocalRotations|FloatQ|  
|DebugVisuals|Bool| Enables Debug visuals
|DebugVisuals|Bool| Enables Debug visuals
|PlantFeet|Bool| When enabled feet positions will be prioritized over anything else including HeadTarget. (Causes issues with walking) If true, will keep the toes planted even if the HeadTarget is out of reach, so this can cause the camera to exit the head if it is too high for the model to reach.
|PlantFeet|Bool| When enabled, feet positions will be prioritized over anything else including HeadTarget. (Causes issues with walking) If true, will keep the toes planted even if the HeadTarget is out of reach, so this can cause the camera to exit the head if it is too high for the model to reach.
|spine.Initiated|Bool|  
|spine|{{RootFieldType|(nested)|[[#Spine|Spine]]}}|TypeAdv15=true| The spine section of the VRIK solver.
|spine.HeadTarget|Slot| Typically the position and rotation of the HMD tracker. Note: on my own avatar, this is set to null. It's possible that this value isn't used, and instead the Head slot of the [[User]] is used.
|leftArm|{{RootFieldType|(nested)|[[#Arm|Arm]]}}|TypeAdv16=true| The left arm section of the VRIK solver.
|spine.PelvisTarget|Slot| Typically the position and rotation of the hip tracker. Note: on my own avatar, this is set to null. It's possible that this value isn't used, and instead the hip tracker slot of the [[User]] is used.
|rightArm|{{RootFieldType|(nested)|[[#Arm|Arm]]}}|TypeAdv17=true| The right arm section of the VRIK solver.
|spine.PositionWeight|Float| Positional weight of the HeadTarget.
|leftLeg|{{RootFieldType|(nested)|[[#Leg|Leg]]}}|TypeAdv18=true| The left leg section of the VRIK solver.
|spine.RotationWeight|Float| Rotational weight of the HeadTarget.
|rightLeg|{{RootFieldType|(nested)|[[#Leg|Leg]]}}|TypeAdv19=true| The right leg section of the VRIK solver.
|spine.PelvisPositionWeight|Float| Positional weight of the PelvisTarget.
|locomotion|{{RootFieldType|(nested)|[[#Locomotion|Locomotion]]}}|TypeAdv20=true| The locomotion section of the VRIK solver.
|spine.PelvisRotationWeight|Float| Rotational weight of the PelvisTarget.
|ForwardFlipped|Bool| Swaps the feet and turns the whole IK around.
|spine.ChestGoal|Slot| If ChestGoalWeightis greater than 0, the chest will be turned towards this slot.
|ForceRootHeight|'''[[Type:Nullable`1|Nullable`1]]&lt;[[Type:Float|Float]]&gt;'''|TypeAdv22=true| Foot planting height override (Negative numbers cause issues with walking)
|spine.ChestGoalWeight|Float| Weight of turning the chest towards the ChestGoal.
|LocomotionPositionOffset|Float3| Handles how the IK should be offset when calculating locomotion.
|spine.MinHeadHeight|Float| Minimum Head height allowed by the IK solver (Nonfunctional)
|DefaultRootPosition|Float3| The default position of the centered root.
|spine.BodyPosStiffness|Float| How much the body will try to move with the HeadTarget.
|DefaultRootRotation|FloatQ| The default rotation of the centered root.
|spine.BodyRotStiffness|Float| How much the body will try to rotate with the HeadTarget.
}}
|spine.NeckStiffness|Float| How much the chest will rotate when the head is rotated.
 
|spine.RotateChestByHands|Float| How much the chest rotates based on hand movement.
=== References ===
|spine.ChestClampWeight|Float| How much the chest can rotate relative to the head with 0 being full movement and 1 being no movement. A value of 0.5 allows 90 degrees of rotation for the chest relative to the head. A value of 0 allows 180 degrees and a value of 1 means the chest will be locked relative to the head.
{{Table TypeFields
|spine.HeadClampWeight|Float| How much the head can rotate relative to the HeadTarget with 0 being full movement and 1 being no movement. A value of 0.5 allows 90 degrees of rotation for the head relative to the HeadTarget. A value of 0 allows 180 degrees and a value of 1 means head rotation will be locked to the HeadTarget.
|root|Slot| The root of the VRIK, usually avatar root.
|spine.MoveBodyBackWhenCrouching|Float| How much the body will move backwards when crouching
|pelvis|Slot| Usually is set to the avatar's mapped <code>Hips</code> [[Type:BodyNode|BodyNode]].
|spine.MaintainPelvisPosition|Float| How much the pelvis will move with the feet instead of the HeadTarget.
|spine|Slot| Usually is set to the avatar's mapped <code>Spine</code> [[Type:BodyNode|BodyNode]].
|spine.MaxRootAngle|Float| How much the HeadTarget must rotate for the whole body to rotate (in degrees).
|chest|Slot| Usually is set to the avatar's mapped <code>Chest</code> [[Type:BodyNode|BodyNode]].
|spine.IKPositionHead|Float3| The solved position for the head. Driven.
|neck|Slot| Usually is set to the avatar's mapped <code>Neck</code> [[Type:BodyNode|BodyNode]].
|spine.IKRotationHead|FloatQ| The solved rotation for the head. Driven.
|head|Slot| Usually is set to the avatar's mapped <code>Head</code> [[Type:BodyNode|BodyNode]].
|spine.IKPositionPelvis|Float3| The solved position for the pelvis. Driven.
|leftShoulder|Slot| Usually is set to the avatar's mapped <code>LeftShoulder</code> [[Type:BodyNode|BodyNode]].
|spine.IKRotationPelvis|FloatQ| The solved rotation for the pelvis. Driven.
|leftUpperArm|Slot| Usually is set to the avatar's mapped <code>LeftUpperArm</code> [[Type:BodyNode|BodyNode]].
|spine.GoalPositionChest|Float3| The solved goal position for the chest. Driven.
|leftForearm|Slot| Usually is set to the avatar's mapped <code>LeftLowerArm</code> [[Type:BodyNode|BodyNode]].
|spine.headHeight|Float| Head height while standing. Used for calculating MoveBodyBackWhenCrouching.
|leftHand|Slot| Usually is set to the avatar's mapped <code>LeftHand</code> [[Type:BodyNode|BodyNode]].
|spine.anchorRelativeToHead|FloatQ| Root rotation relative to HeadTarget.
|rightShoulder|Slot| Usually is set to the avatar's mapped <code>RightShoulder</code> [[Type:BodyNode|BodyNode]].
|spine.pelvisRelativeRotation|FloatQ| Pelvis rotation relative to HeadTarget.
|rightUpperArm|Slot| Usually is set to the avatar's mapped <code>RightUpperArm</code> [[Type:BodyNode|BodyNode]].
|spine.chestRelativeRotation|FloatQ| Chest rotation relative to HeadTarget.
|rightForearm|Slot| Usually is set to the avatar's mapped <code>RightLowerArm</code> [[Type:BodyNode|BodyNode]].
|spine.chestForward|Float3| Chest Forward Vector
|rightHand|Slot| Usually is set to the avatar's mapped <code>RightHand</code> [[Type:BodyNode|BodyNode]].
|spine.pelvisForward|Float3| Pelvis Forward Vector
|leftThigh|Slot| Usually is set to the avatar's mapped <code>LeftUpperLeg</code> [[Type:BodyNode|BodyNode]].
|leftArm.Initiated|Bool|
|leftCalf|Slot| Usually is set to the avatar's mapped <code>LeftLowerLeg</code> [[Type:BodyNode|BodyNode]].  
|leftArm.Target|Slot| The target for the left hand. Note: on my own avatar, this is set to null. It's possible that this value isn't used, and instead the Left Hand slot of the [[User]] is used.
|leftFoot|Slot| Usually is set to the avatar's mapped <code>LeftFoot</code> [[Type:BodyNode|BodyNode]].
|leftArm.BendGoal|Slot| The left elbow will be bent towards this slot if BendGoalWeight > 0.
|leftToes|Slot| Usually is set to the avatar's mapped <code>LeftToes</code> [[Type:BodyNode|BodyNode]].  
|leftArm.PositionWeight|Float| Positional weight of the Target.
|rightThigh|Slot| Usually is set to the avatar's mapped <code>RightUpperLeg</code> [[Type:BodyNode|BodyNode]].
|leftArm.RotationWeight|Float| Rotational weight of the Target.
|rightCalf|Slot| Usually is set to the avatar's mapped <code>RightLowerLeg</code> [[Type:BodyNode|BodyNode]].
|leftArm.ShoulderRotationMode|ShoulderRotationMode| Shoulder rotation method. Pitch/yaw is more accurate, while From/to is simpler.
|rightFoot|Slot| Usually is set to the avatar's mapped <code>RightFoot</code> [[Type:BodyNode|BodyNode]].
|leftArm.ShoulderRotationWeight|Float| How much the left shoulder should move based on Hand position.
|rightToes|Slot| Usually is set to the avatar's mapped <code>RightToes</code> [[Type:BodyNode|BodyNode]].
|leftArm.BendGoalWeight|Float| if greater than 0, will bend the elbow towards the BendGoal slot.
}}
|leftArm.SwivelOffset|Float| Rotation offset for the left elbow in degrees.
 
|leftArm.WristToPalmAxis|Float3| Palm Direction; local axis of the hand bone that points from the wrist towards the palm. Used for defining hand bone orientation. (Higher values on the Y axis increase the amount the arms move with your controllers)
=== Spine ===
|leftArm.PalmToThumbAxis|Float3| Thumb Direction; local axis of the hand bone that points from the palm towards the thumb. Used for defining hand bone orientation.
{{Table TypeFields
|leftArm.ArmLengthMlp|Float| Arm Length Multiplier. Used to make the arm shorter/longer. Works by displacement of hand and forearm local position.
|Initiated|Bool| Whether or not the spine section is initalized.
|leftArm.StretchCurve|Float| Unsupported. Would evaluate stretching of the arm by target distance relative to arm length. Value at time 1 represents stretching amount at the point where distance to the target is equal to arm length. Value at time 2 represents stretching amount at the point where distance to the target is double the arm length. Value represents the amount of stretching. Linear stretching would be achieved with a linear curve going up by 45 degrees. Increase the range of stretching by moving the last key up and right at the same amount. Smoothing in the curve can help reduce elbow snapping (start stretching the arm slightly before target distance reaches arm length).
|HeadTarget|Slot| This slot is used to position the <code>head</code> when set. When unset the head position is determined by <code>IKPositionHead</code> and <code>IKRotationHead</code>.
|leftArm.IKPosition|Float3| The solved position for the left hand. Driven.
|PelvisTarget|Slot| This slot is used to position the <code>pelvis</code> when set. When unset the pelvis position is determined by <code>IKPositionPelvis</code> and <code>IKRotationPelvis</code>.
|leftArm.IKRotation|FloatQ| The solved rotation for the left hand. Driven.
|PositionWeight|Float| Positional weight of the HeadTarget.
|leftArm.BendGoalPosition|Float3| The solved position for the bend goal. Driven.
|RotationWeight|Float| Rotational weight of the HeadTarget.
|leftArm.TwistRelaxWeight|Float| How much the forearm twists towards the wrist
|PelvisPositionWeight|Float| Positional weight of the PelvisTarget.
|leftArm.TwistCrossfade|Float| Weight of the forearm twisting
|PelvisRotationWeight|Float| Rotational weight of the PelvisTarget.
|leftArm.TwistAngleOffset|Float| Angle offset of the forearm twisting
|ChestGoal|Slot| If ChestGoalWeightis greater than 0, the <code>chest</code> will be turned towards this slot when set. When unset, <code>GoalPositionChest</code> is used as a position to turn towards.
|leftArm.chestForwardAxis|Float3|
|ChestGoalWeight|Float| Weight of turning the chest towards the ChestGoal.
|leftArm.chestUpAxis|Float3|
|MinHeadHeight|Float| Minimum Head height allowed by the IK solver (Nonfunctional)
|leftArm.forearmTwistAxis|Float3|  
|BodyPosStiffness|Float| How much the body will try to move with the <code>HeadTarget</code> or with <code>IKPositionHead</code> and <code>IKRotationHead</code> if <code>HeadTarget</code> is unset.
|leftArm.forearmAxis|Float3|  
|BodyRotStiffness|Float| How much the body will try to rotate with the <code>HeadTarget</code> or with <code>IKPositionHead</code> and <code>IKRotationHead</code> if <code>HeadTarget</code> is unset.
|leftArm.axisRelativeToUpperArm|Float3|
|NeckStiffness|Float| How much the chest will rotate when the head is rotated.
|leftArm.axisRelativeToHand|Float3|
|RotateChestByHands|Float| How much the chest rotates based on hand movement.
|rightArm.Initiated|Bool|
|ChestClampWeight|Float| How much the chest can rotate relative to the head with 0 being full movement and 1 being no movement. A value of 0.5 allows 90 degrees of rotation for the chest relative to the head. A value of 0 allows 180 degrees and a value of 1 means the chest will be locked relative to the head.
|rightArm.Target|Slot| The target for the right hand. Note: on my own avatar, this is set to null. It's possible that this value isn't used, and instead the Right Hand slot of the [[User]] is used.
|HeadClampWeight|Float| How much the head can rotate relative to the <code>HeadTarget</code> or with <code>IKPositionHead</code> and <code>IKRotationHead</code> if <code>HeadTarget</code> is unset with 0 being full movement and 1 being no movement. A value of 0.5 allows 90 degrees of rotation for the head relative to the target. A value of 0 allows 180 degrees and a value of 1 means head rotation will be locked to the target.
|rightArm.BendGoal|Slot| The right elbow will be bent towards this slot if BendGoalWeight > 0.
|MoveBodyBackWhenCrouching|Float| How much the body will move backwards when crouching
|rightArm.PositionWeight|Float| Positional weight of the Target.
|MaintainPelvisPosition|Float| How much the pelvis will move with the feet instead of the <code>HeadTarget</code> or with <code>IKPositionHead</code> and <code>IKRotationHead</code> if <code>HeadTarget</code> is unset.
|rightArm.RotationWeight|Float| Rotational weight of the Target.
|MaxRootAngle|Float| How much the <code>HeadTarget</code> or with <code>IKPositionHead</code> and <code>IKRotationHead</code> if <code>HeadTarget</code> is unset must rotate for the whole body to rotate (in degrees).
|rightArm.ShoulderRotationMode|ShoulderRotationMode| Shoulder rotation method. Pitch/yaw is more accurate, while From/to is simpler.
|IKPositionHead|Float3| The solved position for the head. Driven.
|rightArm.ShoulderRotationWeight|Float| How much the right shoulder should move based on Hand position.
|IKRotationHead|FloatQ| The solved rotation for the head. Driven.
|rightArm.BendGoalWeight|Float| if greater than 0, will bend the elbow towards the BendGoal slot.
|IKPositionPelvis|Float3| The solved position for the pelvis. Driven.
|rightArm.SwivelOffset|Float| Rotation offset for the right elbow in degrees.
|IKRotationPelvis|FloatQ| The solved rotation for the pelvis. Driven.
|rightArm.WristToPalmAxis|Float3| Palm Direction; local axis of the hand bone that points from the wrist towards the palm. Used for defining hand bone orientation. (Higher values on the Y axis increase the amount the arms move with your controllers)
|GoalPositionChest|Float3| The solved goal position for the chest. Driven.
|rightArm.PalmToThumbAxis|Float3| Thumb Direction; local axis of the hand bone that points from the palm towards the thumb. Used for defining hand bone orientation.
|headHeight|Float| Head height while standing. Used for calculating MoveBodyBackWhenCrouching.
|rightArm.ArmLengthMlp|Float| Arm Length Multiplier. Used to make the arm shorter/longer. Works by displacement of hand and forearm local position.
|anchorRelativeToHead|FloatQ| Root rotation relative to <code>HeadTarget</code> or with <code>IKPositionHead</code> and <code>IKRotationHead</code> if <code>HeadTarget</code> is unset.
|rightArm.StretchCurve|Float| Unsupported. Would evaluate stretching of the arm by target distance relative to arm length. Value at time 1 represents stretching amount at the point where distance to the target is equal to arm length. Value at time 2 represents stretching amount at the point where distance to the target is double the arm length. Value represents the amount of stretching. Linear stretching would be achieved with a linear curve going up by 45 degrees. Increase the range of stretching by moving the last key up and right at the same amount. Smoothing in the curve can help reduce elbow snapping (start stretching the arm slightly before target distance reaches arm length).
|pelvisRelativeRotation|FloatQ| Pelvis rotation relative to <code>HeadTarget</code> or with <code>IKPositionHead</code> and <code>IKRotationHead</code> if <code>HeadTarget</code> is unset.
|rightArm.IKPosition|Float3| The solved position for the right hand. Driven.
|chestRelativeRotation|FloatQ| Chest rotation relative to <code>HeadTarget</code> or with <code>IKPositionHead</code> and <code>IKRotationHead</code> if <code>HeadTarget</code> is unset.
|rightArm.IKRotation|FloatQ| The solved rotation for the right hand. Driven.
|chestForward|Float3| Chest Forward Vector
|rightArm.BendGoalPosition|Float3| The solved position for the bend goal. Driven.
|pelvisForward|Float3| Pelvis Forward Vector
|rightArm.TwistRelaxWeight|Float| How much the forearm twists towards the wrist
}}
|rightArm.TwistCrossfade|Float| Weight of the forearm twisting
 
|rightArm.TwistAngleOffset|Float| Angle offset of the forearm twisting
=== Arm ===
|rightArm.chestForwardAxis|Float3|  
Contains parameters for the two arms: <code>leftArm</code> and <code>rightArm</code>.
|rightArm.chestUpAxis|Float3|
 
|rightArm.forearmTwistAxis|Float3|
{{Table TypeFields
|rightArm.forearmAxis|Float3|
|Initiated|Bool| Whether this arm section is initalized.
|rightArm.axisRelativeToUpperArm|Float3|
|Target|Slot| The target for the arm's hand. It will use this if set, or <code>PositionWeight</code> and <code>RotationWeight</code> if unset.
|rightArm.axisRelativeToHand|Float3|
|BendGoal|Slot| The arm's elbow will be bent towards this slot if <code>BendGoalWeight</code> > 0, and the slot is set. Otherwise <code>BendGoalPosition</code> is used as a bend position.
|leftLeg.Initiated|Bool|
|PositionWeight|Float| Positional weight of the Target.
|leftLeg.Target|Slot| The target for the left foot/toe. This isn't the left foot tracker itself, but a child Slot parented to it so you could adjust its position/rotation to match the orientation of the foot/toe bone. If LeftToes is assigned, the solver will match the left toe bone to this target. If no LeftToes is assigned, LeftFoot will be used instead. Note: on my own avatar, this is set to null. It's possible that this value isn't used, and instead the left foot slot of the [[User]] is used.
|RotationWeight|Float| Rotational weight of the Target.
|leftLeg.BendGoalPosition|Float3| The solved position for the bend goal. Driven.
|ShoulderRotationMode|'''[[#ShoulderRotationMode|ShoulderRotationMode]]'''|TypeAdv5=true| Shoulder rotation method. Pitch/yaw is more accurate, while From/to is simpler.
|leftLeg.BendGoal|Slot| The left knee will be bent towards this slot if BendGoalWeight > 0.
|ShoulderRotationWeight|Float| How much the arm's shoulder should move based on Hand position.
|leftLeg.PositionWeight|Float| Positional weight of the Target.
|BendGoalWeight|Float| if greater than 0, will bend the elbow towards the <code>BendGoal</code> slot if set otherwise <code>BendGoalPosition</code> is used
|leftLeg.RotationWeight|Float| Rotational weight of the Target.
|SwivelOffset|Float| Rotation offset for the arm's elbow in degrees.
|leftLeg.BendGoalWeight|Float| if greater than 0, will bend the left knee towards the BendGoal slot.
|WristToPalmAxis|Float3| Palm Direction; local axis of the hand bone that points from the wrist towards the palm. Used for defining hand bone orientation. (Higher values on the Y axis increase the amount the arms move with your controllers)
|leftLeg.SwivelOffset|Float| Rotation offset for the left knee in degrees.
|PalmToThumbAxis|Float3| Thumb Direction; local axis of the hand bone that points from the palm towards the thumb. Used for defining hand bone orientation.
|leftLeg.CalfBendNormal|Float3|  
|ArmLengthMlp|Float| Arm Length Multiplier. Used to make the arm shorter/longer. Works by displacement of hand and forearm local position.
|leftLeg.IKPosition|Float3| The solved position for the left foot/toe. Driven.
|StretchCurve|{{RootFieldType|SyncCurve`1|[[Type:Float|Float]]}}|TypeAdv12=true| Unsupported. Would evaluate stretching of the arm by target distance relative to arm length. Value at time 1 represents stretching amount at the point where distance to the target is equal to arm length. Value at time 2 represents stretching amount at the point where distance to the target is double the arm length. Value represents the amount of stretching. Linear stretching would be achieved with a linear curve going up by 45 degrees. Increase the range of stretching by moving the last key up and right at the same amount. Smoothing in the curve can help reduce elbow snapping (start stretching the arm slightly before target distance reaches arm length).
|leftLeg.IKRotation|FloatQ| The solved rotation for the left foot/toe. Driven.
|IKPosition|Float3| The solved position for the arm's hand. Driven.
|rightLeg.Initiated|Bool|  
|IKRotation|FloatQ| The solved rotation for the arm's hand. Driven.
|rightLeg.Target|Slot| The target for the right  foot/toe. This isn't the right foot tracker itself, but a child Slot parented to it so you could adjust its position/rotation to match the orientation of the foot/toe bone. If RightToes is assigned, the solver will match the left toe bone to this target. If no RightToes is assigned, RightFoot will be used instead. Note: on my own avatar, this is set to null. It's possible that this value isn't used, and instead the right foot slot of the [[User]] is used.
|BendGoalPosition|Float3| The solved position for the bend goal. Driven.
|rightLeg.BendGoalPosition|Float3| The solved position for the bend goal. Driven.
|TwistRelaxWeight|Float| How much the forearm twists towards the wrist
|rightLeg.BendGoal|Slot| The right  knee will be bent towards this slot if BendGoalWeight > 0.
|TwistCrossfade|Float| Weight of the forearm twisting
|rightLeg.PositionWeight|Float| Positional weight of the Target.
|TwistAngleOffset|Float| Angle offset of the forearm twisting
|rightLeg.RotationWeight|Float| Rotational weight of the Target.
|chestForwardAxis|Float3| The axis used to tell the VRIK what direction the chest is pointing forward by default. usually set when the chest bone roll is different from 0 in blender.
|rightLeg.BendGoalWeight|Float| if greater than 0, will bend the right knee towards the BendGoal slot.
|chestUpAxis|Float3| The axis used to tell the VRIK what direction the chest is pointing up by default. usually set when the chest doesn't point directly towards the next bone in the chain.
|rightLeg.SwivelOffset|Float| Rotation offset for the right knee in degrees.
|forearmTwistAxis|Float3| This specifies what axis the forearms should twist around in local space.
|rightLeg.CalfBendNormal|Float3|
|forearmAxis|Float3| This specifies the axis that the forearm takes place along in local space.
|rightLeg.IKPosition|Float3| The solved position for the right foot/toe. Driven.
|axisRelativeToUpperArm|Float3| This identifies which axis the forearm is from the upper arm.
|rightLeg.IKRotation|FloatQ| The solved rotation for the right foot/toe. Driven.
|axisRelativeToHand|Float3| This identifies which axis the hand is from the forearm.
|locomotion.Weight|Float|
}}
|locomotion.FootDistance|Float| Tries to maintain this distance between where each foot will attempt to plant themselves.
 
|locomotion.StepThreshold|Float| How far you have to move for the feet to take a step (re-plant themselves).
==== ShoulderRotationMode ====
|locomotion.AngleThreshold|Float| How much you have to rotate for the feet to take a step (re-plant themselves).
{{Table EnumValues
|locomotion.ComAngleMlp|Float| Multiplier angle of the (center of mass minus the center of pressure) vector. Larger value makes the character step sooner if losing balance.
|YawPitch|0| Rotates the shoulder using Yaw Pitch, which is like using Slerp.
|locomotion.MaxVelocity|Float| Maximum magnitude of head/hand target velocity for prediction.
|FromTo|1| Rotates the shoulder using essentially a look at, which can solve some IK issues.
|locomotion.VelocityFactor|Float| How much the feet will use your current head/hand target velocity to predict where you're stepping.
|locomotion.MaxLegStretch|Float| How much your leg can stretch before it attempts to take a step. 1 means fully stretched.
|locomotion.RootSpeed|Float| How fast the pelvis and legs will move to catch up to the HMD; the speed of lerping the root of the character towards the horizontal mid-point of the footsteps.
|locomotion.StepSpeed|Float| How fast the foot planter will move the feet to their new position when re-planting
|locomotion.StepHeight|Float| The height of the foot by normalized step progress (0 - 1).
|locomotion.HeelHeight|Float| The height offset of the heel by normalized step progress (0 - 1).
|locomotion.RelaxLegTwistMinAngle|Float| How much your HMD has to rotate before your feet begin to rotate towards your HMD without stepping; rotates the foot while the leg is not stepping to relax the twist rotation of the leg if ideal rotation is past this angle.
|locomotion.RelaxLegTwistSpeed|Float| How fast the feet can rotate while on the ground; the speed of rotating the foot while the leg is not stepping to relax the twist rotation of the leg.
|locomotion.StepInterpolation|InterpolationMode| The type of interpolation the feet will use during stepping.
|locomotion.Offset|Float3| Offset for feet planting relative to your HMD
|locomotion.LeftFootOffset|Float3|
|locomotion.RightFootOffset|Float3|
|locomotion.OnLeftFootstep|Action| Non-Functional WorldDelegate
|locomotion.OnRightFootstep|Action| Non-Functional WorldDelegate
|locomotion._leftFootstep._initialized|Bool|
|locomotion._leftFootstep.footRelativeToRoot|FloatQ|
|locomotion._leftFootstep.footGroundHeight|Float|
|locomotion._rightFootstep._initialized|Bool|
|locomotion._rightFootstep.footRelativeToRoot|FloatQ|
|locomotion._rightFootstep.footGroundHeight|Float|
|ForwardFlipped|Bool| Swaps the feet
|ForceRootHeight|Float| Foot planting height override (Negative numbers cause issues with walking)
|LocomotionPositionOffset|Float3|
|DefaultRootPosition|Float3|
|DefaultRootRotation|FloatQ|
|_drives|BoneDrive|
}}
}}


== Behavior == <!--T:6-->
=== Leg ===
Contains parameters for the two legs: <code>leftLeg</code> and <code>rightLeg</code>.
 
{{Table TypeFields
|Initiated|Bool| Whether this leg is initialized.
|Target|Slot| The target for the left foot/toe. This can override the <code>IKPosition</code> and <code>IKRotation</code> values so it uses this slot as a target position instead.
|BendGoalPosition|Float3| The solved position for the bend goal. Driven.
|BendGoal|Slot| The left knee will be bent towards this slot if BendGoalWeight > 0 if set. otherwise <code>BendGoalPosition</code> is used.
|PositionWeight|Float| Positional weight of the Target.
|RotationWeight|Float| Rotational weight of the Target.
|BendGoalWeight|Float| if greater than 0, will bend the left knee towards the <code>BendGoal</code> slot if set otherwise <code>BendGoalPosition</code> is used.
|SwivelOffset|Float| Rotation offset for the left knee in degrees.
|CalfBendNormal|Float3| The direction the calf should bend towards in local space.
|IKPosition|Float3| The solved position for the left foot/toe. Driven.
|IKRotation|FloatQ| The solved rotation for the left foot/toe. Driven.
}}
 
=== Locomotion ===
{{Table TypeFields
|Weight|Float| How much weight locomotion calculation has rather than normal IK calculation.
|FootDistance|Float| Tries to maintain this distance between where each foot will attempt to plant themselves.
|StepThreshold|Float| How far you have to move for the feet to take a step (re-plant themselves).
|AngleThreshold|Float| How much you have to rotate for the feet to take a step (re-plant themselves).
|ComAngleMlp|Float| Multiplier angle of the (center of mass minus the center of pressure) vector. Larger value makes the character step sooner if losing balance.
|MaxVelocity|Float| Maximum magnitude of head/hand target velocity for prediction.
|VelocityFactor|Float| How much the feet will use your current head/hand target velocity to predict where you're stepping.
|MaxLegStretch|Float| How much your leg can stretch before it attempts to take a step. 1 means fully stretched.
|RootSpeed|Float| How fast the pelvis and legs will move to catch up to the HMD; the speed of lerping the root of the character towards the horizontal mid-point of the footsteps.
|StepSpeed|Float| How fast the foot planter will move the feet to their new position when re-planting
|StepHeight|{{RootFieldType|SyncCurve`1|[[Type:Float|Float]]}}|TypeAdv10=true| The height of the foot by normalized step progress (0 - 1).
|HeelHeight|{{RootFieldType|SyncCurve`1|[[Type:Float|Float]]}}|TypeAdv11=true| The height offset of the heel by normalized step progress (0 - 1).
|RelaxLegTwistMinAngle|Float| How much your HMD has to rotate before your feet begin to rotate towards your HMD without stepping; rotates the foot while the leg is not stepping to relax the twist rotation of the leg if ideal rotation is past this angle.
|RelaxLegTwistSpeed|Float| How fast the feet can rotate while on the ground; the speed of rotating the foot while the leg is not stepping to relax the twist rotation of the leg.
|StepInterpolation|InterpolationMode| The type of interpolation the feet will use during stepping.
|Offset|Float3| Offset for feet planting relative to your HMD
|LeftFootOffset|Float3| How much to offset the foot from the given target position and rotation for the left foot.
|RightFootOffset|Float3| How much to offset the foot from the given target position and rotation for the right foot.
|OnLeftFootstep|{{RootFieldType|SyncDelegate`1|[[Type:Action|Action]]}}|TypeAdv18=true|This is very finicky, and can be used to fire sounds or other Action sync delegates when the left foot steps.
|OnRightFootstep|{{RootFieldType|SyncDelegate`1|[[Type:Action|Action]]}}|TypeAdv19=true|This is very finicky, and can be used to fire sounds or other Action sync delegates when the right foot steps.
|_leftFootstep|{{RootFieldType|(nested)|[[#Footstep|Footstep]]}}|TypeAdv20=true| A list of footsteps to trigger for the left foot.
|_rightFootstep|{{RootFieldType|(nested)|[[#Footstep|Footstep]]}}|TypeAdv21=true| A list of footsteps to trigger for the right foot.
}}
 
=== Footstep ===
{{Table TypeFields
|_initialized|Bool| Whether this footstep should be used.
|footRelativeToRoot|FloatQ| The rotation relative to root needed for this to be considered a footstep.
|footGroundHeight|Float| The height needed for this to be considered a footstep.
}}
 
== BoneDrive ==
Bonedrive fields use a combination of the <code>defaultLocalPositions</code> and <code>defaultLocalRotations</code> entries at this element's entry position in the list as well as VRIK position and rotation solved values to determine the final driven value.
 
{{Table TypeFields
|Position|{{RootFieldType|FieldDrive`1|[[Type:Float3|Float3]]}}|TypeAdv0=true| The field to drive with the VRIK's solved position for the bone that corrosponds to this entry.
|Rotation|{{RootFieldType|FieldDrive`1|[[Type:FloatQ|FloatQ]]}}|TypeAdv1=true| The field to drive with the VRIK's solved rotation for the bone that corrosponds to this entry.
}}
 
== Usage == <!--T:6-->
{{stub}}
 
== Examples ==
== Examples ==
== Related Components ==
Used in every avatar except head and hands avatars to make avatar movements.
 
== See Also ==
* [[Component:VRIKAvatar]]


[[Category:Components{{#translation:}}|VRIK (Component){{#translation:}}]]
[[Category:Components{{#translation:}}|VRIK]]
[[Category:Components:Uncategorized{{#translation:}}|VRIK (Component){{#translation:}}]]
[[Category:Components With Nested Types{{#translation:}}|VRIK]]
[[Category:Components:Uncategorized{{#translation:}}|VRIK]]

Latest revision as of 00:48, 4 May 2025

This article or section is a Stub. You can help the Resonite Wiki by expanding it.

Component image 
VRIK component as seen in the Scene Inspector

Introduction

Oof

— Epsilion

The VRIK component is used to configure Inverse Kinematics on an avatar, for posing joints based on the position of IK Targets such as a VR HMD, hand tracking, or Vive Trackers

This component is automatically configured when importing a mesh with a detectable humanoid rig, and generally should not be modified unless you know what you are doing.

Documentation on this component may take some time, as it is very complex, and not commonly used. The basis for this component seems to be the VRIK solver developed by Final IK.

Usage

All weight values are 1-0, excluding clamps which are inverted 0-1. You can overdrive some of them with interesting results.

Fields
Name Type Description
persistent Bool Determines whether or not this item will be saved to the server.
UpdateOrder Int Controls the order in which this component is updated.
Enabled Bool Controls whether or not this component is enabled. Some components stop their functionality when this field is disabled, but some don't.
AutoUpdate Bool Whether to update the VRIK regardless of whether or not the sync delegates are called by a VRIK avatar or similar sources. this can break systems still using a VRIKAvatar but can fix ones with a lack of such component.
FixTransformsEnabled Bool Clamps IK transforms to reasonable values and Resets IK every update.
Solver direct IKSolverVR The actual solver that contains most of the fields of this component.
componentInitiated Bool Marks this component as fully started and ready to solve IK transforms.
_drives list of VRIK.BoneDrive A list of fields to drive with defaultLocalPositions and defaultLocalRotations plus transforms solved by the IK using defaultLocalPositions and defaultLocalRotations as a basis.

IKSolverVR

Most of the complexity in VRIK is actually stored in the IKSolverVR type. And even this is spread across multiple types.

Fields
Name Type Description
IKPosition Float3 Unused.
IKPositionWeight Float Weight of the IK. Makes the bones go back to defaultLocalPositions and defaultLocalRotations as this goes to 0. Also known as default pose.
SimulationSpace Slot The top most hiearchy this solver should simulate in. When on an Avatar this is usually the user's slot when equipped and the avatar root when unequipped.
OffsetSpace Slot Is used to determine if there is movement happening in user space. for example shuffling around in the player's physical room. This also tells the feet to try to find new footing, and to tell the feet the user is moving.
_initiated Bool Whether or not this component is simulating and driving it's fields.
OnPreInitiate delegate of identity UpdateDelegate Currently unused. Fires the SyncDelegate inside when this component is started initializing(usually during loading)
OnPostInitiate delegate of identity UpdateDelegate Currently unused. Fires the SyncDelegate inside when this component is done initializing (usually during loading)
OnPreUpdate delegate of identity UpdateDelegate Sync Delegate usually filled with calls to the VRIKAvatar component.
OnPostUpdate delegate of identity UpdateDelegate Sync Delegate usually filled with calls to the VRIKAvatar component.
root Slot The root of the solver simulation, on an avatar this will be the avatar root when equipped and nothing when dequipped.
BoneReferences direct References The set of slots are what parts of the VRIK.
defaultLocalPositions array of Float3 This is internal, and stores the positions the bones should go to as IKPositionWeight goes to 0.
defaultLocalRotations array of FloatQ This is internal, and stores the rotations the bones should go to as IKPositionWeight goes to 0.
DebugVisuals Bool Enables Debug visuals
PlantFeet Bool When enabled, feet positions will be prioritized over anything else including HeadTarget. (Causes issues with walking) If true, will keep the toes planted even if the HeadTarget is out of reach, so this can cause the camera to exit the head if it is too high for the model to reach.
spine direct Spine The spine section of the VRIK solver.
leftArm direct Arm The left arm section of the VRIK solver.
rightArm direct Arm The right arm section of the VRIK solver.
leftLeg direct Leg The left leg section of the VRIK solver.
rightLeg direct Leg The right leg section of the VRIK solver.
locomotion direct Locomotion The locomotion section of the VRIK solver.
ForwardFlipped Bool Swaps the feet and turns the whole IK around.
ForceRootHeight Nullable`1<Float> Foot planting height override (Negative numbers cause issues with walking)
LocomotionPositionOffset Float3 Handles how the IK should be offset when calculating locomotion.
DefaultRootPosition Float3 The default position of the centered root.
DefaultRootRotation FloatQ The default rotation of the centered root.

References

Fields
Name Type Description
root Slot The root of the VRIK, usually avatar root.
pelvis Slot Usually is set to the avatar's mapped Hips BodyNode.
spine Slot Usually is set to the avatar's mapped Spine BodyNode.
chest Slot Usually is set to the avatar's mapped Chest BodyNode.
neck Slot Usually is set to the avatar's mapped Neck BodyNode.
head Slot Usually is set to the avatar's mapped Head BodyNode.
leftShoulder Slot Usually is set to the avatar's mapped LeftShoulder BodyNode.
leftUpperArm Slot Usually is set to the avatar's mapped LeftUpperArm BodyNode.
leftForearm Slot Usually is set to the avatar's mapped LeftLowerArm BodyNode.
leftHand Slot Usually is set to the avatar's mapped LeftHand BodyNode.
rightShoulder Slot Usually is set to the avatar's mapped RightShoulder BodyNode.
rightUpperArm Slot Usually is set to the avatar's mapped RightUpperArm BodyNode.
rightForearm Slot Usually is set to the avatar's mapped RightLowerArm BodyNode.
rightHand Slot Usually is set to the avatar's mapped RightHand BodyNode.
leftThigh Slot Usually is set to the avatar's mapped LeftUpperLeg BodyNode.
leftCalf Slot Usually is set to the avatar's mapped LeftLowerLeg BodyNode.
leftFoot Slot Usually is set to the avatar's mapped LeftFoot BodyNode.
leftToes Slot Usually is set to the avatar's mapped LeftToes BodyNode.
rightThigh Slot Usually is set to the avatar's mapped RightUpperLeg BodyNode.
rightCalf Slot Usually is set to the avatar's mapped RightLowerLeg BodyNode.
rightFoot Slot Usually is set to the avatar's mapped RightFoot BodyNode.
rightToes Slot Usually is set to the avatar's mapped RightToes BodyNode.

Spine

Fields
Name Type Description
Initiated Bool Whether or not the spine section is initalized.
HeadTarget Slot This slot is used to position the head when set. When unset the head position is determined by IKPositionHead and IKRotationHead.
PelvisTarget Slot This slot is used to position the pelvis when set. When unset the pelvis position is determined by IKPositionPelvis and IKRotationPelvis.
PositionWeight Float Positional weight of the HeadTarget.
RotationWeight Float Rotational weight of the HeadTarget.
PelvisPositionWeight Float Positional weight of the PelvisTarget.
PelvisRotationWeight Float Rotational weight of the PelvisTarget.
ChestGoal Slot If ChestGoalWeightis greater than 0, the chest will be turned towards this slot when set. When unset, GoalPositionChest is used as a position to turn towards.
ChestGoalWeight Float Weight of turning the chest towards the ChestGoal.
MinHeadHeight Float Minimum Head height allowed by the IK solver (Nonfunctional)
BodyPosStiffness Float How much the body will try to move with the HeadTarget or with IKPositionHead and IKRotationHead if HeadTarget is unset.
BodyRotStiffness Float How much the body will try to rotate with the HeadTarget or with IKPositionHead and IKRotationHead if HeadTarget is unset.
NeckStiffness Float How much the chest will rotate when the head is rotated.
RotateChestByHands Float How much the chest rotates based on hand movement.
ChestClampWeight Float How much the chest can rotate relative to the head with 0 being full movement and 1 being no movement. A value of 0.5 allows 90 degrees of rotation for the chest relative to the head. A value of 0 allows 180 degrees and a value of 1 means the chest will be locked relative to the head.
HeadClampWeight Float How much the head can rotate relative to the HeadTarget or with IKPositionHead and IKRotationHead if HeadTarget is unset with 0 being full movement and 1 being no movement. A value of 0.5 allows 90 degrees of rotation for the head relative to the target. A value of 0 allows 180 degrees and a value of 1 means head rotation will be locked to the target.
MoveBodyBackWhenCrouching Float How much the body will move backwards when crouching
MaintainPelvisPosition Float How much the pelvis will move with the feet instead of the HeadTarget or with IKPositionHead and IKRotationHead if HeadTarget is unset.
MaxRootAngle Float How much the HeadTarget or with IKPositionHead and IKRotationHead if HeadTarget is unset must rotate for the whole body to rotate (in degrees).
IKPositionHead Float3 The solved position for the head. Driven.
IKRotationHead FloatQ The solved rotation for the head. Driven.
IKPositionPelvis Float3 The solved position for the pelvis. Driven.
IKRotationPelvis FloatQ The solved rotation for the pelvis. Driven.
GoalPositionChest Float3 The solved goal position for the chest. Driven.
headHeight Float Head height while standing. Used for calculating MoveBodyBackWhenCrouching.
anchorRelativeToHead FloatQ Root rotation relative to HeadTarget or with IKPositionHead and IKRotationHead if HeadTarget is unset.
pelvisRelativeRotation FloatQ Pelvis rotation relative to HeadTarget or with IKPositionHead and IKRotationHead if HeadTarget is unset.
chestRelativeRotation FloatQ Chest rotation relative to HeadTarget or with IKPositionHead and IKRotationHead if HeadTarget is unset.
chestForward Float3 Chest Forward Vector
pelvisForward Float3 Pelvis Forward Vector

Arm

Contains parameters for the two arms: leftArm and rightArm.

Fields
Name Type Description
Initiated Bool Whether this arm section is initalized.
Target Slot The target for the arm's hand. It will use this if set, or PositionWeight and RotationWeight if unset.
BendGoal Slot The arm's elbow will be bent towards this slot if BendGoalWeight > 0, and the slot is set. Otherwise BendGoalPosition is used as a bend position.
PositionWeight Float Positional weight of the Target.
RotationWeight Float Rotational weight of the Target.
ShoulderRotationMode ShoulderRotationMode Shoulder rotation method. Pitch/yaw is more accurate, while From/to is simpler.
ShoulderRotationWeight Float How much the arm's shoulder should move based on Hand position.
BendGoalWeight Float if greater than 0, will bend the elbow towards the BendGoal slot if set otherwise BendGoalPosition is used
SwivelOffset Float Rotation offset for the arm's elbow in degrees.
WristToPalmAxis Float3 Palm Direction; local axis of the hand bone that points from the wrist towards the palm. Used for defining hand bone orientation. (Higher values on the Y axis increase the amount the arms move with your controllers)
PalmToThumbAxis Float3 Thumb Direction; local axis of the hand bone that points from the palm towards the thumb. Used for defining hand bone orientation.
ArmLengthMlp Float Arm Length Multiplier. Used to make the arm shorter/longer. Works by displacement of hand and forearm local position.
StretchCurve direct SyncCurve`1<Float> Unsupported. Would evaluate stretching of the arm by target distance relative to arm length. Value at time 1 represents stretching amount at the point where distance to the target is equal to arm length. Value at time 2 represents stretching amount at the point where distance to the target is double the arm length. Value represents the amount of stretching. Linear stretching would be achieved with a linear curve going up by 45 degrees. Increase the range of stretching by moving the last key up and right at the same amount. Smoothing in the curve can help reduce elbow snapping (start stretching the arm slightly before target distance reaches arm length).
IKPosition Float3 The solved position for the arm's hand. Driven.
IKRotation FloatQ The solved rotation for the arm's hand. Driven.
BendGoalPosition Float3 The solved position for the bend goal. Driven.
TwistRelaxWeight Float How much the forearm twists towards the wrist
TwistCrossfade Float Weight of the forearm twisting
TwistAngleOffset Float Angle offset of the forearm twisting
chestForwardAxis Float3 The axis used to tell the VRIK what direction the chest is pointing forward by default. usually set when the chest bone roll is different from 0 in blender.
chestUpAxis Float3 The axis used to tell the VRIK what direction the chest is pointing up by default. usually set when the chest doesn't point directly towards the next bone in the chain.
forearmTwistAxis Float3 This specifies what axis the forearms should twist around in local space.
forearmAxis Float3 This specifies the axis that the forearm takes place along in local space.
axisRelativeToUpperArm Float3 This identifies which axis the forearm is from the upper arm.
axisRelativeToHand Float3 This identifies which axis the hand is from the forearm.

ShoulderRotationMode

Values
Name Value Description
YawPitch 0 Rotates the shoulder using Yaw Pitch, which is like using Slerp.
FromTo 1 Rotates the shoulder using essentially a look at, which can solve some IK issues.

Leg

Contains parameters for the two legs: leftLeg and rightLeg.

Fields
Name Type Description
Initiated Bool Whether this leg is initialized.
Target Slot The target for the left foot/toe. This can override the IKPosition and IKRotation values so it uses this slot as a target position instead.
BendGoalPosition Float3 The solved position for the bend goal. Driven.
BendGoal Slot The left knee will be bent towards this slot if BendGoalWeight > 0 if set. otherwise BendGoalPosition is used.
PositionWeight Float Positional weight of the Target.
RotationWeight Float Rotational weight of the Target.
BendGoalWeight Float if greater than 0, will bend the left knee towards the BendGoal slot if set otherwise BendGoalPosition is used.
SwivelOffset Float Rotation offset for the left knee in degrees.
CalfBendNormal Float3 The direction the calf should bend towards in local space.
IKPosition Float3 The solved position for the left foot/toe. Driven.
IKRotation FloatQ The solved rotation for the left foot/toe. Driven.

Locomotion

Fields
Name Type Description
Weight Float How much weight locomotion calculation has rather than normal IK calculation.
FootDistance Float Tries to maintain this distance between where each foot will attempt to plant themselves.
StepThreshold Float How far you have to move for the feet to take a step (re-plant themselves).
AngleThreshold Float How much you have to rotate for the feet to take a step (re-plant themselves).
ComAngleMlp Float Multiplier angle of the (center of mass minus the center of pressure) vector. Larger value makes the character step sooner if losing balance.
MaxVelocity Float Maximum magnitude of head/hand target velocity for prediction.
VelocityFactor Float How much the feet will use your current head/hand target velocity to predict where you're stepping.
MaxLegStretch Float How much your leg can stretch before it attempts to take a step. 1 means fully stretched.
RootSpeed Float How fast the pelvis and legs will move to catch up to the HMD; the speed of lerping the root of the character towards the horizontal mid-point of the footsteps.
StepSpeed Float How fast the foot planter will move the feet to their new position when re-planting
StepHeight direct SyncCurve`1<Float> The height of the foot by normalized step progress (0 - 1).
HeelHeight direct SyncCurve`1<Float> The height offset of the heel by normalized step progress (0 - 1).
RelaxLegTwistMinAngle Float How much your HMD has to rotate before your feet begin to rotate towards your HMD without stepping; rotates the foot while the leg is not stepping to relax the twist rotation of the leg if ideal rotation is past this angle.
RelaxLegTwistSpeed Float How fast the feet can rotate while on the ground; the speed of rotating the foot while the leg is not stepping to relax the twist rotation of the leg.
StepInterpolation InterpolationMode The type of interpolation the feet will use during stepping.
Offset Float3 Offset for feet planting relative to your HMD
LeftFootOffset Float3 How much to offset the foot from the given target position and rotation for the left foot.
RightFootOffset Float3 How much to offset the foot from the given target position and rotation for the right foot.
OnLeftFootstep delegate of identity Action This is very finicky, and can be used to fire sounds or other Action sync delegates when the left foot steps.
OnRightFootstep delegate of identity Action This is very finicky, and can be used to fire sounds or other Action sync delegates when the right foot steps.
_leftFootstep direct Footstep A list of footsteps to trigger for the left foot.
_rightFootstep direct Footstep A list of footsteps to trigger for the right foot.

Footstep

Fields
Name Type Description
_initialized Bool Whether this footstep should be used.
footRelativeToRoot FloatQ The rotation relative to root needed for this to be considered a footstep.
footGroundHeight Float The height needed for this to be considered a footstep.

BoneDrive

Bonedrive fields use a combination of the defaultLocalPositions and defaultLocalRotations entries at this element's entry position in the list as well as VRIK position and rotation solved values to determine the final driven value.

Fields
Name Type Description
Position field drive of Float3 The field to drive with the VRIK's solved position for the bone that corrosponds to this entry.
Rotation field drive of FloatQ The field to drive with the VRIK's solved rotation for the bone that corrosponds to this entry.

Usage

This article or section is a Stub. You can help the Resonite Wiki by expanding it.

Examples

Used in every avatar except head and hands avatars to make avatar movements.

See Also