Humanoid Animation Working Group

Specification for a Standard Humanoid
標準人体の仕様書

Version 1.1 日本語版
Translated into Japanese Dec 15, 2000
by M.Endo, A.Okamoto, A.Soga, N.Kubota, T.Fukumoto, T.Kobayashi
(MDG Humanoid Action Group, Nagoya University, Japan)
Updated Dec 17, 2000 by Mamoru Endo
この仕様書はWeb3Dコンソーシアム内、ヒューマノイドアニメーションワーキンググループの許可を得て翻訳したものです。


目標
外観
ノード
人体のモデリング
階層構造
視点とナビゲーション
暗黙の了解
付録 A: 人体の寸法と表現レベル 
付録 B: Displacerノード 
付録 C: 人体の特徴点 

目標

3D インターネットが成長し続けるに連れ、オンラインの仮想環境で人間を表現する必要性が増加していきます。 これを成し遂げるためには、新しい人型を簡単に生み出したり、それらを様々な方法で動画化できる オーサリングツールと同様に、互換性のある人型のライブラリの生成が要求されます。

この報告文書はVRML97での人体の標準的な表現手法を指定しています。この標準は、 あるベンダからのオーサリング・ツールを使うことから生み出された人体を他のものを使って動画化することを見込んでいます。 H-Animの人体は、キーフレーム、インバース・キネマティクス、パフォーマンス・アニメーション・ システムなどの技術を使って動画化されます。

我々の考案する目標は次のとおりである: これらの3つの目標により、多くの考案が追いやられる。VRML97の詳細が実行するために特定のスクリプト言語は必要としないことから、互換性の要求は我々にスクリプトの使用を避ける。適応性の要求は、スペックを公平に低いレベルに、そこではヒューマノイドの体の関節と個々の体の線分の頂点のランダムアクセスを許可した。単純化により、独断的な関節の形を扱うのではなく、特に人体に焦点を合わせた。

A. 外観

人間の体は関節(肘、手首、足首など)によって互いに結合された多くの区分 (前腕、手、足など)から成る。アプリケーションでヒューマノイドを動画化 するために、関節を呼び出すことを頻繁に行ったり、関節の角度を換えること が必要である。アプリケーションは関節を制限し、区分を集めるための情報を 取り戻すことも必要である。

それぞれの体の区分は典型的に多角形の網により定義され、アプリケーション はその網上の点の位置を変えることが必要である。アプリケーションは点が奇 形の集団として扱われる点についての情報を得ることも必要である。

H-Animのファイルは階層構造を形成するために編成された1組のJointノードを 含む。おのおののJointノードは他のJointノードを含むことができ、関節によ って結合された体の部分を描くセグメント・ノードも含む。お各セグメントは セグメントに関係がある位置を定義する幾つかのSiteノードも持つ。Siteは服 や宝石を取り付けるために使われ、インバース・キネマティクスのアプリケー ションを実行する人に使われる。これらは、視点や見解の場所も定義するのに 使われる。

各セグメント・ノードは幾つかのDisplacerノードを持ち、これは区分内のどの 点と特別な特色や点の配置が一致するかを指定する。

ファイルは著者や著作権の情報のようなヒューマノイドに関して、人間と判断 できるデータを供給する一つのHumanoidノードを含む。このノードは全ての Joint、Segment、Siteノードへの参照を供給し、ヒューマノイドのカバーとし て供給する。加えて、環境内でのヒューマノイドの配置のために最上級の Transformを供給する。

B. ノード

ヒューマノイドの生成を簡単にするため、幾つかの新しい型のノードを紹介する。 各ノードはPROTOにより定義される。 全てのノードの基本的な履行は簡単であるが、 より進んだ使用手法を見込んだ仕様を提供している。

1. Joint ノード

体の各関節はJointノードにより表される。 これは体の各部分と直属の親との関係を定義するのに使われる。
Jointは他のJointノードの子のみに、 humanoidRoot Jointの場合はhumanoidBody フィールド内の子のみになることができる。(つまりJointはSegmentの子にはなれない)

Jointノードは他の関節の特定の情報を格納するためにも使われる。 特に、name はアプリケーションの実行中に各Jointノードを見分けるために提供されている。 JointノードはH-Animのフィギュアを抑制するインバース・キネマティクスも指示している。これらは、上部、または下部の関節の制限、関節回転の制限、そして堅さ及び抵抗の値を含む。これらの制限はヒューマノイドのシーングラフ内の仕様により強要されるのではなく、情報目的のみに提供されていることに注意せよ。

