Skip to main content

Hand Skeleton

  • HandSkeleton derived script that defines, as its name would suggest, a basic hand skeleton
  • This HandSkeleton is suited for most common needs
  • It moves itself and its HandBones to target poses by directly setting their Transforms' world space positions, rotations and scales
  • It exposes one property - UpdateRun which is of a certain enumeration type that defines which Unity's update callback should be used to set the HandBone Transforms; it can be Update, FixedUpdate, LateUpdate or any combination of these

Visualized Hand Skeleton

  • Script that derives from HandSkeleton and is intended to be inherited by hand skeletons that serve the purpose of visualizing a hand in some special way
  • Usual use for this type of HandSkeleton is to visualize another HandSkeleton, and the most common way to achieve this is to use a HandSkeletonSourcedPoseProvider on the HandSkeleton that needs to be visualized and having that pose provider assigned to the VisualizedHandSkeleton as its pose provider (via PoseProvider property), though there may be other ways to achieve this defined by the specific VisualizedHandSkeleton
  • It uses the LateUpdate built-in callback to set the target pose which is set in the same way as it is set by the BasicHandSkeleton, LateUpdate is overridable if more custom behaviour is needed
  • The way VisualizedHandSkeleton is defined and set up, it can serve as a visualization of another HandSkeleton or it can be a visualization in and of itself, you can attach any InputDataProvider to it just as with any other HandSkeleton

Skinned Mesh Visualized Hand Skeleton

  • A type of VisualizedHandSkeleton that uses skinned mesh for the hand visualization
  • It requires SkinnedMeshRenderer attached to the same GameObject it is attached to, this renderer component can be used to set the mesh as well as all the other rendering properties provided by it
  • SkinnedMeshVisualizedHandSkeleton is setting its attached HandBones' Transforms to the transforms array on the SkinnedMeshRenderer in the same order as they appear in the Bones list in the skeleton. Make sure the bindposes, bone weights and bone indices on the mesh used match the skeleton's bones in their number and indices at which they appear in the skeleton's bones list as otherwise SkinnedMeshRenderer might generate certain errors and/or warnings
  • In order to make SkinnedMeshVisualizedHandSkeleton visualization of another HandSkeleton, HandSkeletonSourcedPoseProvider should be used as mentioned in the previous section about VisualizedHandSkeleton

Armature Visualized Hand Skeleton

  • Another type of VisualizedHandSkeleton, this one visualizes the hand by using small spheres for hand bone joints and cylindrical segments that end up resembling sticks to represent connection of a bone with its child bones (meaning 5 segments for WristRoot bone is used and 1 for every other, except the finger tip bones which are only visualized by their joints). All these visualized components combined result in something that resembles a construction armature that is shaped like a hand
  • For every bone visualization component, a separate GameObject is used with MeshRenderer component attached to it. This results in many separate meshes being used for visualizing a hand and these renderer components can are used for manipulating all the usual rendering options provided by them
  • ArmatureVisualizedHandSkeleton uses its own special type of HandBone - ArmatureVisualizedHandBone, which manages its corresponding set of objects used as visualization components for the bone (one joint and possibly one or more segments). It exposes certain properties to provide simple and fast way of accessing each individual visualization component as well as some other rendering related properties
  • Removing a bone from the ArmatureVisualizedHandSkeleton results in the bone's visualization components being disabled so that they no longer get rendered
  • If you want to create a script for your own custom bone type to be used with a ArmatureVisualizedHandSkeleton, then have that script be derived from ArmatureVisualizedHandBone instead of HandBone
  • Important to mention is that the ArmatureVisualizedHandSkeleton provides one additional way for making it act as a visualization of another HandSkeleton, in addition to using a HandSkeletonSourcePoseProvider. It exposes the certain HandSkeleton-typed property - VisualizationOf. Any HandSkeleton can be assigned to this property in order to make the ArmatureVisualizedHandSkeleton act as a visualization for the assigned one. This has one difference from using HandSkeletonSourcedPoseProvider - HandBones which are missing from the source HandSkeleton are removed from the ArmatureVisualizedHandSkeleton as well and if a HandBone is added to the source HandSkeleton, a corresponding bone gets added to the ArmatureVisualizedHandSkeleton. This behaviour does not occur when using a HandSkeletonSourcedPoseProvider method for visualizing other HandSkeletons