Skip to content

Latest commit

 

History

History
478 lines (319 loc) · 18.4 KB

File metadata and controls

478 lines (319 loc) · 18.4 KB

VRMC_vrm_animation

Version 1.0

Contents

Contributors

  • 進藤 哲郎
  • 0b5vr

Status

Complete

Dependencies

glTF 2.0仕様に向けて策定されています。

また、仕様内の一部定義が VRMC_vrm に依存します。

Overview

VRMC_vrm_animation 仕様は、人間型モデルに対するアニメーションを記述するためのglTF拡張です。 人間型モデルを記述するglTF拡張である VRMC_vrm で表現されたモデルに対して適用することを想定しています。

glTFで定義されたノードのヒエラルキーに対して、各ノードと人間のボーン・表情・視線方向を関連付けて、任意の人間型モデルに適用できるアニメーションを表現します。 アニメーションの実データは、glTFのコア定義のアニメーション部分を利用します。

アニメーションのみを記述する独立したglTFファイルに使用されることを想定しています。 VRMC_vrm を用いて記述されたVRMモデルに対して本拡張が含まれることは想定していません。

Concepts

Animations

glTFのコア定義のアニメーションを利用します。

原則、アニメーションを用いる際は、 animations に定義された最初のアニメーションを読み込むものとします。 1つのファイルに複数のアニメーションが含まれている場合があります。 実装は、1つのファイル内に含まれた複数のアニメーションに対応することができますが、必須ではありません。

glTF アニメーションは、任意時間にキーフレームを挿入できるのでフレームレートの概念がありません。 以下の点を考慮し、高すぎず低すぎないフレームレートの目安として秒間 30 フレームを提案します。

  • ゲームでは 60 FPS や 30 FPS が一般的です
  • モーションキャプチャーの生データ(加工前)は高フレームレートの場合があります
  • 映像では 24FPS などがあります

アニメーションを Linear で Interpolation することを想定して、 30 FPS で十分な滑らかさを確保できると思われます。

Humanoid

Humanoidは、本拡張内で定義する人間のボーンの定義です。 各Humanoidボーンは、glTFのノードとして表現されます。

VRMC_vrm_animation/humanoid 内で、glTFのノードと人間のボーンの対応関係を示します。 Humanoidで利用するボーンおよびその構造について、 VRMC_vrm 拡張のHumanoidに準拠します。

https://github.com/vrm-c/vrm-specification/blob/master/specification/VRMC_vrm-1.0/humanoid.ja.md

ただし、Humanoidボーンのうち leftEyerightEye は、これらに対してアニメーションデータを持つことはできません。 これらは、後述するLookAtで扱われます。

将来的な拡張性を見越して、Humanoidボーンのヒエラルキー全体をアニメーションデータ内に収録しています。

Humanoidボーンとして指定されたノードは、アニメーションが適用されていないレストポーズにおいて、「VRM T-pose」と呼ばれるポーズに従っている必要があります。

https://github.com/vrm-c/vrm-specification/blob/master/specification/VRMC_vrm-1.0/tpose.ja.md

Humanoidボーンとして指定されたノードに対するアニメーションを、アニメーションデータとして扱います。 Humanoidボーンに対するアニメーションにスケールを含めてはいけません。 また、Hipsボーン以外に対するアニメーションに平行移動を含めてはいけません。

実装内では、例えばUnityのHumanoidシステムを用いて高度なアニメーション転送がされることが望ましいですが、これが難しい場合は、単純にFKアニメーションとして転送することもできます。

また、 アニメーションデータとは別に T-Pose を表現する node のヒエラルキーに scale を含めないことを強く推奨します。

データを生成するアプリケーションで、ヒエラルキーとアニメーションにスケール値を事前に乗算することで解決できます。 ランタイムロードするプログラムの側の負担を軽減することを意図しています。

一方で、回転は任意で問題ありません。ポーズデータの互換性についてを参照してください。

Expressions

Expressionsは、本拡張内で定義する人間の表情の定義です。 各Expressionsは、 [0, 1] の範囲のスカラをウェイトとして持ち、この数値がどの程度その表情が発現しているかを表します。

VRMC_vrm 拡張では、Expressionsのウェイトがメッシュのモーフ・マテリアルの色・テクスチャのUVに対して適用されます。

VRMC_vrm_animation/expressions 内で、glTFのノードと表情との対応関係を示します。 Expressionsの定義について、 VRMC_vrm 拡張のExpressionsに準拠します。

