Engine

アクターモデルファイル | ファイルフォーマット

アクターモデルファイル　( *.mam )　のフォーマットリファレンスです。
Version 1.0.0.0

最初のフォーマット

Version 1.1.0.0

[Chg] | ???

ファイルヘッダ
情報ヘッダ
マテリアルスロット
メッシュ
モーションコントローラー
キネマティックキャラクター
シェイプ
コライダー
センサー
ジョイント
ボディ
ノード

ファイルヘッダ

ファイルヘッダはアクターモデルファイルを識別するためのものです。

ファイルヘッダ ( MAM_FILE_HEADER 構造体 )

- MAM_FILE_HEADER

名前 | 型 | 説明 | 値
--- | --- | --- | ---
magic | UInt32 | マジック値 | 0x464D414D
version | UInt32 | バージョン | 0x01010000

情報ヘッダ

情報ヘッダはアクターモデル全般の情報を記述します。

情報ヘッダ ( MAM_INFO_HEADER 構造体 )

- MAM_INFO_HEADER

名前 | 型 | 説明
--- | --- | ---
numMaterialSlot | UInt32 | マテリアルスロットの数
numMesh | UInt32 | メッシュの数
numMotionController | UInt32 | モーションコントローラーの数
numKinematicCharacter | UInt32 | キネマティックキャラクターの数 最大で一つしか所持することができないため、値は 0 もしくわ 1 になります。
numShape | UInt32 | シェイプの数
numCollider | UInt32 | コライダーの数
numSensor | UInt32 | センサーの数
numJoint | UInt32 | ジョイントの数
numBody | UInt32 | ボディの数 最大で一つしか所持することができないため、値は 0 もしくわ 1 になります。
numNode | UInt32 | ノードの数

マテリアルスロット

マテリアルスロットは、MAM_INFO_HEADER::numMaterialSlot の値の数だけ存在します。

マテリアルスロット
・
・
・

また、マテリアルスロットは以下のような構造になります。

名前 ( wchar_t[32] )
マテリアルファイル ( *.mtl ) が書き込まれます。 フォーマットはマテリアルファイルを参照してください。 ※ マジック値は書き込まれません

メッシュ

メッシュの記述
ボーン
ボーン参照用インデックステーブル
カンリングボリューム
セクション
バーテックスバッファ
インデックスバッファ

メッシュの記述

メッシュの記述 ( MAM_MESH_DESC 構造体 )

- MAM_MESH_DESC

名前 | 型 | 説明
--- | --- | ---
numBone | UInt32 | ボーンの数
numBoneMat | UInt32 | ボーン行列の数
numCullVolume | UInt32 | カリングボリュームの数
numSection | UInt32 | セクションの数
vertexStride | UInt32 | バーテックスのストライド ( バイト単位 )
numVertex | UInt32 | バーテックスの数
indexStride | UInt32 | インデックスのストライド ( バイト単位 )
numIndex | UInt32 | インデックスの数

ボーン

ボーンは、MAM_MESH_DESC::numBone の値の数だけ存在します。

ボーン ( MAM_BONE 構造体 )
・
・
・

- MAM_BONE

名前 | 型 | 説明
--- | --- | ---
linkNodeName | wchar_t[32] | リンクするノードの名前
offsetMat | Float32[4][4] | オフセット行列

ボーン参照用インデックステーブル

ボーン参照用インデックステーブルの要素は、MAM_MESH_DESC::numBoneMat の値の数だけ存在します。

インデックス ( UInt32 )
・
・
・

ボーン行列の数は、ボーンの数 ( MAM_MESH_DESC::numBone ) を下回ることはありませんが、ボーンの数が20本を超えた際にボーン行列の数がボーンの数を上回ることがあります。
これは、影響するボーンの数が20本を超えないよう描画パートを分割した際に、複数の描画パートでボーンを共有することがあるからです。

カリングボリューム

