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 a pivot point (joint center), limited by an angle range|
|Prismatic||1||constrained, move linearly along an axis through a pivot point (joint center), limited by an distance range|
|Cone||3||constrained, rotate around a pivot 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 pivot transform’s position||E.g. for cone joint, object will rotate round this point|
|Joint Axis||the axis specified by the pivot 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|
Pivot vs. Push Pivot
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 a pivot transform in the game engine.
Then what is push pivot?
Push pivot 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 pivot transform, we use push pivot transform’s zaxis to specify this push approach direction.
If push pivot is not provided, then it will just inherit from the pivot, 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 pivot is the same as pivot 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.
Note since there is no physical simulation involved, this does not take into account of the physical properties such as mass or inertia specified in the game engine.
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.