Joint PROTOは以下のようなものである:
PROTO Joint [
    exposedField     SFVec3f      center              0 0 0
    exposedField     MFNode       children            []
    exposedField     MFFloat      llimit              []
    exposedField     SFRotation   limitOrientation    0 0 1 0
    exposedField     SFString     name                ""
    exposedField     SFRotation   rotation            0 0 1 0
    exposedField     SFVec3f      scale               1 1 1
    exposedField     SFRotation   scaleOrientation    0 0 1 0
    exposedField     MFFloat      stiffness           [ 0 0 0 ]
    exposedField     SFVec3f      translation         0 0 0
    exposedField     MFFloat      ulimit              []
]

ほとんどのフィールドはTransformノードのものに対応していることに注意せよ。 これはJoint PROTOの典型的な履行が、以下のように表されるからである:

{
    Transform {
        center           IS center
        children         IS children
        rotation         IS rotation
        scale            IS scale
        scaleOrientation IS scaleOrientation
        translation      IS translation
    }
}
他の履行ももちろん可能である。唯一の必要条件は、Jointが上記に列挙したイベントを受け入れられることである。ヒューマノイドの著者やツールはどのように選択してもJointノードを実行するのは自由である。特に、ヒューマノイドを表現するために、それぞれの体の部分に独立したIndexedFaceSetを使用するより、一つの多角形の網を使用することができる。このような場合、Jointは特定の体の区分に相当する頂点を動かすための要因であり、全ての区分はこれより伝わる。

center フィールドはJointの回転の中心の位置、全てのヒューマノイドの体の記述のルートとの関係を与える。 center フィールドはイベントを受け取る意味ではないことに注意せよ。 関節の中心の位置はJointsのcenter フィールドを読むことにより利用できる。 (詳細はヒューマノイドのモデリングを参照のこと)

関節の中心の位置は全て同じ座標構造であるので、 区分の長さは親のJointの中心と子のJointの中心の間の距離を計算することにより決定できる。 指先及び足先は例外であり、セグメント内で効果が及ぶ端のサイトの位置が使用される。 (以下に示すSiteに関する詳細を参照)

Joint PROTOのulimitllimit フィールドは関節の回転の上限及び下限を指定する。どちらのフィールドもX, Y, Zの独立した回転の限度値を含む3つのMFFloatの要素である。ulimit フィールドはX,Y,Z軸を中心とした回転の上限(つまり最大値)を提供する。llimit は同じく下限(つまり最小値)を提供する。各フィールドのデフォルトの値は[ ]、つまり関節に制限がないと仮定されていることに注意せよ。

limidOrientation フィールドはulimitllimit の値が解釈される座標構造の方向を与える。limitOrientation は、center のexposedフィールドにより示される関節の中心位置と関係がある局部的な座標構造の方向を示す。

stiffness exposedフィールドがあれば、これは0.0〜1.0の値を含む。 この値は特定の自由度で動く関節の"willingness"についてインバース・キネマティクスのヒントを与える。 例えば、Jointノードの堅さは腕の関節群に使用される。左手や左肘の動きのパフォーマンスを左肩の動きから与えるために。(→左肩から左手や左肘などの腕の関節群のパフォーマンスを生成するために1つのJointノードの堅さが使用される。)
または複数の自由度を持つ1つのJointノード内で使用される。おのおのの自由度によるパフォーマンスを与えるために。(→独立した自由度のパフォーマンスを与えるために複数の自由度が1つのJointノード内で使用される。)
stiffness の値が大きくなるほど、 関節は対応する軸(X,Y,またはZ。stiffness MFFloatフィールドでは0,1そして2で入力)に対する動きがより制限される。

各JointはJointのname フィールドの名前の前に区別するための接頭語を付けたDEF名を定義しなければならない。 この接頭語はどんなものでも良いが、そのヒューマノイドの全てのJointについて同じものでなければならない。 区別するための接頭語は同じファイルで複数のヒューマノイドのJointを静的に使用する場合に役に立つ。 もし1つのファイルにヒューマノイドが1つしかない場合、ヒューマノイドアニメーションのための接頭語は"human_"にする。例えば左肩のDEF名は"human_l_shoulder"になる。

これはときおり人体に追加の関節を加えることができるヒューマノイドを生成する人にとって役に立つ。 体は形式上ヒューマノイドのままであるが、それでも一般的にこの文書で後述する基本的な関節を持つと予想される。 しかし、(尻尾のようなものを)追加し拡張した動物を考慮している人もいるだろう。 これについては標準外のJointとSegmentの項を参照せよ。 必要であれば、いくつかの関節(多くの脊柱など)は省略できる。詳細は付録Aを参照。

2. Segment ノード