カリングボリュームは、視界に入っているかどうかを判定するための境界を表すものであり、MAM_MESH_DESC::numCullVolume の値の数だけ存在します。

カリングボリューム ( MAM_CULL_VOLUME 構造体 )
・
・
・

- MAM_CULL_VOLUME

名前 | 型 | 説明
--- | --- | ---
pos | Float32[3] | 中心座標 pos = { X, Y, Z }
radius | Float32[3] | 半径ベクトル radius = { X, Y, Z }

セクション

セクションはマテリアル単位で分割されており、MAM_MESH_DESC::numSection の値の数だけ存在します。

セクションの記述 ( MAM_MESH_SECTION_DESC )
不透明描画のパート ( MAM_MESH_OPACITY_PART [ MAM_MESH_SECTION_DESC::numOPPart ] )
半透明の一括描画のパート ( MAM_MESH_TRANSPARENCY_PART [ MAM_MESH_SECTION_DESC::numTLPart ] )
半透明のポリゴン単位の描画のパート ( MAM_MESH_TRANSPARENCY_PART [ MAM_MESH_SECTION_DESC::numTIPart ] )

- MAM_MESH_SECTION_DESC 構造体

名前 | 型 | 説明
--- | --- | ---
materialSlotIndex | UInt32 | マテリアルスロットのインデックス
numOPPart | UInt32 | 不透明のパート数
numTLPart | UInt32 | 半透明 ( 一括描画 ) のパート数
numTIPart | UInt32 | 半透明 ( ポリゴン単位の描画 ) のパート数

- MAM_MESH_OPACITY_PART 構造体

名前 | 型 | 説明
--- | --- | ---
baseBone | UInt32 | ボーン参照用インデックステーブルの読み取り開始位置
numBone | UInt32 | ボーン参照用インデックステーブルから読み取るボーンの数
baseVertex | UInt32 | バーテックスバッファの読み取り開始位置
numVertex | UInt32 | バーテックスの数
baseIndex | UInt32 | インデックスバッファの読み取り開始位置
numIndex | UInt32 | インデックスの数

- MAM_MESH_TRANSPARENCY_PART 構造体

名前 | 型 | 説明
--- | --- | ---
baseBone | UInt32 | ボーン参照用インデックステーブルの読み取り開始位置
numBone | UInt32 | ボーン参照用インデックステーブルから読み取るボーンの数
affectBone | UInt32 | 最も影響を受けるボーンのインデックス ※ ソートキーを変換する際に使用します
baseVertex | UInt32 | バーテックスバッファの読み取り開始位置
numVertex | UInt32 | バーテックスの数
baseIndex | UInt32 | インデックスバッファの読み取り開始位置
numIndex | UInt32 | インデックスの数
sortKey | Float32[3] | ソートキー { X, Y, Z }

バーテックスバッファ

バーテックスバッファは、メッシュを構成する頂点の集合です。
また、バーテックスバッファのバイト単位のサイズは、MAM_MESH_DESC::vertexStride * MAM_MESH_DESC::numVertex になります。

インデックスバッファ

インデックスバッファはポリゴンを形成する頂点を参照するためのインデックスの集合です。
プリミティブの種類はトライアングルリストになります。
また、インデックスバッファのバイト単位のサイズは、MAM_MESH_DESC::indexStride * MAM_MESH_DESC::numIndex になります。

モーションコントローラー

モーションコントローラーは MAM_INFO_HEADER::numMotionController の値の数だけ存在します。

モーションコントローラー
・
・
・

また、モーションコントローラーは以下のような構造であり、
モーションコントローラーの記述以降に書き込まれるモーションは MAM_MC_DESC::numMotion の値の数だけ存在します。

モーションコントローラーの記述 ( MAM_MC_DESC 構造体 )
モーション フォーマットはモーションファイルを参照してください。 ※ マジック値は書き込まれません
・
・
・

- MAM_MC_DESC 構造体

