Extensible 3D (X3D)
Part 1: Architecture and base components

26 Humanoid Animation (H-Anim) component

--- X3D separator bar ---

cube 26.1 Introduction

26.1.1 Name

The name of this component is "H-Anim". This name shall be used when referring to this component in the COMPONENT statement (see 7.2.5.4 Component statement).

26.1.2 Overview

This clause describes the Humanoid Animation (H-Anim) component of this part of ISO/IEC 19775. Table 26.1 provides links to the major topics in this clause. The H-Anim component of X3D defines the node bindings and other specifics for implementing ISO/IEC 19774 (see 2.[I19774]) within X3D.

Table 26.1 — Topics

cube 26.2 Concepts

This component maps the functionality define in 2.[I19774] to a set of X3D nodes. The semantics for these nodes are as specified therein.

cube 26.3 Node reference

26.3.1 HAnimDisplacer

HAnimDisplacer : X3DGeometricPropertyNode {
  MFInt32  [in,out] coordIndex    []   [0,∞) or -1
  MFVec3f  [in,out] displacements []
  SFNode   [in,out] metadata      NULL [X3DMetadataObject]
  SFString [in,out] name          ""
  SFFloat  [in,out] weight        0.0  (-∞,∞)
}

Applications may need to alter the shape of individual Segments. At the most basic level, this is done by writing to the point field of the X3DCoordinateNode-derived node that is found in the coord field of the HAnimSegment node.

In some cases, the application may need to be able to identify specific groups of vertices within an HAnimSegment.

EXAMPLE The application may need to know which vertices within the skull HAnimSegment comprise the left eyebrow.

It may also require "hints" as to the direction in which each vertex should move. That information is stored in a node called an HAnimDisplacer. The HAnimDisplacers for a particular HAnimSegment are stored in the displacers field of that HAnimSegment.

The description of each field shall be as described in 2.[I19774].

26.3.2 HAnimHumanoid

HAnimHumanoid : X3DChildNode, X3DBoundedObject {
  SFVec3f    [in,out] center           0 0 0    (-∞,∞)
  MFString   [in,out] info             []
  MFNode     [in,out] joints           []       [HAnimJoint]
  SFNode     [in,out] metadata         NULL     [X3DMetadataObject]
  SFString   [in,out] name             ""
  SFRotation [in,out] rotation         0 0 1 0  (-∞,∞)|[-1,1]
  SFVec3f    [in,out] scale            1 1 1    (0,∞)
  SFRotation [in,out] scaleOrientation 0 0 1 0  (-∞,∞)|[-1,1]
  MFNode     [in,out] segments         []       [HAnimSegment]
  MFNode     [in,out] sites            []       [HAnimSite]
  MFNode     [in,out] skeleton         []       [HAnimJoint, HAnimSite]
  MFNode     [in,out] skin             []       [X3DChildNode]
  SFNode     [in,out] skinCoord        NULL     [X3DCoordinateNode]
  SFNode     [in,out] skinNormal       NULL     [X3DNormalNode]
  SFVec3f    [in,out] translation      0 0 0    (-∞,∞)
  SFString   [in,out] version          ""
  MFNode     [in,out] viewpoints       []       [HAnimSite]
  SFVec3f    []       bboxCenter       0 0 0    (-∞,∞)
  SFVec3f    []       bboxSize         -1 -1 -1 [0,∞) or −1 −1 −1
}

The HAnimHumanoid node is used to store human-readable data such as author and copyright information, as well as to store references to the HAnimJoint, HAnimSegment, and HAnimSite nodes in addition to serving as a container for the entire humanoid. Thus, it serves as a central node for moving the humanoid through its environment.

The description of each field shall be as described in 2.[I19774].

26.3.3 HAnimJoint

HAnimJoint : X3DGroupingNode {
  MFNode     [in]     addChildren               [HAnimJoint,HAnimSegment,HAnimSite]
  MFNode     [in]     removeChildren            [HAnimJoint,HAnimSegment,HAnimSite]
  SFVec3f    [in,out] center           0 0 0    (-∞,∞)
  MFNode     [in,out] children         []       [HAnimJoint,HAnimSegment,HAnimSite]
  MFNode     [in,out] displacers       []       [HAnimDisplacer]
  SFRotation [in,out] limitOrientation 0 0 1 0  (-∞,∞)|[-1,1]
  MFFloat    [in,out] llimit           []       (-∞,∞)
  SFNode     [in,out] metadata         NULL     [X3DMetadataObject]
  SFString   [in,out] name             ""
  SFRotation [in,out] rotation         0 0 1 0  (-∞,∞)|[-1,1]
  SFVec3f    [in,out] scale            1 1 1    (0,∞)
  SFRotation [in,out] scaleOrientation 0 0 1 0  (-∞,∞)|[-1,1]
  MFInt32    [in,out] skinCoordIndex   []
  MFFloat    [in,out] skinCoordWeight  []
  MFFloat    [in,out] stiffness        [0 0 0]  [0,1]
  SFVec3f    [in,out] translation      0 0 0    (-∞,∞)
  MFFloat    [in,out] ulimit           []       (-∞,∞)
  SFVec3f    []       bboxCenter       0 0 0    (-∞,∞)
  SFVec3f    []       bboxSize         -1 -1 -1 [0,∞) or −1 −1 −1
}