各身体の部位はSegmentノードに蓄えられる。SengemtノードはGroupノードと して決まって実行される。Groupノードは幾らかのShapesまたは座標系内の身 体の部位に置かれたTransformノードを含む。(詳細はModeling the Humanoidを参照) Segmentの幾何学が複雑な場合、LODノードの使用を推奨する。
PROTO Segment [
    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              0 
    exposedField    MFFloat     momentsOfInertia  [ 0 0 0 0 0 0 0 0 0 ]
    exposedField    SFString    name              ""
    eventIn         MFNode      addChildren
    eventIn         MFNode      removeChildren
]
これは以下のように決まって実行される。
{
    Group {
        addChildren    IS addChildren
        bboxCenter     IS bboxCenter
        bboxSize       IS bboxSize
        children       IS children
        removeChildren IS removeChildren
    }
}
nameフィールドはSegmentが作動時間に見分けるために表示しなければならない。 他のフィールドは全てオプションである。

massフィールドはセグメントの全体の集合であり、centerOfMassはセグメント 内のmassの中心位置である。値0はどんなmassの値も利用できないことを明確に 指示するために指定されていることに注意せよ。 MomentsOfInertiaフィールドは慣性モーメントの行列を含む。始めの3つの要素 は3×3の行列の第1列であり、次の3つの要素は第2列、最後の3つの要素は第3列である。

続いたメッシュで形成されるHumanoidsは各部位の情報を格納するためにSegment ノードを持つ。このような場合、SegmentはJointノードの子であるが、幾何学図 形を含むとは限らない。

変形できるメッシュを持つSegmentの場合、coordフィールドはSengmentのために IndexedFaceSetがUSEされるCoordinateノードを含む。CoordinateノードはSegment のDEFと同じ名称に"_coord"を付けた名称でなければならない。(例 skull_coordsなど)

3. Siteノード

Siteノードは3つの目的がある。第一に、"効果の限界"、つまりインバース キネマティクス・システムが適応される場所を定義する。第二に、宝石や服などの アクセサリを取り付ける位置を定義する。3つ目は、セグメントの参照フレームに 仮想カメラを設置するためである。(マルチユーザ環境で特定のあ人体の目からの 視点など) SiteはSegmentノードのexposedFieldであるchildrenフィールド内に格納される。 SiteノードのrotationとtranslationフィールドはSegmentの座標構造内における 効果限界の位置と方向を定義する。childrenフィールドは身体の部位に取り付ける アクセサリを格納するために使用される。

SiteノードのPROTOは以下のようである:

PROTO Site [
    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
    eventIn         MFNode      addChildren 
    eventIn         MFNode      removeChildren
]
Siteの典型的な実装手法は次の通りである:
{
    Transform {
        addChildren      IS addChildren
        center           IS center 
        children         IS children
        removeChildren   IS removeChildren
        rotation         IS rotation
        scale            IS scale
        scaleOrientation IS scaleOrientation
        translation      IS translation
    }
}
nameフィールドは実行中にSiteを判別するために、定義しなければならない。他のフィールドは自由に選択可能である。

Siteノードを効果限界として使用する場合、それを取り付けたSegmentの名前に"_tip"という接尾語を付けた名前にする。例えば、right index finger(右人差指)の効果限界であるSiteは"r_index_distal_tip"という名前のであり、このSiteノードは"r_index_distal" Segmentの子である。 カメラの位置を定義するために使用されるSiteは、"_view"という接尾語を追加する。効果限界でもなく、カメラの位置でもないSiteは、"_pt"という接尾語を追加する。 アプリケーションより要求されるがこの詳説では定義されていないSiteは"x_"を前に置くこととする。

(左右の目のような)Verpointノードの付着点として使用されるSiteはカメラが向くべき方向に直面するために修正しなければならない。 言い替えると、次に述べるSiteのVewpointを左目に取り付けることは結果として人体の左目から外を見ることである。

Viewpoint {
    position 0 0 0
}
Viewpointノードのデフォルトの位置は0 0 10であり、方向は 0 0 1 0であることに注意せよ。これはSiteに取り付けるViewpointはデフォルト でない値を指定しなければならないからである。 推奨するSiteの一覧は、身体の寸法と階層レベルと一緒に付録Aに記述してある。

4. The Displacer Node

アプリケーションは個々のセグメントの形状を変形させる必要可能性がある。 最も基本的なレベルでは、Segmentノードのcoordフィールド内にある Coordinateノードのpointフィールドに記述することにより実現される。

いくつかのケースにおいて、アプリケーションはセグメント内の点の明確な 集合を区別することができる必要がある。例えば、アプリケーションはskull セグメント内のどの点が左目を構成しているのかを知る必要があるかも知れない。 これは各点が動く方向としての"ヒント"も必要とする可能性もある。 この情報はDisplacerと呼ばれるノードに格納される。特別のセグメントのための Displacerはそのセグメントのdisplacersフィールドに格納される。

