Part 1: Humanoid animation (HAnim) architecture

Annex C

(informative)

VRML binding

# C.1 General

## C.1.1 Overview

This annex specifies the functionality of this document as a set of VRML prototypes that can be instantiated as nodes within a VRML world. VRML is specified in ISO/IEC 14772-1.

## C.1.2 Topics

Table C.1 lists the topics of this annex.

Table C.1 — Topics

C.1 General C.1.1 Overview C.1.2 Topics C.2 Humanoid C.3 Joint C.4 Segment C.5 Site C.6 Displacer Table C.1 — Topics

# C.2 Humanoid

     PROTO HAnimHumanoid [
       field           SFVec3f    bboxCenter            0 0 0
       field           SFVec3f    bboxSize              -1 -1 -1
       exposedField    SFVec3f    center                0 0 0
       exposedField    MFString   info                  []
       field           MFVec3f    jointBindingPositions [0 0 0]
       field           MFRotation jointBindingRotations [0 0 1 0]
       field           MFVec3f    jointBindingScales    [1 1 1]
       exposedField    MFNode     joints                []
       exposedField    SFString   name                  ""
       exposedField    SFRotation rotation              0 0 1 0
       exposedField    SFVec3f    scale                 1 1 1
       exposedField    SFRotation scaleOrientation      0 0 1 0
       exposedField    MFNode     segments              []
       exposedField    MFNode     sites                 []
       field           SFString   skeletalConfiguration "BASIC"
       exposedField    MFNode     skeleton              []
       exposedField    MFNode     skin                  []
       exposedField    MFVec3f    skinBindingCoords     []
       exposedField    MFVec3f    skinBindingNormals    []
       exposedField    MFVec3f    skinCoord             []
       exposedField    MFVec3f    skinNormal            []
       exposedField    SFVec3f    translation           0 0 0
       exposedField    SFString   version               "2.0"
       exposedField    MFNode     viewpoints            []
     ]

The name field provides a name for the HAnimHumanoid node, by which it can be identified by an application at runtime. That name shall also be used as the DEF name of the HAnimHumanoid node itself, but with a distinguishing prefix in front of it. That prefix can be anything. The name field shall be present, so that the humanoid can be identified at runtime.

The geometry of an HAnim figure can be described in two ways. The first way is within the scene graph of the joint hierarchy, which is described in the skeleton field of the HAnimHumanoid node. Geometry defined within HAnimSegment nodes of this joint hierarchy describe the body as separate geometric pieces. This method, while computationally efficient, has certain visual anomalies (such as seams or creases) that detract from the appearance of the HAnim figure. The second way of describing the geometry of an HAnim figure is as a continuous piece of geometry, within the skin field of the HAnimHumanoid node. For this method, point and normal vector data sets are first defined in the skinCoord and skinNormal fields (in the form of Coordinate and Normal nodes, respectively). This data is defined in this manner to allow it to be referenced by two different entities within the definition of the HAnimHumanoid node. The first entity is one or more IndexedFaceSet nodes that define the surface of the geometry of the humanoid within the skin field. In most cases, this surface is a single IndexedFaceSet node. However, the surface can also be defined as multiple IndexedFaceSet nodes. It is possible that depending on the implementation of the IndexedFaceSet nodes and the configuration of the HAnim figure, multiple IndexedFaceSet nodes may provide better performance by isolating the continuous mesh changes to localized surfaces.

# C.3 Joint

     PROTO HAnimJoint [
       field        SFVec3f    bboxCenter         0 0 0
       field        SFVec3f    bboxSize           -1 -1 -1
       exposedField SFVec3f    center             0 0 0
       exposedField MFNode     children           []
       exposedField MFNode     displacers         []
       exposedField MFRotation limitOrientation   []
       exposedField MFVec3f    llimit             []
       exposedField SFString   name               ""
       exposedField SFRotation rotation           0 0 1 0
       exposedField SFVec3f    scale              1 1 1
       exposedField SFRotation scaleOrientation   0 0 1 0
       exposedField MFVec3f    stiffness          [1 1 1]
       exposedField SFVec3f    translation        0 0 0
       exposedField MFVec3f    ulimit             []
     ]

The name field is used for identifying the joints at runtime. Each HAnimJoint object shall have a name that meets the requirements of this document, but with a distinguishing prefix in front of it. That prefix can be anything, but shall be the same for all the HAnimJoint nodes in a particular humanoid. The distinguishing prefix is useful in the case of static routing to the HAnimJoint nodes of multiple humanoids in the same representation. If only a single humanoid is stored in a VRML file, the prefix may be `"hanim_"` (for Humanoid Animation).