Each joint in the body is represented by an HAnimJoint node, which is used to define the relationship of each body segment to its immediate parent.

An HAnimJoint may only be a child of another HAnimJoint node or a child within the skeleton field in the case of the HAnimJoint used as a humanoid root (i.e., an HAnimJoint may not be a child of an HAnimSegment).

The HAnimJoint node is also used to store other joint-specific information. In particular, a joint name is provided so that applications can identify each HAnimJoint node at run-time. The Joint node may contain hints for inverse-kinematics systems that wish to control the H-Anim figure. These hints include the upper and lower joint limits, the orientation of the joint limits, and a stiffness/resistance value. Note that these limits are not enforced by any mechanism within the scene graph of the humanoid, and are provided for information purposes only. Use of this information and enforcement of the joint limits is up to the application.

Humanoid authors and tools are free to implement the HAnimJoint node however they choose. In particular, they may choose to use a single polygonal mesh to represent a humanoid, rather than having a separate IndexedFaceSet for each body segment. In such a case, an HAnimJoint would be responsible for moving the vertices that correspond to a particular body segment and all the segments descended from it.

The description of each field shall be as described in 2.[I19774].

26.3.4 HAnimSegment

HAnimSegment : X3DGroupingNode {
  MFNode   [in]     addChildren                          [X3DChildNode]
  MFNode   [in]     removeChildren                       [X3DChildNode]
  SFVec3f  [in,out] centerOfMass     0 0 0               (-∞,∞)
  MFNode   [in,out] children         []                  [X3DChildNode]
  SFNode   [in,out] coord            NULL                [X3DCoordinateNode]
  MFNode   [in,out] displacers       []                  [HAnimDisplacer]
  SFFloat  [in,out] mass             0                   [0,∞)
  SFNode   [in,out] metadata         NULL                [X3DMetadataObject]
  MFFloat  [in,out] momentsOfInertia [0 0 0 0 0 0 0 0 0] [0,∞)
  SFString [in,out] name             ""
  SFVec3f  []       bboxCenter       0 0 0               (-∞,∞)
  SFVec3f  []       bboxSize         -1 -1 -1            [0,∞) or −1 −1 −1
}

Each body segment is stored in an HAnimSegment node. The HAnimSegment node is a grouping node that will typically contain either a number of Shape nodes or perhaps Transform nodes that position the body part within its coordinate system as defined in ISO/IEC 19774 (see 2.[I19774]). The use of LOD nodes is recommended if the geometry of the HAnimSegment is complex.

The description of each field shall be as described in 2.[I19774].

26.3.5 HAnimSite

HAnimSite : X3DGroupingNode {
  MFNode     [in]     addChildren               [X3DChildNode]
  MFNode     [in]     removeChildren            [X3DChildNode]
  SFVec3f    [in,out] center           0 0 0    (-∞,∞)
  MFNode     [in,out] children         []       [X3DChildNode]
  SFNode     [in,out] metadata         NULL     [X3DMetadataObject]
  SFString   [in,out] name             ""
  SFRotation [in,out] rotation         0 0 1 0  (-∞,∞)|[-1,1]
  SFVec3f    [in,out] scale            1 1 1    (0,∞)
  SFRotation [in,out] scaleOrientation 0 0 1 0  (-∞,∞)|[-1,1]
  SFVec3f    [in,out] translation      0 0 0    (-∞,∞)|[-1,1]
  SFVec3f    []       bboxCenter       0 0 0    (-∞,∞)
  SFVec3f    []       bboxSize         -1 -1 -1 [0,∞) or −1 −1 −1
}

An HAnimSite node serves three purposes. The first is to define an "end effector" location which can be used by an inverse kinematics system. The second is to define an attachment point for accessories such as jewelry and clothing. The third is to define a location for a virtual camera in the reference frame of an HAnimSegment (such as a view "through the eyes" of the humanoid for use in multi-user worlds).

The description of each field shall be as described in 2.[I19774].

cube 26.4 Support levels

The H-Anim component provides 1 level of support as specified in Table 26.2.

Table 26.2 — Humanoid animation (H-Anim) component support levels

Level Prerequisites Nodes/Features Support
1 Core 1
Grouping 1
Geometry 2
Shape 1
Texturing 1
Navigation 2
HAnimDisplacer All fields fully supported
HAnimHumanoid All fields fully supported
HAnimJoint All fields fully supported
HAnimSegment All fields fully supported
HAnimSite All fields fully supported
--- X3D separator bar ---