Version 1.0
- Contributors
- Status
- Dependencies
- Overview
- Concepts
- glTF Schema Updates
- 進藤 哲郎
- 0b5vr
Complete
glTF 2.0仕様に向けて策定されています。
また、仕様内の一部定義が VRMC_vrm
に依存します。
VRMC_vrm_animation
仕様は、人間型モデルに対するアニメーションを記述するためのglTF拡張です。
人間型モデルを記述するglTF拡張である VRMC_vrm
で表現されたモデルに対して適用することを想定しています。
glTFで定義されたノードのヒエラルキーに対して、各ノードと人間のボーン・表情・視線方向を関連付けて、任意の人間型モデルに適用できるアニメーションを表現します。 アニメーションの実データは、glTFのコア定義のアニメーション部分を利用します。
アニメーションのみを記述する独立したglTFファイルに使用されることを想定しています。
VRMC_vrm
を用いて記述されたVRMモデルに対して本拡張が含まれることは想定していません。
glTFのコア定義のアニメーションを利用します。
原則、アニメーションを用いる際は、 animations
に定義された最初のアニメーションを読み込むものとします。
1つのファイルに複数のアニメーションが含まれている場合があります。
実装は、1つのファイル内に含まれた複数のアニメーションに対応することができますが、必須ではありません。
glTF アニメーションは、任意時間にキーフレームを挿入できるのでフレームレートの概念がありません。 以下の点を考慮し、高すぎず低すぎないフレームレートの目安として秒間 30 フレームを提案します。
- ゲームでは 60 FPS や 30 FPS が一般的です
- モーションキャプチャーの生データ(加工前)は高フレームレートの場合があります
- 映像では 24FPS などがあります
アニメーションを Linear で Interpolation することを想定して、 30 FPS で十分な滑らかさを確保できると思われます。
Humanoidは、本拡張内で定義する人間のボーンの定義です。 各Humanoidボーンは、glTFのノードとして表現されます。
VRMC_vrm_animation/humanoid
内で、glTFのノードと人間のボーンの対応関係を示します。
Humanoidで利用するボーンおよびその構造について、 VRMC_vrm
拡張のHumanoidに準拠します。
ただし、Humanoidボーンのうち leftEye
・ rightEye
は、これらに対してアニメーションデータを持つことはできません。
これらは、後述するLookAtで扱われます。
将来的な拡張性を見越して、Humanoidボーンのヒエラルキー全体をアニメーションデータ内に収録しています。
Humanoidボーンとして指定されたノードは、アニメーションが適用されていないレストポーズにおいて、「VRM T-pose」と呼ばれるポーズに従っている必要があります。
Humanoidボーンとして指定されたノードに対するアニメーションを、アニメーションデータとして扱います。 Humanoidボーンに対するアニメーションにスケールを含めてはいけません。 また、Hipsボーン以外に対するアニメーションに平行移動を含めてはいけません。
実装内では、例えばUnityのHumanoidシステムを用いて高度なアニメーション転送がされることが望ましいですが、これが難しい場合は、単純にFKアニメーションとして転送することもできます。
また、 アニメーションデータとは別に T-Pose
を表現する node のヒエラルキーに scale
を含めないことを強く推奨します。
データを生成するアプリケーションで、ヒエラルキーとアニメーションにスケール値を事前に乗算することで解決できます。 ランタイムロードするプログラムの側の負担を軽減することを意図しています。
一方で、回転は任意で問題ありません。ポーズデータの互換性についてを参照してください。
Expressionsは、本拡張内で定義する人間の表情の定義です。 各Expressionsは、 [0, 1] の範囲のスカラをウェイトとして持ち、この数値がどの程度その表情が発現しているかを表します。
VRMC_vrm
拡張では、Expressionsのウェイトがメッシュのモーフ・マテリアルの色・テクスチャのUVに対して適用されます。
VRMC_vrm_animation/expressions
内で、glTFのノードと表情との対応関係を示します。
Expressionsの定義について、 VRMC_vrm
拡張のExpressionsに準拠します。
ただし、プリセット表情のうち lookUp
・ lookDown
・ lookLeft
・ lookRight
は、これらに対してアニメーションデータを持つことはできません。
これらは、後述するLookAtで扱われます。
Expressionsのうち、 VRMC_vrm
拡張でプリセット表情として定義されているものをプリセット表情、それ以外をカスタム表情と定義します。
カスタム表情に、プリセットと同じ名前の表情を含めることはできません。
Expressionsとして指定されたノードに対するアニメーションのうち、平行移動のX成分を、その表情のウェイトに対するアニメーションデータとして扱います。 ウェイト値は [0, 1] の範囲内に収まっていることが望ましいです。 実装は、 [0, 1] の範囲から外れたウェイト値を扱う場合、その値を [0, 1] の範囲内に収めて扱わなければいけません。
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
の値をそのまま視点位置として解釈します。
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
]
}
}
},
// ...
}
本拡張のルートオブジェクトです。
型 | 説明 | 必須 | |
---|---|---|---|
specVersion |
string |
本拡張の仕様バージョン | ✅ Yes |
humanoid |
humanoid |
Humanoidボーンに関する定義 | No |
expressions |
expressions |
Expressionsの表情とノードの対応関係 | No |
lookAt |
lookAt |
視点・視線に関する定義 | No |
VRMC_vrm_animation.schema.json
VRMC_vrm_animation
拡張の仕様バージョンを表します。値は "1.0"
です。
- 型:
string
- 必須: Yes
Humanoidボーンとノードの対応関係を表すオブジェクトです。
- 型:
humanoid
- 必須: No
Expressionsの表情とノードの対応関係を表すオブジェクトです。
- 型:
expressions
- 必須: No
視点・視線に関する定義を行うオブジェクトです。
- 型:
lookAt
- 必須: No
Humanoidボーンに関する定義を行うオブジェクトです。
型 | 説明 | 必須 | |
---|---|---|---|
humanBones | humanoid.humanBones |
Humanoidボーンとノードの対応関係を表す | Yes ✅ |
VRMC_vrm_animation.humanoid.schema.json
Humanoidボーンとノードの対応関係を表すオブジェクトです。
- 型:
humanoid.humanBones
- 必須: Yes
Humanoidボーンとノードの対応関係を表すオブジェクトです。
型 | 説明 | 必須 | |
---|---|---|---|
(Humanoidボーン名) | humanoid.humanBones.humanBone |
ひとつのHumanoidボーン | Mixed |
VRMC_vrm_animation.humanoid.humanBones.schema.json
ひとつのHumanoidボーンを表すオブジェクトです。
VRMC_vrm
拡張で定義されているHumanoidボーンの名前をキー名として持ちます(hips
や leftUpperArm
など)。
ただし、Humanoidボーンのうち leftEye
・ rightEye
は定義できません。
- 型:
humanoid.humanBones.humanBone
- 必須: VRM仕様で必須ボーンと定義されている場合、この値は必須です。
ひとつのHumanoidボーンを表すオブジェクトです。
型 | 説明 | 必須 | |
---|---|---|---|
node |
integer |
Humanoidボーンに対応するノードのインデックス | ✅ Yes |
VRMC_vrm_animation.humanoid.humanBones.humanBone.schema.json
Humanoidボーンに対応するノードのインデックスです。
- 型:
integer
- 必須: Yes
Expressionsの表情とノードの対応関係を表すオブジェクトです。
型 | 説明 | 必須 | |
---|---|---|---|
preset |
expressions.preset |
プリセット表情に対する定義 | No |
custom |
expressions.custom |
カスタム表情に対する定義 | No |
VRMC_vrm_animation.expressions.schema.json
プリセット表情に対する定義を含むオブジェクトです。
- 型:
expressions.preset
- 必須: No
カスタム表情に対する定義を含むオブジェクトです。
- 型:
expressions.custom
- 必須: No
プリセット表情に対する定義を含むオブジェクトです。
型 | 説明 | 必須 | |
---|---|---|---|
(プリセット表情名) | expressions.expression |
ひとつのプリセット表情 | No |
VRMC_vrm_animation.expressions.schema.json
ひとつのプリセット表情を表すオブジェクトです。
VRMC_vrm
拡張で定義されているプリセット表情の名前をキー名として持ちます(aa
や leftBlink
など)。
ただし、プリセット表情のうち lookUp
・ lookDown
・ lookLeft
・ lookRight
は定義できません。
- 型:
expressions.expression
- 必須: No
カスタム表情に対する定義を含むオブジェクトです。
型 | 説明 | 必須 | |
---|---|---|---|
(カスタム表情名) | expressions.expression |
ひとつのカスタム表情 | No |
VRMC_vrm_animation.expressions.schema.json
ひとつのカスタム表情を表すオブジェクトです。
VRMC_vrm
拡張で定義されるプリセット表情の名前以外であれば、任意の表情名を指定可能です。
- 型:
expressions.expression
- 必須: No
ひとつの表情を表すオブジェクトです。
型 | 説明 | 必須 | |
---|---|---|---|
node |
integer |
表情に対応するノードのインデックス | ✅ Yes |
VRMC_vrm_animation.expressions.expression.schema.json
表情に対応するノードのインデックスです。
- 型:
integer
- 必須: Yes
視点・視線に関する定義を行うオブジェクトです。
型 | 説明 | 必須 | |
---|---|---|---|
node |
integer |
視線方向に対応するノードのインデックス | No |
offsetFromHeadBone |
number[3] |
Humanoidのheadからの視点位置のオフセット | No |
VRMC_vrm_animation.lookAt.schema.json
視線方向に対応するノードのインデックスです。
- 型:
integer
- 必須: No
Humanoidのheadからの視点位置のオフセットです。
Humanoidが定義されていない場合、 offsetFromHeadBone
の値をそのまま視点位置として解釈します。
- 型:
number[3]
- 必須: No