DisplacersのPROTOは以下のように定義される:

PROTO Displacer [
    exposedField MFInt32  coordIndex     [ ]
    exposedField MFVec3f  displacements  [ ]
    exposedField SFString name           ""
]

nameフィールドはDisplacerのための名称を供給する。これにより、 アプリケーションが実行中に区別することができる。この名前はDisplacerノード そのもののDEFの名前としても利用される。name フィールドは必ず存在 しなければならない。他の全てのフィールドはオプションである。

coordIndex フィールドはdisplacerに影響されるセグメントの点と 同等の配列にindex群を含む。例えば、

Displacer {
    coordIndex [ 7, 12, 21, 18 ]
    name "l_eyebrow_feature"
}
は、セグメントの点7,12,21,18が、左眉毛を形成することを意味する。

The displacementsフィールドは、存在するならば、セグメントの coordIndexフィールド内に言及された各点の中立または停止位置として 加えられる3D値のセットを供給する。これらの値はcoordIndex配列の 値と1対1に相当する。値は最大のdisplacementであるべきであり、 アプリケーションは中立点の位置にそれらを加える前に必要に応じて大きさを 自由に変更できる。例えば、

Displacer {
    coordIndex [ 7, 12, 21, 18 ]
    displacements [ 0 0.0025 0, 0 0.005 0, 0 0.0025 0, 0 0.001 0 ]
    name "l_eyebrow_raiser_action"
}
は垂直方向に左眉毛の4つの点を持ち上げる。点番号7はY方向に垂直に2.5mm移動し、 点番号12は5mm、点番号21は2.5mm、点番号18は1mm移動する。アプリケーションは これらの移動を一様なスケールで選択できる。

Displacerは3つの異なる方法により利用できる。最も基本的な段階においては、 それはセグメントにおいて特別な特徴に相当する点を区別するのに利用され、 アプリケーションはその時、ふさわしいように移動させることができる。 次の段階では、様々な方向(線形または放射線形)における点の移動による特別な 筋肉の動作を表現するのに利用される。

3つ目の方法において、Displacerはセグメント内の点の完全な形状を表現する のに利用される。例えば、顔の場合、これらは各顔の表情のDisplacerとなる。

D特徴を区別するのに利用されるDisplacerは "_feature" という接尾語を つけなければならない。動作の特徴に利用されるDisplacerは "_action" という 接尾語を与え、通常は動作の種類を指し示す接尾語の前の追加語と共に与える。 ( "l_eyebrow_raiser_action" のように ). 点の特別な形状に相当するDisplacersは "_config" の接尾語を加える。

Displacerは顔の形状を制御するのによく利用されるが、これらは身体の他の 部位にも同じように利用されることに注意せよ。例えば、それらは筋肉の膨張を シミュレーションする腕の伸縮として、腕のセグメントの形状変化を制御するのに 利用される場合もある。

提案するDisplacerの基本的なリストを 付録Bに与える。

5. ヒューマノイドノード

HumanoidノードはJoint、Segment、視点などや、人体全体の入れ物の役割に 加え、作者や著作権情報など、人体を判別する為のデータの格納にも 使用される。加えて、環境に対し利便性のある人体の動きを供給する。
PROTO Humanoid [
    field           SFVec3f    bboxCenter            0 0 0
    field           SFVec3f    bboxSize              -1 -1 -1
    exposedField    SFVec3f    center                0 0 0
    exposedField    MFNode     humanoidBody          [ ]
    exposedField    MFString   info                  [ ]
    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                 [ ]
    exposedField    SFVec3f    translation           0 0 0
    exposedField    SFString   version               "1.1"
    exposedField    MFNode     viewpoints            [ ]
]
Humanoidノードは以下のようにきまって実行される:
{
  Transform {
    bboxCenter       IS bboxCenter
    bboxSize         IS bboxSize
    center           IS center
    rotation         IS rotation
    scale            IS scale
    scaleOrientation IS scaleOrientation
    translation      IS translation
    children [
      Group {
        children IS viewpoints
      }
      Group {
        children IS humanoidBody 
      }
    ]
  }
}

nameフィールドは実行中に人体を区別するために定義しなければ ならない。他のフィールドはオプションである。

Humanoidノードは空間内で人体の位置を定義するのに利用される。 HumanoidRootジョイントは人体のローカルな座標系内でジャンプや歩く などのアニメーションを操作するのに利用される。例えば、歩いている間、 人体全体の動作(ふんぞり返って歩くなど)はHumanoidRootジョイントに 影響する。一方、シーン内で平均して直線的な速度はHumanoidノードに 影響する。