名前 | 型 | 説明
--- | --- | ---
name | wchar_t[32] | 名前
priority | UInt32 | プライオリティ
numMotion | UInt32 | モーションの数

キネマティックキャラクター

キネマティックキャラクターはメッシュの記述にあるキネマティックキャラクターの数が1以上だった場合に存在します。

キネマティックキャラクター ( MAM_KINEMATIC_CHARACTER 構造体 )

- MAM_KINEMATIC_CHARACTER

名前 | 型 | 説明
--- | --- | ---
loadMat | Float32[4][4] | ロード行列 アクターモデルのワールドトランスフォームをキネマティックキャラクターのワールドトランスフォームへ変換するための行列です。
storeMat | Float32[4][4] | ストア行列 キネマティックキャラクターのワールドトランスフォームを アクターモデルのワールドトランスフォームへ変換するための行列です。
height | Float32 | カプセルの高さ
radius | Float32 | カプセルの半径
gravity | Float32 | 重力
maxFallSpeed | Float32 | 最大落下速度
initJumpSpeed | Float32 | ジャンプの初速
stepHeight | Float32 | 上れる段差の高さ
stepSlope | Float32 | 上れる勾配の角度 ( ラジアン単位 )
reserve | UInt32 | 予約領域

シェイプ

シェイプは、コライダーの形状を表し、MAM_INFO_HEADER::numShape の値の数だけ存在します。

シェイプ ( MAM_SHAPE 構造体 )
・
・
・

- MAM_SHAPE

名前 | 型 | 説明
--- | --- | ---
localRotation | Float32[4] | ローカルの回転 localRotation = { X, Y, Z, W } ( クォータニオン )
localPosition | Float32[4] | ローカルの位置 localPosition = { X, Y, Z, 1.0 }
type | UInt32 | タイプ MAM_SHAPE_TYPE 列挙定数 のいずれか。
data | UInt32[5] | データ

- MAM_SHAPE_TYPE 列挙定数

名前 | 説明 | 値
--- | --- | ---
MAM_BOX_SHAPE | ボックス | 1
MAM_CAPSULE_SHAPE | カプセル | 2
MAM_SPHERE_SHAPE | スフィア | 3

データに書き込まれている内容は タイプによって変化します。
書き込まれる内容は以下のようになります。
- ボックス

型 | 説明
--- | ---
Float32[3] | ボックスのXYZ辺の半分の長さ { X, Y, Z }
UInt32[2] | 予約領域

- カプセル

型 | 説明
--- | ---
UInt32 | 軸 ( 1:X 2:Y 3:Z )
Float32 | 高さ
Float32 | 半径
UInt32[2] | 予約領域

- スフィア

型 | 説明
--- | ---
Float32 | 半径
UInt32[4] | 予約領域

コライダー

コライダーは MAM_INFO_HEADER::numCollider の値の数だけ存在します。
また、コライダーはシェイプを複数持つことができるため、事前に定義されているシェイプを先頭から MAM_COLLIDER::numShape の値の数だけ取り出して、複合形状とします。

コライダー ( MAM_COLLIDER 構造体 )
・
・
・

- MAM_COLLIDER

名前 | 型 | 説明
--- | --- | ---
name | wchar_t[32] | 名前
numShape | UInt32 | シェイプの数
id | UInt32 | 識別子
attr | UInt32 | 属性
friction | Float32 | 摩擦係数
resitution | Float32 | 反発係数
status | UInt32 | ステータス MAM_COLLIDER_STATUS 列挙定数 のいずれか。
mass | Float32 | 質量 0.0 の場合はスタティックになります。
flags | UInt32 | フラグ MAM_COLLIDER_FLAGS 列挙定数 の組み合わせ。
loadMat | Float32[4][4] | ロード行列 ノードのワールドトランスフォームをコライダーのワールドトランスフォームへ変換する行列です。
storeMat | Float32[4][4] | ストア行列 コライダーのワールドトランスフォームをノードのワールドトランスフォームへ変換する行列です。
rotation | Float32[4] | 回転 rotation = { X, Y, Z, 1.0 } ( クォータニオン )
position | Float32[4] | 位置 position = { X, Y, Z, 1.0 }