EXAMPLE The left shoulder has a name of `"hanim_l_shoulder"`

The name is used for static routing, which typically connects OrientationInterpolator nodes in the humanoid representation to the joints. The name field shall be present, so that applications are able to identify the HAnimJoint node at runtime.

# C.4 Segment

     PROTO HAnimSegment [
       field           SFVec3f     bboxCenter        0 0 0
       field           SFVec3f     bboxSize          -1 -1 -1
       exposedField    SFVec3f     centerOfMass      0 0 0
       exposedField    MFNode      children          []
       exposedField    SFNode      coord             NULL
       exposedField    MFNode      displacers        []
       exposedField    SFFloat     mass              -1
       exposedField    MFFloat     momentsOfInertia  [0 0 0 0 0 0 0 0 0]
       exposedField    SFString    name              ""
     ]

The name field shall be present, so that the HAnimSegment node can be identified at runtime. Each HAnimSegment node shall have a name meets the requirements of this document, but with a distinguishing prefix in front of it. That prefix can be anything, but shall be the same for all the HAnimSegment nodes in a particular humanoid. The distinguishing prefix is useful in the case of static routing to the HAnimSegment nodes of multiple humanoids in the same file. If only a single humanoid is stored in a file, the prefix may be `"hanim_"` (for Humanoid Animation).

EXAMPLE The left thigh has a name of `"hanim_l_thigh"`.

# C.5 Site

     PROTO HAnimSite [
       field           SFVec3f     bboxCenter        0 0 0
       field           SFVec3f     bboxSize          -1 -1 -1
       exposedField    SFVec3f     center            0 0 0
       exposedField    MFNode      children          []
       exposedField    SFString    name              ""
       exposedField    SFRotation  rotation          0 0 1 0
       exposedField    SFVec3f     scale             1 1 1
       exposedField    SFRotation  scaleOrientation  0 0 1 0
       exposedField    SFVec3f     translation       0 0 0
     ]

The name field shall be present, so that the HAnimSite node can be identified at runtime. The name field is used for identifying the HAnimSite objects at runtime. If used as an end effector, the HAnimSite node shall have a name consisting of the name of the HAnimSegment node to which it is attached, with an `"_tip"` suffix appended.

EXAMPLE 1 The end effector HAnimSite node on the right index finger is named `"r_index_distal_tip"`, and the HAnimSite node is a child of the `"r_index_distal"` HAnimSegment object.

HAnimSite nodes that are used to define camera locations shall have an `"_view"` suffix appended. HAnimSite nodes that are not end effectors and not camera locations shall have an `"_pt"` suffix. HAnimSite nodes that are required by an application but are not defined in this document shall be prefixed with `"x_"`. Each HAnimSite node shall have a name that matches the name field for that HAnimSite node, but with a distinguishing prefix in front of it. That prefix can be anything, but shall be the same for all the HAnimSite nodes in a particular humanoid. The distinguishing prefix is useful in the case of static routing to the HAnimSite nodes of multiple humanoids in the same file. If only a single humanoid is stored in a file, the prefix may be `"hanim_"`.

EXAMPLE 2 The right index finger has a name of `"hanim_r_index_distal_tip"`.

# C.6 Displacer

     PROTO HAnimDisplacer [
       exposedField   MFInt32   coordIndex    []
       exposedField   MFVec3f   displacements []
       exposedField   SFString  name          ""
       exposedField   SFFloat   weight        0
     ]

The name field provides a name for the HAnimDisplacer node, by which it can be identified by an application at runtime. That name shall also be used as the DEF name of the HAnimDisplacer node itself, but with a distinguishing prefix in front of it. That prefix can be anything, but shall be the same for all the HAnimDisplacer nodes in a particular humanoid. The name field shall be present, so that the HAnimDisplacer node can be identified at runtime. HAnimDisplacer nodes that are used to identify features shall have a name with an `"_feature"` suffix. HAnimDisplacer nodes that are used to move a feature shall be given a name with an `"_action"` suffix, usually with an additional pre-suffix to indicate the kind of motion (such as `"l_eyebrow_raiser_action"`). HAnimDisplacer nodes that correspond to a particular configuration of the vertices shall have an `"_config"` suffix.