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 "HAnim". This name shall be used when referring to this component in the COMPONENT statement (see 7.2.3.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 the H-Anim standard (see 2.[I19774]) within X3D.

Table 26.1 — Topics in this clause

cube 26.2 Concepts

26.2.1 General

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 [] [X3DCoordinateNode]
  SFString [in,out] name          ""
}

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's 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. For 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 {
  SFVec3f    [in,out] center           0 0 0    (-∞,∞)
  MFNode     [in,out] humanoidBody     []       [HumanoidRoot]
  MFString   [in,out] info             []
  MFNode     [in,out] joints           []       [HAnimJoint]
  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]
  MFNode     [in,out] skin             []       [IndexedFaceSet]
  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       []       [Viewpoint]
  SFVec3f    []       bboxCenter       0 0 0    (-∞,∞)
  SFVec3f    []       bboxSize         -1 -1 -1 (0,∞)|[-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 Viewpoint nodes in addition to serving as a container for the entire humanoid. It also provides a convenient way of 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]
  SFRotation [in,out] limitOrientation 0 0 1 0  (-∞,∞)|[-1,1]
  MFFloat    [in,out] llimit           []       (-∞,∞)
  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,∞)|[-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,∞)
  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,∞) | -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]
  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,∞)|[-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.3.

Table 26.3Humanoid animation (H-Anim) component support levels

Level Prerequisites Nodes Support
1 Core 1;
Grouping 1;
Geometry 2;
Geometric properties 1;
Texturing 1;
Navigation 2.
HAnimDisplacer All fields
HAnimHumanoid All fields
HAnimJoint All fields
HAnimSegment All fields
HAnimSite All fields
--- X3D separator bar ---