- MAM_COLLIDER_STATUS 列挙定数

名前 | 説明 | 値
--- | --- | ---
MAM_CS_DEFAULT | デフォルト | 1
MAM_CS_STATIC | スタティック | 2
MAM_CS_KINEMATIC | キネマティック | 3

- MAM_COLLIDER_FLAGS 列挙定数

名前 | 説明 | 値
--- | --- | ---
MAM_CF_ROT_X | Ｘ軸の回転を有効 | 0x00000001
MAM_CF_ROT_Y | Y軸の回転を有効 | 0x00000002
MAM_CF_ROT_Z | Z軸の回転を有効 | 0x00000004
MAM_CF_ALWAYS_ACTIVE | 常にアクティブ | 0x00000008
MAM_CF_CAST_MOTION | ラグドール時に自身 ( コライダー ) のワールドトランスフォームをアクターモデルのワールドトランスフォームへ反映する。 | 0x00000010

センサー

センサーは MAM_INFO_HEADER::numSensor の値の数だけ存在します。
また、センサーはコライダーと同様、シェイプを複数持つことができるため、事前に定義されているシェイプを MAM_SENSOR::numShape の値の数だけ取り出し、複合形状とします。

センサー ( MAM_SENSOR 構造体 )
・
・
・

- MAM_SENSOR

名前 | 型 | 説明
--- | --- | ---
name | wchar_t[32] | 名前
numShape | UInt32 | シェイプの数
id | UInt32 | 識別子
attr | UInt32 | 属性
reserve | UInt32 | 予約領域
loadMat | Float32[4][4] | ロード行列 ノードのワールドトランスフォームをセンサーのワールドトランスフォームへ変換する行列です。
rotation | Float32[4] | 回転 rotation = { X, Y, Z, W } ( クォータニオン )
position | Float32[4] | 位置 position = { X, Y, Z, 1.0 }

ジョイント

ジョイントは MAM_INFO_HEADER::numJoint の値の数だけ存在します。

ジョイント ( MAM_JOINT 構造体 )
・
・
・

- MAM_JOINT

名前 | 型 | 説明
--- | --- | ---
type | UInt32 | タイプ MAM_JOINT_TYPE 列挙定数のいずれか。
flags | UInt32 | フラグ MAM_JOINT_FLAG 列挙定数の組み合わせ。
colliderIndexA | Int32 | 接続するコライダーAのインデックス
colliderIndexB | Int32 | 接続するコライダーBのインデックス -1 の場合は ワールドに接続にします。
pivotA | Float32[4] | コライダーAのローカルの接続位置 pivotA = { X, Y, Z, 1.0 }
pivotB | Float32[4] | コライダーBのローカルの接続位置 pivotB = { X, Y, Z, 1.0 }
loadMat | Float32[4][4] | ロード行列 ワールドに接続されている際に、親ノードのワールドトランスフォームから pivotB を求める行列です。
data | UInt32[16] | データ

- MAM_JOINT_TYPE 列挙定数

名前 | 説明 | 値
--- | --- | ---
MAM_POINT_JOINT | ポイント 点接続。 | 1
MAM_HINGE_JOINT | ヒンジ 蝶番による接続。 | 2
MAM_BALL_JOINT | ボール 円錐およびツイスト軸で制限をする特殊な接続。 | 3

- MAM_JOINT_FLAG 列挙定数

名前 | 説明 | 値
--- | --- | ---
MAM_JF_COLLISION_DISABLE | 接続されたコライダー同士の衝突を無効にする | 0x00000001

データに書き込まれている内容は タイプによって変化します。
書き込まれる内容は以下のようになります。
- ポイント

