<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="en">
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<TITLE>Extensible 3D (X3D), ISO/IEC 19775-1:2013, 26 H-Anim Component</TITLE>
<link rel="stylesheet" href="../X3D.css" type="text/css">
</HEAD>
<BODY>
<div class="CenterDiv">
<a href="../X3D.html">
<IMG class="x3dlogo" SRC="../../Images/x3d.png" ALT="X3D logo" style="border-width: 0px; width: 176px; height: 88px"></a>
</div>
<div class="CenterDiv">
<p class="HeadingPart">
Extensible 3D (X3D)<br>
Part 1: Architecture and base components</p>
<p class="HeadingClause">26 Humanoid Animation (H-Anim) component</p>
</div>
<IMG class="x3dbar" SRC="../../Images/x3dbar.png" ALT="--- X3D separator bar ---" width="430" height="23">
<h1><a name="Introduction"></a>
<img class="cube" src="../../Images/cube.gif" alt="cube" width="20" height="19">
26.1 Introduction</h1>
<h2><a name="Name"></a>26.1.1 Name</h2>
<p>The name of this component is "H-Anim". This name shall be used when referring
to this component in the COMPONENT statement (see
<a href="core.html#COMPONENTStatement">7.2.5.4 Component statement</a>).</p>
<h2><a name="Overview"></a>26.1.2 Overview</h2>
<p>This clause describes the Humanoid Animation (H-Anim) component of this part
of ISO/IEC 19775. <a href="#t-Topics">Table 26.1</a> 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
<a href="../references.html#[I19774]">2.[I19774]</a>) within X3D.</p>
<div class="CenterDiv">
<p class="TableCaption">
<a name="t-Topics"></a>
Table 26.1 — Topics</p>
<table class="topics">
<tr>
<td>
<ul>
<li><a href="#Introduction">26.1 Introduction</a>
<ul>
<li><a href="#Name">26.1.1 Name</a></li>
<li><a href="#Overview">26.1.2 Overview</a> </li>
</ul>
<li><a href="#Concepts">26.2 Concepts</a>
</li>
<li><a href="#Nodereference">26.3 Node reference</a>
<ul>
<li><a href="#HAnimDisplacer">26.3.1 HAnimDisplacer</a>
<li><a href="#HAnimHumanoid">26.3.2 HAnimHumanoid</a>
<li><a href="#HAnimJoint">26.3.3 HAnimJoint</a>
<li><a href="#HAnimMotion">26.3.4 HAnimMotion</a>
<li><a href="#HAnimSegment">26.3.5 HAnimSegment</a>
<li><a href="#HAnimSite">26.3.5 HAnimSite</a>
</ul>
<li><a href="#SupportLevels">26.6 Support levels</a>
</ul>
<ul>
<li><a href="#t-Topics">Table 26.1 — Topics</a></li>
<li><a href="#t-supportlevels">Table 26.2 — H-anim component support levels</a></li>
</ul>
</td>
</tr>
</table>
</div>
<h1><img class="cube" src="../../Images/cube.gif" alt="cube" width="20" height="19">
<a name="Concepts"></a>
26.2 Concepts</h1>
<p>This component maps the functionality defined in
<a href="../references.html#[I19774]">ISO/IEC 19774</a> to a set of X3D nodes. The
semantics for these nodes are as specified therein. </p>
<h1><img class="cube" src="../../Images/cube.gif" alt="cube" width="20" height="19">
<a name="Nodereference"></a>
26.3 Node reference</h1>
<h2><a name="HAnimDisplacer"></a>26.3.1 HAnimDisplacer</h2>
<pre class="node">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 (-∞,∞)
}
</pre>
<p>Applications may need to alter the shape of individual segments. At the
most basic level, this is done by writing to the <i>point</i> field of the
node derived from <i><a href="rendering.html#X3DCoordinateNode">X3DCoordinateNode</a></i> that is found in the <i>coord</i> field of the
<a href="#HAnimSegment">HAnimSegment</a> node.</p>
<p>In some cases, the application may need to be able to identify
specific groups of vertices within an HAnimSegment. </p>
<p><span class="example">EXAMPLE The application
may need to know which vertices within the skull HAnimSegment comprise the left
eyebrow. </span></p>
<p>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 <i>displacers</i> field
of that HAnimSegment.</p>
<p>The description of each field shall be as described in
<a href="../references.html#[I19774]">ISO/IEC 19774</a>.</p>
<h3><a name="HAnimHumanoid"></a>26.3.2 HAnimHumanoid</h3>
<pre class="node">HAnimHumanoid : X3DChildNode, X3DBoundedObject {
SFVec3f [in,out] center 0 0 0 (-∞,∞)
MFString [in,out] info []
MFNode [in,out] joints [] [HAnimJoint]
SFInt32 [in,out] loa -1 [-1,4]
SFNode [in,out] metadata NULL [X3DMetadataObject]
MFNode [in,out] motions [] [HAnimMotion]
MFBool [in,out] motionsEnabled []
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
}
</pre>
<p>The HAnimHumanoid node is used to store human-readable data such as author and
copyright information, as well as to store references to the
<a href="#HAnimJoint">HAnimJoint</a>, <a href="#HAnimSegment">HAnimSegment</a>,
and <a href="#HAnimSite">HAnimSite</a> 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.</p>
<p>The description of each field shall be as described in
<a href="../references.html#[I19774]">ISO/IEC 19774</a>.</p>
<h2><a name="HAnimJoint"></a>26.3.3 HAnimJoint</h2>
<pre class="node">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]
MFVec3f [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 (-∞,∞)
MFVec3f [in,out] ulimit [] (-∞,∞)
SFVec3f [] bboxCenter 0 0 0 (-∞,∞)
SFVec3f [] bboxSize -1 -1 -1 [0,∞) or −1 −1 −1
}
</pre>
<p>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. </p>
<p>An HAnimJoint may only be a child of another HAnimJoint node or a child
within the <i>skeleton</i> field in the case of the HAnimJoint used as a
humanoid root
(<i>i.e.</i>, an HAnimJoint may not be a child of an <a href="#HAnimSegment">HAnimSegment</a>).</p>
<p>The HAnimJoint node is also used to store other joint-specific information.
In particular, a joint <i>name</i> is provided so that applications can identify
each HAnimJoint node at run-time. The HAnimJoint 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.<p class="Example">NOTE 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.
<p>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
<a href="geometry3D.html#IndexedFaceSet">IndexedFaceSet</a>
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. </p>
<p>The description of each field shall be as described in
<a href="../references.html#[I19774]">ISO/IEC 19774</a>.</p>
<h2><a name="HAnimMotion"></a>26.3.4 HAnimMotion</h2>
<pre class="node">HAnimMotion : X3DChildNode {
SFString [in,out] description ""
MFString [in,out] channels []
MFBool [in,out] channelsEnabled []
MFString [in,out] joints []
SFInt32 [in,out] loa -1 [-1,4]
SFNode [in,out] metadata NULL [X3DMetadataObject]
MFFloat [in,out] values [] (-∞,∞)
SFTime [in,out] frameTime 0.1 (0,∞)
SFInt32 [out] frameCount [0,∞)
}
</pre>
<p>
HAnimMotion is used for motion animation of Humanoid characters.
Raw motion data, for example, motion capture data, details the number of frames,
the frame display time, and the parameter values for the motion from each channel
at each frame.</p>
<p>The description of each field shall be as described in
<a href="../references.html#[I19774]">ISO/IEC 19774</a>.</p>
<h2><a name="HAnimSegment"></a>26.3.5 HAnimSegment</h2>
<pre class="node">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
}
</pre>
<p>Each body segment is stored in an HAnimSegment node. The HAnimSegment node is
a grouping node that will typically contain
either a number of <a href="shape.html#Shape">Shape</a> nodes or perhaps
<a href="grouping.html#Transform">Transform</a> nodes that position the body part
within its coordinate system as defined in <a href="../references.html#[I19774]">
ISO/IEC 19774</a>. The use of LOD nodes is recommended
if the geometry of the HAnimSegment is complex.</p>
<p>The description of each field shall be as described in
<a href="../references.html#[I19774]">ISO/IEC 19774</a>.</p>
<h2><a name="HAnimSite"></a>26.3.6 HAnimSite</h2>
<pre class="node">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
}
</pre>
<p>An HAnimSite node serves three purposes. The first is to define an "end
effecter"
location that 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). </p>
<p>The description of each field shall be as described in
<a href="../references.html#[I19774]">ISO/IEC 19774</a>.</p>
<h1><img class="cube" src="../../Images/cube.gif" alt="cube" width="20" height="19">
<a name="SupportLevels"></a>26.4 Support levels</h1>
<p>The H-Anim component provides 1 level of support as specified in <a href="#t-supportlevels">
Table 26.2</a>.</p>
<div class="CenterDiv">
<p class="TableCaption">
<a name="t-supportlevels"></a>
<b>Table 26.</b>2 —
<b>Humanoid animation (H-Anim) component support levels</b></p>
<table>
<tr>
<th>Level</th>
<th>Prerequisites</th>
<th>Nodes/Features</th>
<th>Support</th>
</tr>
<tr>
<td><b>1</b></td>
<td>Core 1<br> Grouping 1<br> Geometry3D 2<br>
Shape 1<br> Texturing 1<br> Navigation 2</td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td>HAnimDisplacer</td>
<td>All fields fully supported.</td>
</tr>
<tr>
<td></td>
<td></td>
<td>HAnimHumanoid</td>
<td>All fields fully supported.
</td>
</tr>
<tr>
<td></td>
<td></td>
<td>HAnimJoint</td>
<td>All fields fully supported.</td>
</tr>
<tr>
<td></td>
<td></td>
<td>HAnimSegment</td>
<td>All fields fully supported.</td>
</tr>
<tr>
<td></td>
<td></td>
<td>HAnimSite</td>
<td>All fields fully supported.</td>
</tr>
<tr>
<td><b>2</b></td>
<td>Core 1<br> Grouping 1<br> Geometry3D 2<br>
Shape 1<br> Texturing 1<br> Navigation 2</td>
<td></td>
<td>
<b>TODO:</b> insert a level for HAnimHumanoid skin support?</td>
</tr>
<tr>
<td></td>
<td></td>
<td>HAnimDisplacer</td>
<td>All fields fully supported.</td>
</tr>
<tr>
<td></td>
<td></td>
<td>HAnimHumanoid</td>
<td>All fields fully supported.</td>
</tr>
<tr>
<td></td>
<td></td>
<td>HAnimJoint</td>
<td>All fields fully supported.</td>
</tr>
<tr>
<td></td>
<td></td>
<td>HAnimSegment</td>
<td>All fields fully supported.</td>
</tr>
<tr>
<td></td>
<td></td>
<td>HAnimSite</td>
<td>All fields fully supported.</td>
</tr>
<tr>
<td><b>2</b></td>
<td>Core 1<br> Grouping 1<br> Geometry3D 2<br>
Shape 1<br> Texturing 1<br> Navigation 2</td>
<td></td>
<td>
<b>TODO:</b> insert a level for HAnimMotion support</td>
</tr>
<tr>
<td></td>
<td></td>
<td>HAnimDisplacer</td>
<td>All fields fully supported.</td>
</tr>
<tr>
<td></td>
<td></td>
<td>HAnimHumanoid</td>
<td>All fields fully supported.</td>
</tr>
<tr>
<td></td>
<td></td>
<td>HAnimJoint</td>
<td>All fields fully supported.</td>
</tr>
<tr>
<td></td>
<td></td>
<td>HAnimMotion</td>
<td>All fields fully supported.</td>
</tr>
<tr>
<td></td>
<td></td>
<td>HAnimSegment</td>
<td>All fields fully supported.</td>
</tr>
<tr>
<td></td>
<td></td>
<td>HAnimSite</td>
<td>All fields fully supported.</td>
</tr>
</table>
</div>
<img class="x3dbar" src="../../Images/x3dbar.png" alt="--- X3D separator bar ---" width="430" height="23">
</BODY>
</HTML>