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|
|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 / Swing||lower limit of 1-dof joint, for cone joint, this is swing angle limit||if angular limit, unit in (degree)|
|Max / Twist||upper limit of 1-dof joint, for cone joint, this is twist angle limit||if angular limit, unit in (degree)|
|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.||Same unit as the limits|
|Joint Center||around which position an object is rotating around, specified by the anchor transform’s position||E.g. for cone joint, object will rotate round this point|
|Joint Axis||the axis specified by the anchor transform’s zaxis||E.g. for prismatic joint, object will move linearly along this axis|
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|
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.