型 | 説明
--- | ---
Float32 | ピボットのスプリングのやわらかさ。
Float32 | ピボットのダンパーの減衰力。
UInt32[14] | 予約領域

- ヒンジ

型 | 説明
--- | ---
Float32[4] | 回転の軸 { X, Y, Z, 1.0 }
Float32 | 回転の最小角度 ( ラジアン単位 )
Float32 | 回転の最大角度 ( ラジアン単位 )
Float32 | 回転が限界に達する位置のスプリングのやわらかさ
Float32 | 回転が限界に達する位置のダンパーの減衰力
UInt32[8] | 予約領域

- ボール

型 | 説明
--- | ---
Float32[4] | ツイストの軸 { X, Y, Z, 1.0 }
Float32[4] | スィングの軸 { X, Y, Z, 1.0 }
Float32 | ツイストの最大角度 ( ラジアン単位 )
Float32 | スィングの最大角度 1 ( ラジアン単位 )
Float32 | スィングの最大角度 2 ( ラジアン単位 )
Float32 | ピボットのスプリングのやわらかさ
Float32 | ピボットのダンパーの減衰力
Float32 | 回転が限界に達する位置のスプリングのやわらかさ ※
Float32 | 回転が限界に達する位置のダンパーの減衰力 ※
UInt32 | 予約領域

※ ツイスト、スイング、共通パラメータです

ボディ

ボディはデータヘッダに記述されているボディの数が1以上だった場合に存在します。
また、コライダー、センサー は事前に定義されているものを先頭から指定されている数だけ取り出していきます。

ボディ ( MAM_BODY 構造体 )

- MAM_BODY

名前 | 型 | 説明
--- | --- | ---
scaling | Float32[4] | スケーリング { X, Y, Z, 1.0 }
rotation | Float32[4] | 回転 ( クォータニオン ) { X, Y, Z, W }
position | Float32[4] | 位置 { X, Y, Z, 1.0 }
coordSys | UInt32 | 座標系 MAM_COORDINATE_SYSTEM 列挙定数のいずれか。
numCollider | UInt32 | コライダーの数
numSensor | UInt32 | センサーの数
reserve | UInt32 | 予約領域
loadMat | Float32[4][4] | ラグドール時に MAM_CF_CAST_MOTION が設定されているコライダーのワールドトランスフォームをアクターモデルのワールドトランスフォームへ変換するための行列。

- MAM_COORDINATE_SYSTEM 列挙定数

名前 | 説明 | 値
--- | --- | ---
MAM_CS_LH | 左手座標系 | 1
MAM_CS_RH | 右手座標系 | 2

ノード

ノードは MAM_INFO_HEADER::numNode の値の数だけ存在します。
また、コライダー センサー ジョイント は事前に作成されているものを先頭から MAM_NODE::numCollider MAM_NODE::numSensor MAM_NODE::numJoint の値数だけ取り出していきます。

ノード ( MAM_NODE 構造体 )
・
・
・

- MAM_NODE

名前 | 型 | 説明
--- | --- | ---
name | wchar_t[32] | 名前
geometricScaling | Float32[4] | ジオメトリックスケーリング
geometricRotation | Float32[4] | ジオメトリックローテーション
geometricTranslation | Float32[4] | ジオメトリックトランスレーション
localScaling | Float32[4] | ローカル空間のスケーリング
localRotation | Float32[4] | ローカル空間の回転
localTranslation | Float32[4] | ローカル空間の位置
meshIndex | Int32 | メッシュのインデックス メッシュを所持しない場合は -1 になります。
numCollider | UInt32 | コライダーの数 コライダーは一つしか持つことができないため 0 もしくわ 1 になります。
numSensor | UInt32 | センサーの数
numJoint | UInt32 | ジョイントの数
parentIndex | Int32 | 親ノードのインデックス 親が存在しない場合は -1 になります。
numChild | Int32 | 子ノードの数