Each object has a joint of a given type which determines how it moves in relation to its parent object. Unlike Unity’s object physics-based joint systems, VirtualGrasp’s joint system is purely kinematic, and allows you to setup common object behaviors like buttons, screws, and sliders, etc very easily.
|Floating||6||unconstrained, freely floating object|
|Fixed||0||constrained, as if an integrated object with its parent|
|Revolute||1||constrained, rotate around an axis through an anchor point (joint center), limited by an angle range|
|Prismatic||1||constrained, move linearly along an axis through an anchor point (joint center), limited by an distance range|
|Planar||2||constrained, move on a plane defined by anchor point and anchor’s zaxis as plane normal, limited by a rectangular shaped range defined along anchor’s x and y axes|
|Cone||3||constrained, rotate around an anchor point limited by a cone limit, parameterized by a swing limit angle that determines the cone size, and twist limit angle that determines how much the object can rotate around the axis (center axis of the cone)|
For any joint type, there are a set of parameters to be used to configure the joint:
|Min||lower limit of 1-dof joint, i.e. revolute or prismatic joint.|
|Max||upper limit of 1-dof joint, i.e. revolute or prismatic joint.|
|Min x||lower limit of planar joint, along xaxis of anchor transform.|
|Max x||upper limit of planar joint, along xaxis of anchor transform.|
|Min y||lower limit of planar joint, along yaxis of anchor transform.|
|Max y||upper limit of planar joint, along yaxis of anchor transform.|
|Swing||swing angle limit for cone joint.|
|Twist||twist angle limit for cone joint.|
|Screw Rate||only valid for revolute joint, describing how much the object linearly move along the axis given every degree of rotation, in unit (cm/degree).|
|Discrete States||discrete values in the 1-dof joint’s limit boundary. By default same as [min, max]. If provided has to be at least 2 states and in ascending order.|
|Joint Center||around which position an object is rotating around, specified by the anchor transform’s position.|
|Joint Axis||the axis specified by the anchor transform’s zaxis. For revolute joint, this defines rotation axis, for prismatic joint, object move linearly along this axis, for cone joint this defines center of the core shape limit range, for planar joint, this is normal of the plane.|
|Joint Axis2||the secondary axis specified by the anchor transform’s xaxis, which defines orientation of planar joint’s rectangular shaped limit space.|
If an object has an 1-dof joint, then its complete pose can be determined by a combination of
- its joint configuration (defined by a set of parameters shown in above table)
- and a single scalar value – joint state.
The table below gives some example values of joint state to further clarify its meaning:
|0||zero pose (initial pose)||zero pose (initial pose)|
|2.5 (a random value as an example)||2.5 (degree) rotated around joint axis (follow right-hand rule) from the zero pose||2.5 (meter, in Unity) translated along joint axis direction from the zero pose|
|-2.5 (a random value as an example)||-2.5 (degree) rotated around joint axis (follow right-hand rule) from the zero pose||-2.5 (meter, in Unity) translated along joint axis direction from the zero pose|
If an object has PLANAR joint, then there are joint state and secondary joint state representing the position of object along xaxis and yaxis of the anchor transform.
Anchor vs. Push Direction
As shown in the joint parameter table above, an object’s joint parameters include joint center and joint axis. These two parameters are provided in a combined way through an anchor transform in the game engine.
Then what is push direction?
Push direction is provided to specify along which direction the hand is allowed to approach and apply push action. And this is only relevant for push without physics setup for push interaction.
Similar to provide joint axis through anchor transform, we use push direction transform’s zaxis to specify this push approach direction.
If push direction is not provided, then it will just inherit from the anchor, i.e. the push direction is same as the joint axis.
The image above shows an example of setting up a button object that can be pushed from top by index finger. In this case the push direction is the same as anchor because the preferred approach direction is same as the button movement direction.
To learn more details of how to setup pushable object see push interaction.
“Object Affordance”, in a broader sense, means what kind of action this object can be used for. For example a chair affords to be sit upon, a button on the wall affords push, and a handle affords grasp.
In VG library we define a “narrower” sensed set of affordances that determines which kind of hand interaction we can have with this object (interaction affordance), and how the object’s joint state react in the virtual environment (state affordance).
|Affordances||Description||Object Joint Settings|
|Graspable||interaction affordance: Can be grasped||for all joint types|
|Index Pushable||interaction affordance: Can be pushed by the index finger; only relevant when setup push interaction without physics.||for all joint types|
|Normal||state affordance: Object stay at the pose when hand is released||for all joint types|
|Bounce||state affordance: When released, bounce to the lowest discrete state||for 1-dof joint|
|Two Stage||state affordance: When released, bounce to the highest and lowest discrete state in an alternating order||for 1-dof joint|
|Snaps||state affordance: When released, snap to the closest discrete state||for 1-dof joint|
Dual Hands Only
This is a miscellaneous parameter to enforce an object can only be moved when grasped by two hands.
The purpose of this feature is to simulate a heavy object that need more hands to be moved when the object is non-physical (i.e. no Rigidbody or ArticulationBody component). Naturally, this setting will not take effect on physical objects.
Graphical User Interface
The image below shows Unity’s VG_Articulation component used to setup all parameters of object articulation. Note that the VG_Articulation is generic for all other client engines like Unreal.