-
アクターモデルファイル ( *.mam ) のフォーマットリファレンスです。
Version 1.0.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_BONE
- MAM_CULL_VOLUME
- MAM_MESH_SECTION_DESC 構造体
- MAM_MESH_OPACITY_PART 構造体
- MAM_MESH_TRANSPARENCY_PART 構造体
メッシュの記述 |
ボーン |
ボーン参照用インデックステーブル |
カンリングボリューム |
セクション |
バーテックスバッファ |
インデックスバッファ |
メッシュの記述
メッシュの記述 ( 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 構造体 ) |
・ |
・ |
・ |
名前 | 型 | 説明 |
---|---|---|
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 構造体 ) |
・ |
・ |
・ |
名前 | 型 | 説明 |
---|---|---|
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 ] ) |
名前 | 型 | 説明 |
---|---|---|
materialSlotIndex | UInt32 | マテリアルスロットのインデックス |
numOPPart | UInt32 | 不透明のパート数 |
numTLPart | UInt32 | 半透明 ( 一括描画 ) のパート数 |
numTIPart | UInt32 | 半透明 ( ポリゴン単位の描画 ) のパート数 |
名前 | 型 | 説明 |
---|---|---|
baseBone | UInt32 | ボーン参照用インデックステーブルの読み取り開始位置 |
numBone | UInt32 | ボーン参照用インデックステーブルから読み取るボーンの数 |
baseVertex | UInt32 | バーテックスバッファの読み取り開始位置 |
numVertex | UInt32 | バーテックスの数 |
baseIndex | UInt32 | インデックスバッファの読み取り開始位置 |
numIndex | UInt32 | インデックスの数 |
名前 | 型 | 説明 |
---|---|---|
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 構造体
モーションコントローラー |
・ |
・ |
・ |
また、モーションコントローラーは以下のような構造であり、
モーションコントローラーの記述以降に書き込まれるモーションは MAM_MC_DESC::numMotion の値の数だけ存在します。
モーションコントローラーの記述 ( 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_TYPE 列挙定数
- ボックス
- カプセル
- スフィア
シェイプ ( 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_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
- MAM_COLLIDER_STATUS 列挙定数
- MAM_COLLIDER_FLAGS 列挙定数
また、コライダーはシェイプを複数持つことができるため、事前に定義されているシェイプを先頭から MAM_COLLIDER::numShape の値の数だけ取り出して、複合形状とします。
コライダー ( 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_CS_DEFAULT | デフォルト | 1 |
MAM_CS_STATIC | スタティック | 2 |
MAM_CS_KINEMATIC | キネマティック | 3 |
名前 | 説明 | 値 |
---|---|---|
MAM_CF_ROT_X | 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
また、センサーはコライダーと同様、シェイプを複数持つことができるため、事前に定義されているシェイプを MAM_SENSOR::numShape の値の数だけ取り出し、複合形状とします。
センサー ( 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 列挙定数
- MAM_JOINT_FLAG 列挙定数
- ポイント
- ヒンジ
- ボール
ジョイント ( 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_POINT_JOINT | ポイント 点接続。 | 1 |
MAM_HINGE_JOINT | ヒンジ 蝶番による接続。 | 2 |
MAM_BALL_JOINT | ボール 円錐およびツイスト軸で制限をする特殊な接続。 | 3 |
名前 | 説明 | 値 |
---|---|---|
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_COORDINATE_SYSTEM 列挙定数
また、コライダー、センサー は事前に定義されているものを先頭から指定されている数だけ取り出していきます。
ボディ ( 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_CS_LH | 左手座標系 | 1 |
MAM_CS_RH | 右手座標系 | 2 |
ノード
-
ノードは MAM_INFO_HEADER::numNode の値の数だけ存在します。
- MAM_NODE
また、コライダー センサー ジョイント は事前に作成されているものを先頭から MAM_NODE::numCollider MAM_NODE::numSensor MAM_NODE::numJoint の値数だけ取り出していきます。
ノード ( 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 | 子ノードの数 |