humanoidBody フィールドはHumanoidRootノードを含む。

version フィールドは人体のファイルが従う仕様のバージョンを 格納する。今読んでいるこの文章は仕様のバージョン1.1で記述している。

info フィールドは1つの文字配列からなり、 各文字は"タグ(tag)=値(value)"という型で記述される。 現在では、以下のタグが定義されている:

追加の tag=value の組は必要に応じて含むことができる。

HumanoidVersionタグはデータの改訂の後をたどることができるように、 利用されている人体のバージョンを言及する。これはHumanoidノードの versionフィールドとは異なる。あれはH-animの仕様のバージョンを 言及するものであり、人体を作るときに利用されるものである。

joints フィールドは人体の各Jointノードの言及 (つまりUSE群)を含む。言及される各ジョイントはJointノードで なければならない。記述する順番は無関係であり、ジョイント名が そのジョイントに格納される。同じように、segments フィールドは 人体の各Segmentノードの言及を含み、viewpointsフィールドは ファイル内のViewpointノードの言及を含む。そして、sites フィールドはファイル内のSiteノードの言及を含む。

HumanoidノードはExternal Authoring Interfaceによるアクセスを簡単にするため、"Humanoid"というDEF名で与える。

C: 人体のモデリング

人体は標準の位置、+Z方向に直面し、+Yが上で、+Xが人体の左でモデリング されるべきである。原点(0,0,0)は地面の高さで、人体の足の間に位置する。

足は地上で平面であり、腰幅とほぼ同じ距離の間隔を開ける。足の底はY=0の 位置である。腕は体の側面に真っ直ぐ平行で、手のひらはももに向かって 内側に直面する。手は平面で、指の第1〜第3関節はY軸に平行で、親指は +Z軸方向に45度の角をなす。親指の各関節の座標系は全ての人体で整列する ために修正されていることに注意せよ。

指の"0"関節の動作は典型的にかなり制限されていて、これらの明確な表現の 堅さは指から指へ変化する。配置、方向、"0"関節の動きなどの詳細は 解剖学の参考文献の教科書から得られる。

顔は静止した眉毛、閉じた口、広く開いた目で形成される。

人体は実際の人間の大きさで、全ての寸法はメーター法で形成される。 典型的な人間はおよそ1.75mである。

これはデフォルトの位置のヒューマノイドである:


(illustration courtesy of the SNHC group)
(note that in the diagram above, the thumb is shown in a slightly different position than required by this specification)

この位置において、全ての関節の角度は0である。言い換えると、全ての関節のノードのrotationフィールドはデフォルトの値(0 0 1 0)のままであるべきである。加えて、translation フィールドはデフォルトの値(0 0 0)であり、scale は(1 1 1)である。デフォルトではない値をとるのはcenterフィールドのみであり、これは、関節(及び存在すればそれに所属する子ノードと体の線分)が回転する周辺の点を指定するのに使われる。 人体の全ての関節の平行移動、回転移動、スケーリングのデフォルトの値を送信することにより上記の中立の位置を返さなければならない。

各関節のcenter フィールドは、関節が実在の人間の体と同じように回転するように位置付けられる。

次に示す図形は手の方向を示している。交差している線は単に関節の中心と指先の位置を示している。

これは提案であって、必ず必要ではない、つまり、全ての体の線分は適所に組み立てられる。これは、それらは近辺を接続するのに平行移動、回転移動、スケーリングを必要としない。例えば、手は前腕から正しい位置関係にあるように成されるべきである。前腕は上腕と正しい位置関係にあるように形成される、など。全ての体の座標は共通の原点を共有する。それは人体自身である。もし、これが他のオーサリング・ツールで実行するのが難しいと分かれば、セグメント正しく幾何学的な位置にするために各線分の内側のTransformノード、またはいくつかのTransformへの使用が受け入れられる。

各Jointの座標系は全ての人体を整列させるために修正されていることに注意せよ。

D. 階層構造