https://github.com/vrm-c/vrm-specification/blob/master/specification/VRMC_vrm-1.0/expressions.ja.md

ただし、プリセット表情のうち lookUplookDownlookLeftlookRight は、これらに対してアニメーションデータを持つことはできません。 これらは、後述するLookAtで扱われます。

Expressionsのうち、 VRMC_vrm 拡張でプリセット表情として定義されているものをプリセット表情、それ以外をカスタム表情と定義します。 カスタム表情に、プリセットと同じ名前の表情を含めることはできません。

Expressionsとして指定されたノードに対するアニメーションのうち、平行移動のX成分を、その表情のウェイトに対するアニメーションデータとして扱います。 ウェイト値は [0, 1] の範囲内に収まっていることが望ましいです。 実装は、 [0, 1] の範囲から外れたウェイト値を扱う場合、その値を [0, 1] の範囲内に収めて扱わなければいけません。

LookAt

LookAtは、本拡張内で定義する人間の視線についての定義です。

VRMC_vrm 拡張において、LookAtによる視線制御は、Humanoidのボーン回転によるアニメーションと、Expressionsによるアニメーションの2通りの動かし方がサポートされています。

視線方向

LookAtは、一つの視線方向を持ち、モデルがその方向に視線を動かすことを示します。

VRMC_vrm_animation/lookAt/node で、視線方向を回転として持つglTFのノードを指定します。 指定したノードのローカル空間における回転を、視線方向のアニメーションデータとして扱います。

glTFでは回転はクォータニオンとして定義されますが、 VRMC_vrm のLookAtコンポーネントに適用する際はyaw-pitchのオイラー角に変換して扱います。 このとき、オイラー角の回転順序は、Extrinsic ZXYで解釈し、Y軸周りの回転をyaw・X軸周りの回転をpitchとします。

視点位置

本拡張内で定義されるLookAtにおいて、視点の位置は、VRMC_vrm 仕様内で定義されたLookAt空間に従い、Humanoidで定義されたheadボーンのトランスフォームからの相対的な空間において、 VRMC_vrm_animation/offsetFromHeadBone だけ平行移動した位置とします。 また、その視線は初期状態において、モデル座標系における+Z方向を向いているものと定義します。

Implementation Note: 視線方向を加工せずにそのまま利用する場合、 offsetFromHeadBone の値を解釈する必要はありません。転送先のモデルの体格に合わせて、視点情報に何らかのリターゲティングを適用したい場合、 offsetFromHeadBone の値を加味したアニメーション側のモデルの視点位置を活用するのが有効な場合があります。

Humanoidが定義されていない場合、 offsetFromHeadBone の値をそのまま視点位置として解釈します。

glTF Schema Updates

VRMC_vrm_animation 拡張はglTFのルートレベルに定義されます。

{
  "nodes": [
    // ...
  ],
  "animations": [
    // ...
  ],
  "extensions": {
    "VRMC_vrm_animation": {
      "specVersion": "1.0",
      "humanoid": {
        "humanBones": {
          "hips": { "node": 0 },
          "spine": { "node": 1 },
          "chest": { "node": 2 },
          // ...
        }
      },
      "expressions": {
        "preset": {
          "aa": { "node": 59 },
          "blinkLeft": { "node": 60 },
          "blink": { "node": 61 },
          "happy": { "node": 62 },
          "relaxed": { "node": 63 }
        }
      },
      "lookAt": {
        "node": 64,
        "offsetFromHeadBone": [
          0.0,
          0.06,
          0.0
        ]
      }
    }
  },
  // ...
}

VRMC_vrm_animation

本拡張のルートオブジェクトです。

Properties

説明 必須
specVersion string 本拡張の仕様バージョン ✅ Yes
humanoid humanoid Humanoidボーンに関する定義 No
expressions expressions Expressionsの表情とノードの対応関係 No
lookAt lookAt 視点・視線に関する定義 No

JSON Schema

VRMC_vrm_animation.schema.json

VRMC_vrm_animation.specVersion ✅

VRMC_vrm_animation 拡張の仕様バージョンを表します。値は "1.0" です。

  • 型: string
  • 必須: Yes

VRMC_vrm_animation.humanoid

Humanoidボーンとノードの対応関係を表すオブジェクトです。

  • 型: humanoid
  • 必須: No

VRMC_vrm_animation.expressions

Expressionsの表情とノードの対応関係を表すオブジェクトです。

  • 型: expressions
  • 必須: No

