Part 1: Humanoid animation (HAnim) architecture

Annex F

(informative)

Guidelines for HAnim character design

# F.1 General

## F.1.1 Overview

This annex specifies guidelines for creating an HAnim character model using a general graphics tool.

## F.1.2 Topics

Table F.1 lists the topics of this annex.

Table F.1 — Topics

F.1 General F.1.1 Overview F.1.2 Topics F.2 Structure F.3 Skin F.4 Articulation Figure F.1 — Joint names Table F.1 — Topics Table F.2 — Joints composition for each LOA (number of joints)

# F.2 Structure

The structure of a humanoid character model can be defined with LOA‑1, LOA‑2, LOA‑3, or LOA‑4 hierarchy. All joints of an HAnim figure are represented as a tree hierarchy starting with the `humanoid_root` joint. For an LOA‑1 character, there are 18 joints and 18 segments in the hierarchy. Design guidelines for a humanoid character are as follows:

When designing a humanoid character model, the first step is to determine units. Next, when modelling, each segment and each joint is specified with its name. If representing one of the defined LOAs, then the appropriate names are assigned. Figure F.1 shows joint names for LOA‑1 joints. Each joint has a segment. After modelling each joint with a segment, all joints are integrated in a tree hierarchy. The integrated character model is positioned in the default posture specified in Figure 4.1. Each segment contains its geometry, material or texture properties, and a joint that is used for rotating the segment. The structure of the humanoid character model is represented as the hierarchy of all joints.

After integrating all segments with joints, all the local coordinates of the segments are arranged with global coordinates for the integrated character. This is accomplished by resetting all the coordinates with the global coordinate system. The next step is to determine the centre of the joint for each segment. The centre of the joint is used to transform the segment according to the joint motion.

If necessary, the HAnim character can be scaled, at this stage considering real length. If the exact length is required, the real length of each segment can be taken into consideration at the beginning when each segment is modelled. For example, the character can initially be designed considering only the length ratio of each segment then, at this stage, the segments can be scaled according to real length (e.g. the height of the character).

Figure F.1 — Joint names