人体は一般的に入れ子式のJointのつながりとして構築されており、一つ一つの ジョイントはそれぞれセグメントと連携している。例えば:
...
DEF hanim_l_shoulder Joint {  name "l_shoulder"
  center 0.167 1.36 -0.0518
  children    [
    DEF hanim_l_elbow Joint {  name "l_elbow"
      center 0.196 1.07 -0.0518
      children        [
        DEF hanim_l_wrist Joint {  name "l_wrist"
          center 0.213 0.811 -0.0338
          children    [
            DEF hanim_l_hand Segment {  name "l_hand"
              ...
            }
          ]
        }
        DEF hanim_l_forearm Segment {  name "l_forearm"
          ...
        }
      ]
    }
    DEF hanim_l_upperarm Segment {  name "l_upperarm"
      ...
    }
  ]
}
...
正しい形式のサンプルの人体は H-AnimのWebサイトで利用可能である (http://h-anim.org).

1. 胴体

胴体のためのJointノードの名前は以下の表で列挙される:
 
l_hip l_knee l_ankle l_subtalar l_midtarsal l_metatarsal
r_hip r_knee r_ankle r_subtalar r_midtarsal r_metatarsal
vl5 vl4 vl3 vl2 vl1
vt12 vt11 vt10 vt9 vt8 vt7
vt6 vt5 vt4 vt3 vt2 vt1
vc7 vc6 vc5 vc4 vc3 vc2 vc1
l_sternoclavicular l_acromioclavicular l_shoulder l_elbow l_wrist
r_sternoclavicular r_acromioclavicular r_shoulder r_elbow r_wrist
HumanoidRoot sacroiliac (pelvis) skullbase
vl5 sacroiliac ジョイントは HumanoidRootの子ノードである。 HumanoidRootはHumanoidノードのhumanoidBodyフィールドの内部に記述されている、 しかし、他のジョイントは何れもvl5 もしくは sacroiliacから成っている。 もしこれらのジョイントが無ければ、下位レベルのジョイントはHumanoidRootの子ノードに なることができる。

2. 手

手(もし表現するのであれば)は、以下の名前を使うべきである:
 
l_pinky0 l_pinky1 l_pinky2 l_pinky3 l_ring0 l_ring1 l_ring2 l_ring3
l_middle0 l_middle1 l_middle2 l_middle3 l_index0 l_index1 l_index2 l_index3
l_thumb1 l_thumb2 l_thumb3
r_pinky0 r_pinky1 r_pinky2 r_pinky3 r_ring0 r_ring1 r_ring2 r_ring3
r_middle0 r_middle1 r_middle2 r_middle3 r_index0 r_index1 r_index2 r_index3
r_thumb1 r_thumb2 r_thumb3

3. 顔

多くのヒューマノイドを実装した例では、表情を表現するためにつなぎ合わせた 顔の構造を利用してきた。 流行しているこれらの作業は、腹話術師が用いる人形の顔の部位に類似している。 以下は顔のアニメーションを支援する顔のジョイントとセグメントの基本的なセットである。

接尾辞 "_joint" がここで用いられる。なぜなら、これらの顔の部位の殆どは現実には temporomandibularジョイントを除いて実際のジョイントの代わりに筋肉によって制御される からである。接尾辞 "_joint"の付いたジョイントはジョイント名と相当するセグメント名 との間の区別を提供する。

全ての顔ジョイントはskullbaseジョイントの子である。目およびまぶたの回転中心は 眼球の幾何学的な中心である。まぶたの回転は初期状態でゼロであり、正方向へのπラジアン 分の回転でまぶたは完全に閉じる。まゆも初期値においてゼロ度であり、まゆの真中付近 で回転することができる。 口はtemporomandibularジョイントが0度の時に閉じられる。
 

l_eyeball_joint r_eyeball_joint
l_eyebrow_joint r_eyebrow_joint
l_eyelid_joint r_eyelid_joint
temporomandibular
付加的な顔ジョイントが必要になるかもしれない。非標準 のジョイントとセグメントの項を見ていただきたい。これらのジョイントは そのプロジェクトの中でできる限り早くから識別し、全ての人体の構造において使われる ことを強く勧める。

4. Hierarchy

完全な階層構造は以下の通りである。それらはジョイントにそれぞれ付けられた セグメント名を伴っている:
HumanoidRoot : sacrum
  sacroiliac : pelvis
  |   l_hip : l_thigh
  |     l_knee : l_calf
  |       l_ankle : l_hindfoot
  |         l_subtalar : l_midproximal
  |           l_midtarsal : l_middistal
  |             l_metatarsal : l_forefoot
  |   r_hip : r_thigh
  |     r_knee : r_calf
  |       r_ankle : r_hindfoot
  |         r_subtalar :  r_midproximal
  |           r_midtarsal : r_middistal
  |             r_metatarsal : r_forefoot
  vl5  : l5
    vl4 : l4
      vl3  : l3
        vl2 : l2
          vl1  : l1
            vt12 : t12
              vt11 : t11
                vt10  : t10
                  vt9 : t9
                    vt8 : t8
                      vt7 : t7
                        vt6  : t6
                          vt5 : t5
                            vt4 : t4
                              vt3 : t3
                                vt2 : t2
                                  vt1  : t1
                                    vc7 : c7
                                    | vc6 : c6
                                    |   vc5 : c5
                                    |     vc4  : c4
                                    |       vc3 : c3
                                    |         vc2  : c2
                                    |           vc1 : c1
                                    |             skullbase : skull
                                    |               l_eyelid_joint : l_eyelid
                                    |               r_eyelid_joint : r_eyelid
                                    |               l_eyeball_joint : l_eyeball
                                    |               r_eyeball_joint : r_eyeball
                                    |               l_eyebrow_joint : l_eyebrow
                                    |               r_eyebrow_joint : r_eyebrow
                                    |               temporomandibular : jaw 
                                    l_sternoclavicular : l_clavicle
                                    | l_acromioclavicular : l_scapula
                                    |   l_shoulder : l_upperarm
                                    |     l_elbow : l_forearm
                                    |       l_wrist : l_hand
                                    |         l_thumb1 : l_thumb_metacarpal
                                    |           l_thumb2 : l_thumb_proximal
                                    |               l_thumb3 : l_thumb_distal
                                    |         l_index0 : l_index_metacarpal
                                    |           l_index1 : l_index_proximal
                                    |             l_index2 : l_index_middle
                                    |                 l_index3 : l_index_distal
                                    |         l_middle0 : l_middle_metacarpal
                                    |           l_middle1 : l_middle_proximal
                                    |             l_middle2 : l_middle_middle
                                    |               l_middle3 : l_middle_distal
                                    |         l_ring0 : l_ring_metacarpal
                                    |           l_ring1 : l_ring_proximal
                                    |             l_ring2 l_ring_middle
                                    |               l_ring3 : l_ring_distal
                                    |         l_pinky0 : l_pinky_metacarpal
                                    |           l_pinky1 : l_pinky_proximal
                                    |             l_pinky2 : l_pinky_middle
                                    |               l_pinky3 : l_pinky_distal
                                    r_sternoclavicular : r_clavicle
                                      r_acromioclavicular : r_scapula
                                        r_shoulder : r_upperarm
                                          r_elbow : r_forearm
                                            r_wrist : r_hand
                                              r_thumb1 : r_thumb_metacarpal
                                                r_thumb2 : r_thumb_proximal
                                                  r_thumb3 : r_thumb_distal
                                              r_index0 : r_index_metacarpal
                                                r_index1 : r_index_proximal
                                                  r_index2 : r_index_middle
                                                    r_index3 : r_index_distal
                                              r_middle0 : r_middle_metacarpal
                                                r_middle1 : r_middle_proximal
                                                  r_middle2 : r_middle_middle
                                                    r_middle3 : r_middle_distal
                                              r_ring0 : r_ring_metacarpal
                                                r_ring1 : r_ring_proximal
                                                  r_ring2 : r_ring_middle
                                                    r_ring3 : r_ring_distal
                                              r_pinky0 : r_pinky_metacarpal
                                                r_pinky1 : r_pinky_proximal
                                                  r_pinky2 : r_pinky_middle
                                                    r_pinky3 : r_pinky_distal
ダイアグラム が階層構造を図解するために用意されています。

5. 非標準のジョイントとセグメント

付加的な非標準のジョイントや人体のセグメントが定義されるかもしれない。 これらはたった三つの要求から成る。一つ目は、先の表の中で示されたジョイントを 特定の名前で利用しなければならない時である。二つ目は"鎖状"の標準のジョイント 階層構造内に許されている新たなジョイントがないとき。例えば、付加的な肘は腕に 付加することができない。しかし新たな付属器官(髪の毛、尻尾など)が既に存在する 他のジョイントの子として作られ、人体に付加できる場合である。 これらの非標準のジョイントは何れの標準のジョイントや他の非標準のジョイントの 子にもなることができるであろう。三つめの要求は非標準のジョイントが 例えそれらをアニメーションに利用できたとしても、 標準のジョイントの干渉をしない場合である。

標準のジョイントを用いたアニメーションは何れの非標準のジョイント (もしくはそれらの子)のアニメーションに独立であるべきではない。 逆運動学を用いたシステムでは、計算を行う時に非標準のジョイントを 考慮に入れるかもしれないが、必要不可欠であってはならない。

非標準のジョイントは、標準のジョイントと類似した名前を付けることができ、 またそれらと区別するために接頭辞"x_"を用いて表記される (e.g.hanim_x_pigtails)。

E. 視点とナビゲーション

ヒューマノイドをVRML97ブラウザでで調べやすくするために、 いくつかの視点と NavigationInfo ノードがそのファイルに含まれているであろう。

1. 視点

ある特定のタイプのアプリケーションはヒューマノイドに特定の視野を必要とする かもしれません。 このためには2つの方法があります。 最初はヒューマノイドの作 者のためのもので、適切な場所の中に位置を作るためのものです。その時アプリケー ションはViewpointノードを作ることができ、そしてそれをいずれの場所にでも付けれ ことができます。 これはヒューマノイドの身体の動きを追跡するための視点与えま す 。

他の方法は実際の Viewpoint nodeをHumanoid nodeのviewpoints フィールド に置くこと です。それによって、どの身体セグメントの動きにも影響を受けないで空間の中を追 跡するヒューマノイドの視野を作ることができるであろう。 そのフィールドに置かれる視 点はまた、 ヒューマノイドがブラウザにロードされるときはいつでも、 有効であり、それゆえ、キャラクターをプレビューするのに役に立 ちます。

ファイルに含まれるかもしれないいくつかの特定の視点があります。 Front_view は -Zの方向を向いているべきです、 Side_view は-Xの方向を向いているべきで 、 Top_view は、 − Yの方向を向いているべきです、 Inclined_view は( -1 0  -1)の方向を向くべきです、そして Best_view は個々のヒューマノイドのユニー クな特徴を最も強調する方向を供給することができます 。 これらすべての場所は、 その視野からヒューマノイド全体を見るために、ヒューマノイドの中心から十分な距 離を置いているであろう。

ビューを追加することも可能である。 ヒューマノイドのためのすべての視点は Humanoidのviewpoints fieldに記入される。この慣習を使って、 同じシーンでいくつかのモデルを使うシステムは、ヒューマノイドのviewpoints fieldへ空のMFnode eventを送ることによって、全ての余分なviewpointsを無効にす ることを選ぶことが可能かもしれない。

2. ナビゲーション

 Examine modeをVRML97ブラウザのファイルの先頭に置くことによって、 NavigationInfo nodeを含むことができる。type fieldは常に最初に「EXAMINE」を、 二番目に「ANY」を含むべきである。
NavigationInfo { type ["EXAMINE", "ANY"] }
これはすべての角度からヒューマノイドを調べることを易しくします。

F. 暗黙の了解

この提案の範囲を越えるH-Anim Humanoidの使用を取り巻くいくつかの問題がある。  しかしながら、それらの問題のいくつかはここで演説するだけの価値がある。 それらはこの仕様の必要条件ではなく、単に暗黙の了解であることに注意を払いなさい。

1. ファイルごとの複数の人体

ひとつの3Dワールドに別のエレメント(要素)がいっしょに存在するといったように、 同じファイルに複数の人体を持つことが役立つケースがある。そのような場合, ("DEF Humanoid"とするよりも)人体に特有のDEF名を割り当て、それらの名前が "HumanoidGroup"と名付けられたGroupノードの子として参照されることを勧める。

言いかえると、

DEF Fred Humanoid { ... }
DEF Jane Humanoid { ... }
DEF Sally Humanoid { ... }
DEF HumanoidGroup Group { children [ USE Fred, USE Jane, Use Sally ] }
EAIベースのアプリケーションは、シーンのHumanoidGroupに対して参照を得ることができ, そのグループの子を繰り返すことによって個々の人体に対して参照を得ることができる。 

2. 必要最小サポート

仮想人体をインポートする全てのアプリケーションが、必ずVRML97ブラウザで あるわけではないだろう。しかしながら、H-Anim 仕様をサポートすることを 望むどんなアプリケーションでも,少なくとも次のノードをサポートするように 要求される:

Transform Group Viewpoint
Shape Appearance Material
ImageTexture TextureTransform TextureCoordinate
Coordinate Color Normal
IndexedFaceSet IndexedLineSet Box
Cone Cylinder Sphere
NavigationInfo WorldInfo

たとえ全ての機能性が実装できるわけではないとしても、全てのH-Anim アプリケーションは これらのノードのために完全なVRML97 utf8でコード化された文法を正確に解析しなくては ならない。PROTOを実装することが不可能なアプリケーションは、あたかも組み込まれて いるかのようにH-Anim ノード(Joint, Segment, Site, Displacer や Humanoid)を サポートしなくてはならない。


このドキュメントはhttp://h-anim.org/Specifications/H-Anim1.1/にあります。
付録はhttp://h-anim.org/Specifications/H-Anim1.1/appendices.htmlにあります。
VRML Humanoid Animation Working Group のホームページはhttp://h-anim.org/Specifications/H-Anim1.1/ です。
日本語訳を行った Humanoid Action Group のホームページはhttp://kuro.mdg.human.nagoya-u.ac.jp/~action/です。