VRMC_vrm_animation.lookAt

視点・視線に関する定義を行うオブジェクトです。

  • 型: lookAt
  • 必須: No

humanoid

Humanoidボーンに関する定義を行うオブジェクトです。

Properties

説明 必須
humanBones humanoid.humanBones Humanoidボーンとノードの対応関係を表す Yes ✅

JSON Schema

VRMC_vrm_animation.humanoid.schema.json

humanoid.humanBones ✅

Humanoidボーンとノードの対応関係を表すオブジェクトです。

  • 型: humanoid.humanBones
  • 必須: Yes

humanoid.humanBones

Humanoidボーンとノードの対応関係を表すオブジェクトです。

Properties

説明 必須
(Humanoidボーン名) humanoid.humanBones.humanBone ひとつのHumanoidボーン Mixed

JSON Schema

VRMC_vrm_animation.humanoid.humanBones.schema.json

humanoid.humanBones.(Humanoidボーン名)

ひとつのHumanoidボーンを表すオブジェクトです。 VRMC_vrm 拡張で定義されているHumanoidボーンの名前をキー名として持ちます(hipsleftUpperArm など)。 ただし、Humanoidボーンのうち leftEyerightEye は定義できません。

  • 型: humanoid.humanBones.humanBone
  • 必須: VRM仕様で必須ボーンと定義されている場合、この値は必須です。

humanoid.humanBones.humanBone

ひとつのHumanoidボーンを表すオブジェクトです。

Properties

説明 必須
node integer Humanoidボーンに対応するノードのインデックス ✅ Yes

JSON Schema

VRMC_vrm_animation.humanoid.humanBones.humanBone.schema.json

humanoid.humanBones.humanBone.node ✅

Humanoidボーンに対応するノードのインデックスです。

  • 型: integer
  • 必須: Yes

expressions

Expressionsの表情とノードの対応関係を表すオブジェクトです。

Properties

説明 必須
preset expressions.preset プリセット表情に対する定義 No
custom expressions.custom カスタム表情に対する定義 No

JSON Schema

VRMC_vrm_animation.expressions.schema.json

expressions.preset

プリセット表情に対する定義を含むオブジェクトです。

  • 型: expressions.preset
  • 必須: No

expressions.custom

カスタム表情に対する定義を含むオブジェクトです。

  • 型: expressions.custom
  • 必須: No

expressions.preset

プリセット表情に対する定義を含むオブジェクトです。

Properties

説明 必須
(プリセット表情名) expressions.expression ひとつのプリセット表情 No

JSON Schema

VRMC_vrm_animation.expressions.schema.json

expressions.preset.(プリセット表情名)

ひとつのプリセット表情を表すオブジェクトです。 VRMC_vrm 拡張で定義されているプリセット表情の名前をキー名として持ちます(aaleftBlink など)。 ただし、プリセット表情のうち lookUplookDownlookLeftlookRight は定義できません。

  • 型: expressions.expression
  • 必須: No

expressions.custom

カスタム表情に対する定義を含むオブジェクトです。

Properties

説明 必須
(カスタム表情名) expressions.expression ひとつのカスタム表情 No

JSON Schema

VRMC_vrm_animation.expressions.schema.json

expressions.custom.(カスタム表情名)

ひとつのカスタム表情を表すオブジェクトです。 VRMC_vrm 拡張で定義されるプリセット表情の名前以外であれば、任意の表情名を指定可能です。

  • 型: expressions.expression
  • 必須: No

expressions.expression

ひとつの表情を表すオブジェクトです。

Properties

説明 必須
node integer 表情に対応するノードのインデックス ✅ Yes

JSON Schema

VRMC_vrm_animation.expressions.expression.schema.json

expressions.expression.node ✅

表情に対応するノードのインデックスです。

  • 型: integer
  • 必須: Yes

lookAt

視点・視線に関する定義を行うオブジェクトです。

Properties

説明 必須
node integer 視線方向に対応するノードのインデックス No
offsetFromHeadBone number[3] Humanoidのheadからの視点位置のオフセット No

JSON Schema

VRMC_vrm_animation.lookAt.schema.json

lookAt.node

視線方向に対応するノードのインデックスです。

  • 型: integer
  • 必須: No

lookAt.offsetFromHeadBone

Humanoidのheadからの視点位置のオフセットです。

Humanoidが定義されていない場合、 offsetFromHeadBone の値をそのまま視点位置として解釈します。

  • 型: number[3]
  • 必須: No