EXAMPLE The following is an extract of an example HAnim X3D file showing the structure of a character model.

        <Scene>
          <NavigationInfo speed="1.5" type='"EXAMINE" "ANY"' />
          <Viewpoint centerOfRotation="0 1 0" description="KoreanCharacter01Jin" position="0 1 3" />
          <HAnimHumanoid DEF="hanim_HAnim" info="humanoidVersion=2.0" containerField="skeleton" name="HAnim" scale="0.0225 0.0225 0.0225" version="2.0" >

            <HAnimJoint DEF="hanim_humanoid_root" center="0.000000 30.530001 -0.707600" name="humanoid_root" >
              <HAnimSegment DEF="hanim_sacrum" name="sacrum" >
                <Transform translation="0.000000 30.530001 -0.707600" >
                  <Shape>
                    <Appearance>
                      <Material diffuseColor="0.588000 0.588000 0.588000" />
                      <ImageTexture DEF="KoreanCharacter01JinTextureAtlas" url="Jin.png" />
                    </Appearance>
                    <IndexedFaceSet creaseAngle="3.14159" coordIndex="0, 1, 2, -1, 0, 2, 3, -1, 0, ... "
                                                          texCoordIndex="0, 1, 2, -1, 0, 2, 3, -1, 0, ... " >
                      <Coordinate point="0.0000 10.7900 0.1424, 0.0000 10.0600 -2.8250, ... " />
                      <TextureCoordinate point="0.6211 0.5754,0.7851 0.5720,0.7614 0.5720, ... " />
                    </IndexedFaceSet>
                  </Shape>
                </Transform>
              </HAnimSegment>

              <HAnimJoint DEF="hanim_sacroiliac" center="0.000000 35.799999 -0.707600" name="sacroiliac" >
                <HAnimSegment DEF="hanim_pelvis" name="pelvis" >
                  <Transform translation="0.000000 35.799999 -0.707600" >
                    <Shape>
                      <Appearance>
                        <Material diffuseColor="0.588000 0.588000 0.588000" />
                        <ImageTexture USE="KoreanCharacter01JinTextureAtlas" />
                      </Appearance>
                      <IndexedFaceSet creaseAngle="3.14159" coordIndex="0, 1, 2, -1, 0, 2, 3, -1, 0, ... "
                                                            texCoordIndex="0, 1, 2, -1, 0, 2, 3, -1, 0, ... " >
                        <Coordinate point="0.0000 1.0530 0.0273, 0.0000 0.9123 -0.5414, ... " />
                        <TextureCoordinate point="0.6211 0.5754,0.7851 0.5720,0.7614 0.5720, ... " />
                      </IndexedFaceSet>
                    </Shape>
                  </Transform>
                </HAnimSegment>

              <HAnimJoint DEF="hanim_l_hip" center="4.207000 32.020000 -0.815500" name="l_hip" >
                <HAnimSegment DEF="hanim_l_thigh" name="l_thigh" >
                  <Transform translation="4.207000 32.020000 -0.815500" >
                    <Shape>
                      <Appearance>
                        <Material diffuseColor="0.588000 0.588000 0.588000" />
                        <ImageTexture USE="KoreanCharacter01JinTextureAtlas" />
                      </Appearance>
                      <IndexedFaceSet creaseAngle="3.14159" coordIndex="47, 46, 45, -1, 45, 44, 43, -1, 45, ... "
                                                            texCoordIndex="5, 4, 3, -1, 3, 2, 0, -1, 3, ... " >
                        <Coordinate point="2.9600 3.7380 0.0000, 1.6430 3.7380 3.2090, ... " />
                        <TextureCoordinate point="0.7190 0.5576,0.6284 0.5576,0.7414 0.5576, ... " />
                      </IndexedFaceSet>
                    </Shape>
                  </Transform>
                </HAnimSegment>

                <HAnimJoint DEF="hanim_l_knee" center="4.116000 17.260000 -0.863900" name="l_knee" >
                  <HAnimSegment DEF="hanim_l_calf" name="l_calf" >
                    <Transform translation="4.116000 17.260000 -0.863900" >
                      <Shape>
                        <Appearance>
                          <Material diffuseColor="0.588000 0.588000 0.588000" />
                          <ImageTexture USE="KoreanCharacter01JinTextureAtlas" />
                        </Appearance>
                        <IndexedFaceSet creaseAngle="3.14159" coordIndex="4, 3, 2, -1, 5, 4, 2, -1, 2, ... "
                                                              texCoordIndex="4, 3, 2, -1, 5, 4, 2, -1, 2, ... " >
                          <Coordinate point="0.7186 0.9688 0.0234, 0.3632 0.9688 0.9354, ... " />
                          <TextureCoordinate point="0.9309 0.5848,0.9190 0.5848,0.8921 0.5848, ... " />
                        </IndexedFaceSet>
                      </Shape>
                    </Transform>
                  </HAnimSegment>

                  <HAnimJoint DEF="hanim_l_talocrural" center="3.854000 3.939000 -0.703800" name="l_ankle" >
                    <HAnimSegment DEF="hanim_l_talus" name="l_talus" >
                      <Transform translation="3.854000 3.939000 -0.703800" >
                        <Shape>
                          <Appearance>
                            <Material diffuseColor="0.588000 0.588000 0.588000" />
                            <ImageTexture USE="KoreanCharacter01JinTextureAtlas" />
                          </Appearance>
                          <IndexedFaceSet creaseAngle="3.14159" coordIndex="1, 11, 14, -1, 3, 4, 5, -1, 5, ... "
                                                                texCoordIndex="1, 14, 18, -1, 3, 4, 5, -1, 5, ... " >
                            <Coordinate point="0.9768 -0.0192 -1.6810, 1.6570 -0.0192 0.4309, ... " />
                            <TextureCoordinate point="0.3819 0.1710,0.4216 0.1651,0.3819 0.1710, ... " />
                          </IndexedFaceSet>
                        </Shape>
                      </Transform>
                    </HAnimSegment>

                    <HAnimJoint DEF="hanim_l_metatarsophalangeal" center="3.854000 3.640000 0.740200" name="l_metatarsophalangeal" >
                      <HAnimSegment DEF="hanim_l_tarsal_proximal_phalanx" name="l_tarsal_proximal_phalanx" >
                        <Transform translation="3.854000 3.640000 0.740200" >
                          <Shape>
                            <Appearance>
                              <Material diffuseColor="0.588000 0.588000 0.588000" />
                              <ImageTexture USE="KoreanCharacter01JinTextureAtlas" />
                            </Appearance>
                            <IndexedFaceSet creaseAngle="3.14159" coordIndex="3, 4, 10, -1, 3, 10, 11, -1, 0, ... "
                                                                  texCoordIndex="4, 5, 12, -1, 4, 12, 13, -1, 0, 4, 13, -1, ... " >
                              <Coordinate point="2.9270 -1.6270 -1.0130, 2.0890 -3.6480 -1.0130, ... " />
                              <TextureCoordinate point="0.4330 0.0595,0.4411 0.0186,0.4637 0.1714, ... " />
                            </IndexedFaceSet>
                          </Shape>
                        </Transform>
                      </HAnimSegment>
                    </HAnimJoint>
                  </HAnimJoint>
                </HAnimJoint>
              </HAnimJoint>

              <HAnimJoint DEF="hanim_r_hip" center="-4.207000 32.020000 -0.815500" name="r_hip" >
                <HAnimSegment DEF="hanim_r_thigh" name="r_thigh" >
                  <Transform translation="-4.207000 32.020000 -0.815500" >
                    <Shape>
                      <Appearance>
                        <Material diffuseColor="0.588000 0.588000 0.588000" />
                        <ImageTexture USE="KoreanCharacter01JinTextureAtlas" />
                      </Appearance>
                      <IndexedFaceSet creaseAngle="3.14159" coordIndex="43, 44, 45, -1, 42, 43, 45, -1, 45, ... "
                                                            texCoordIndex="0, 2, 3, -1, 1, 0, 3, -1, 3, ... " >
                        <Coordinate point="-2.9600 3.7380 0.0000, -1.6430 3.7380 3.2090, ... " />
                        <TextureCoordinate point="0.7190 0.5576,0.6284 0.5576,0.7414 0.5576, ... " />
                      </IndexedFaceSet>
                    </Shape>
                  </Transform>
                </HAnimSegment>

                <HAnimJoint DEF="hanim_r_knee" center="-4.116000 17.260000 -0.863900" name="r_knee" >
                  <HAnimSegment DEF="hanim_r_calf" name="r_calf" >
                    <Transform translation="-4.116000 17.260000 -0.863900" >
                      <Shape>
                        <Appearance>
                          <Material diffuseColor="0.588000 0.588000 0.588000" />
                          <ImageTexture USE="KoreanCharacter01JinTextureAtlas" />
                        </Appearance>
                        <IndexedFaceSet creaseAngle="3.14159" coordIndex="0, 1, 2, -1, 2, 3, 4, -1, 2, ... "
                                                              texCoordIndex="0, 1, 2, -1, 2, 3, 4, -1, 2, ... " >
                          <Coordinate point="-0.7186 0.9688 0.0234, -0.3632 0.9688 0.9354, ... " />
                          <TextureCoordinate point="0.9309 0.5848,0.9190 0.5848,0.8921 0.5848, ... " />
                        </IndexedFaceSet>
                      </Shape>
                    </Transform>
                  </HAnimSegment>

                  <HAnimJoint DEF="hanim_r_talocrural" center="-3.854000 3.939000 -0.703800" name="r_talocrural" >
                    <HAnimSegment DEF="hanim_r_talus" name="r_talus" >
                      <Transform translation="-3.854000 3.939000 -0.703800" >
                        <Shape>
                          <Appearance>
                            <Material diffuseColor="0.588000 0.588000 0.588000" />
                            <ImageTexture USE="KoreanCharacter01JinTextureAtlas" />
                          </Appearance>
                          <IndexedFaceSet creaseAngle="3.14159" coordIndex="1, 14, 11, -1, 3, 6, 5, -1, 5, ... "
                                                                texCoordIndex="1, 18, 14, -1, 3, 6, 5, -1, 5, ... " >
                            <Coordinate point="-0.9768 -0.0192 -1.6810, -1.6570 -0.0192 0.4309, ... " />
                            <TextureCoordinate point="0.3819 0.1710,0.4216 0.1651,0.3819 0.1710, ... " />
                          </IndexedFaceSet>
                        </Shape>
                      </Transform>
                    </HAnimSegment>

                    <HAnimJoint DEF="hanim_r_metatarsophalangeal" center="-3.854000 3.640000 0.740200" name="r_metatarsophalangeal" >
                      <HAnimSegment DEF="hanim_r_tarsal_proximal_phalanx" name="r_tarsal_proximal_phalanx" >
                        <Transform translation="-3.854000 3.640000 0.740200" >
                          <Shape>
                            <Appearance>
                              <Material diffuseColor="0.588000 0.588000 0.588000" />
                              <ImageTexture USE="KoreanCharacter01JinTextureAtlas" />
                            </Appearance>
                            <IndexedFaceSet creaseAngle="3.14159" coordIndex="10, 4, 3, -1, 11, 10, 3, -1, 0, ... "
                                                                  texCoordIndex="12, 5, 4, -1, 13, 12, 4, -1, 0, ... " >
                              <Coordinate point="-2.9270 -1.6270 -1.0130, -2.0890 -3.6480 -1.0130, ... " />
                              <TextureCoordinate point="0.4330 0.0595,0.4411 0.0186,0.4637 0.1714, ... " />
                            </IndexedFaceSet>
                          </Shape>
                        </Transform>
                      </HAnimSegment>
                    </HAnimJoint>
                  </HAnimJoint>
                </HAnimJoint>
              </HAnimJoint>
            </HAnimJoint>

                <HAnimJoint DEF="hanim_vl5" center="0.000000 40.230000 -0.852700" name="vl5" >
                  <HAnimSegment DEF="hanim_l5" name="l5" >
                    <Transform translation="0.000000 40.230000 -0.852700" >
                      <Shape>
                        <Appearance>
                          <Material diffuseColor="0.588000 0.588000 0.588000" />
                          <ImageTexture USE="KoreanCharacter01JinTextureAtlas" />
                        </Appearance>
                        <IndexedFaceSet creaseAngle="3.14159" coordIndex="3, 4, 7, -1, 7, 5, 3, -1, 4, ... "
                                                              texCoordIndex="2, 3, 0, -1, 0, 1, 2, -1, 3, ... " >
                          <Coordinate point="0.6928 14.5600 -1.2630, 0.0000 14.6100 -1.3550, ... " />
                          <TextureCoordinate point="0.4756 0.6180,0.4724 0.6293,0.4618 0.6351, ... " />
                        </IndexedFaceSet>
                      </Shape>
                    </Transform>
                  </HAnimSegment>
                </HAnimJoint>

                <HAnimJoint DEF="hanim_skullbase" center="0.000000 57.430000 -0.686300" name="skullbase" >
                  <HAnimSegment DEF="hanim_skull" name="skull" >
                      <Transform translation="0.000000 57.430000 -0.686300" >
                        <Shape>
                          <Appearance>
                            <Material diffuseColor="0.588000 0.588000 0.588000" />
                            <ImageTexture USE="KoreanCharacter01JinTextureAtlas" />
                          </Appearance>
                          <IndexedFaceSet creaseAngle="3.14159" coordIndex="58, 44, 47, -1, 47, 49, 58, -1, 49, ... "
                                                                texCoordIndex="0, 3, 2, -1, 2, 1, 0, -1, 1, ... " >
                            <Coordinate point="4.7340 2.2950 -0.4780, 0.0000 7.9250 -7.3470, ... " />
                            <TextureCoordinate point="0.9175 0.8974,0.9509 0.8981,0.9421 0.8701, ... " />
                          </IndexedFaceSet>
                        </Shape>
                      </Transform>
                  </HAnimSegment>
               </HAnimJoint>

                <HAnimJoint DEF="hanim_l_shoulder" center="5.975000 52.000000 -0.145200" name="l_shoulder" >
                  <HAnimSegment DEF="hanim_l_upperarm" name="l_upperarm" >
                    <Transform translation="5.975000 52.000000 -0.145200" >
                      <Shape>
                        <Appearance>
                          <Material diffuseColor="0.588000 0.588000 0.588000" />
                          <ImageTexture USE="KoreanCharacter01JinTextureAtlas" />
                        </Appearance>
                        <IndexedFaceSet creaseAngle="3.14159" coordIndex="2, 1, 0, -1, 3, 2, 0, -1, 4, ... "
                                                              texCoordIndex="2, 0, 1, -1, 3, 2, 1, -1, 61, ... " >
                          <Coordinate point="2.5250 1.2460 -1.6800, 3.6810 1.2360 0.0337, ... " />
                          <TextureCoordinate point="0.2986 0.2114,0.2726 0.2114,0.3201 0.2114, ... " />
                        </IndexedFaceSet>
                      </Shape>
                    </Transform>
                  </HAnimSegment>

                  <HAnimJoint DEF="hanim_l_elbow" center="8.093000 40.380001 -0.250200" name="l_elbow" >
                    <HAnimSegment DEF="hanim_l_forearm" name="l_forearm" >
                      <Transform translation="8.093000 40.380001 -0.250200" >
                        <Shape>
                          <Appearance>
                            <Material diffuseColor="0.588000 0.588000 0.588000" />
                            <ImageTexture USE="KoreanCharacter01JinTextureAtlas" />
                          </Appearance>
                          <IndexedFaceSet creaseAngle="3.14159" coordIndex="2, 1, 0, -1, 3, 2, 0, -1, 4, ... "
                                                                texCoordIndex="2, 25, 26, -1, 3, 2, 26, -1, 4, ... " >
                            <Coordinate point="0.2150 0.3047 -1.1520, 1.1550 0.2966 -0.2588, 0.6199 0.3013 1. ... " />
                            <TextureCoordinate point="0.4222 0.6201,0.4327 0.6201,0.3884 0.6201, ... " />
                          </IndexedFaceSet>
                        </Shape>
                      </Transform>
                    </HAnimSegment>

                    <HAnimJoint DEF="hanim_l_radiocarpal" center="7.808000 31.459999 -0.058490" name="l_radiocarpal" >
                      <HAnimSegment DEF="hanim_l_carpal" name="l_carpal" >
                        <Transform translation="7.808000 31.459999 -0.058490" >
                          <Shape>
                            <Appearance>
                              <Material diffuseColor="0.588000 0.588000 0.588000" />
                              <ImageTexture USE="KoreanCharacter01JinTextureAtlas" />
                            </Appearance>
                            <IndexedFaceSet creaseAngle="3.14159" coordIndex="4, 5, 0, -1, 0, 2, 4, -1, 6, ... "
                                                                 texCoordIndex="4, 6, 5, -1, 5, 7, 4, -1, 2, ... " >
                              <Coordinate point="1.2470 0.0700 0.7975, 1.2090 0.0872 -1.3490, ... " />
                              <TextureCoordinate point="0.8107 0.9924,0.8122 0.9033,0.7694 0.9912, ... " />
                            </IndexedFaceSet>
                          </Shape>
                        </Transform>
                      </HAnimSegment>
                    </HAnimJoint>
                  </HAnimJoint>
                </HAnimJoint>

                <HAnimJoint DEF="hanim_r_shoulder" center="-5.975000 52.000000 -0.145200" name="r_shoulder" >
                  <HAnimSegment DEF="hanim_r_upperarm" name="r_upperarm" >
                    <Transform translation="-5.975000 52.000000 -0.145200" >
                      <Shape>
                        <Appearance>
                          <Material diffuseColor="0.588000 0.588000 0.588000" />
                          <ImageTexture USE="KoreanCharacter01JinTextureAtlas" />
                        </Appearance>
                        <IndexedFaceSet creaseAngle="3.14159" coordIndex="0, 1, 2, -1, 0, 2, 3, -1, 4, ... "
                                                              texCoordIndex="1, 0, 2, -1, 1, 2, 3, -1, 61, ... " >
                          <Coordinate point="-2.5250 1.2460 -1.6800, -3.6810 1.2360 0.0337, ... " />
                          <TextureCoordinate point="0.2986 0.2114,0.2726 0.2114,0.3201 0.2114, ... " />
                        </IndexedFaceSet>
                      </Shape>
                    </Transform>
                  </HAnimSegment>

                  <HAnimJoint DEF="hanim_r_elbow" center="-8.093000 40.380001 -0.250200" name="r_elbow" >
                    <HAnimSegment DEF="hanim_r_forearm" name="r_forearm" >
                      <Transform translation="-8.093000 40.380001 -0.250200" >
                        <Shape>
                          <Appearance>
                            <Material diffuseColor="0.588000 0.588000 0.588000" />
                            <ImageTexture USE="KoreanCharacter01JinTextureAtlas" />
                          </Appearance>
                          <IndexedFaceSet creaseAngle="3.14159" coordIndex="0, 1, 2, -1, 0, 2, 3, -1, 4, ... "
                                                                texCoordIndex="26, 25, 2, -1, 26, 2, ... " >
                            <Coordinate point="-0.2150 0.3047 -1.1520, -1.1550 0.2966 -0.2588, ... " />
                            <TextureCoordinate point="0.4222 0.6201,0.4327 0.6201,0.3884 0.6201,... " />
                          </IndexedFaceSet>
                        </Shape>
                      </Transform>
                    </HAnimSegment>

                    <HAnimJoint DEF="hanim_r_radiocarpal" center="-7.808000 31.459999 -0.058490" name="r_radiocarpal" >
                      <HAnimSegment DEF="hanim_r_carpal" name="r_carpal" >
                        <Transform translation="-7.808000 31.459999 -0.058490" >
                          <Shape>
                            <Appearance>
                              <Material diffuseColor="0.588000 0.588000 0.588000" />
                              <ImageTexture USE="KoreanCharacter01JinTextureAtlas" />
                            </Appearance>
                            <IndexedFaceSet creaseAngle="3.14159" coordIndex="4, 2, 0, -1, 0, 5, 4, -1, 6, ... "
                                                                  texCoordIndex="4, 7, 5, -1, 5, 6, 4, -1, 2, ... " >
                              <Coordinate point="-1.2470 0.0700 0.7975, -1.2090 0.0872 -1.3490, ... " />
                              <TextureCoordinate point="0.8107 0.9924,0.8122 0.9033,0.7694 0.9912, ... " />
                            </IndexedFaceSet>
                          </Shape>
                        </Transform>
                      </HAnimSegment>
                    </HAnimJoint>
                  </HAnimJoint>
                 </HAnimJoint>

                </HAnimJoint>
              </HAnimJoint>
            </HAnimJoint>
          </HAnimHumanoid>
        </Scene>

# F.3 Skin

In this example, the skin of the character is represented by the geometry of the segments such as mesh or polygon data sets. Properties of the skin are represented with material or texture properties. In Figure F.2, skin is represented by the Shape nodes, which each have child nodes Appearance and IndexedFaceSet.

# F.4 Articulation

When designing an HAnim character, five levels of articulation can be used depending on the complexity of joints. All joints of an HAnim model are represented as a tree with the `humanoid_root` joint at its root. Each joint may or may not have a segment that includes geometry data. Table F.2 shows the composition of joints for sections of the body at each level of articulation.

Table F.2 — Joints composition for each LOA (number of joints)

| LOA‑1 | LOA‑2 | LOA‑3 | LOA‑4
Head | 1 | 1 | 8 | 8
Waist | 2 | 2 | 2 | 2
Backbone | 1 | 8 | 24 | 24
Arm | 6 | 8 | 8 | 8
Leg | 4 | 4 | 4 | 4
Hands | 2 | 40 | 40 | 46
Feet | 2 | 8 | 8 | 52
Total | 18 | 71 | 94 | 144