PlayStation(R)Mobile MDX ファイル形式は、モデルデータを格納するファイル形式です。
Contents
MDX ファイルは、以下の機能をもつモデルデータを格納できます。
モデルデータのデフォルト設定は、以下のようになっています。
MDX ファイルは、以下のような階層的なブロックで構成されます。
File // ファイル本体 (バイナリ形式のみ)
Model // モデル本体
Bone // 階層ノード
Part // 形状データ
Mesh // 描画メッシュ
Arrays // 頂点データ
Material // マテリアル設定
Layer // テクスチャマッピング
Texture // テクスチャ画像
Motion // アニメーション集合
FCurve // アニメーションカーブ
テキスト形式の単純なモデルデータの例を、以下に示します。
.MDS 1.00
Model "model-0" {
Bone "bone-0" {
Translate 0.000000 0.000000 0.000000
RotateYXZ 0.000000 0.000000 0.000000
DrawPart "part-0"
}
Part "part-0" {
Mesh "mesh-0" {
SetMaterial "material-0"
SetArrays "arrays-0"
DrawArrays TRIANGLES 3 1 0 1 2
}
Arrays "arrays-0" POSITION|NORMAL 0 3 {
0.000000 0.577350 0.000000 0.000000 0.000000 1.000000
-0.500000 -0.288675 0.000000 0.000000 0.000000 1.000000
0.500000 -0.288675 0.000000 0.000000 0.000000 1.000000
}
}
Material "material-0" {
Diffuse 0.000000 0.000000 1.000000
Specular 1.000000 1.000000 1.000000
Opacity 1.000000
Shininess 10.000000
}
}
MDX ファイルは、ヘッダ、ブロック、コマンドの組み合わせで記述されます。
FormatSignature $version
BlockType $name $arg1 $arg2 ... {
CommandType $arg1 $arg2 ...
CommandType $arg1 $arg2 ...
BlockType $name $arg1 $arg2 ... {
CommandType $arg1 $arg2 ...
CommandType $arg1 $arg2 ...
}
BlockType $name $arg1 $arg2 ... {
$data0 $data1 $data2 ...
}
}
コマンド引数、ブロック引数、ブロックデータに含まれる要素の型は、以下のとおりです。
型 データ 記述例 1 記述例 2 ref ブロックへの参照 "bone-0" "Bone::bone-0" (ブロックタイプつき) enum 列挙定数 POSITION POSITION|NORMAL (論理和) string 8bit ゼロ終端文字列 "texture.png" float 32bit 浮動小数点数 10.0 half 16bit 浮動小数点数 10.0 int 32bit 符号つき整数 10 uint 32bit 符号なし整数 10 short 16bit 符号つき整数 10 ushort 16bit 符号なし整数 10 byte 8bit 符号つき整数 10 ubyte 8bit 符号なし整数 10
テキスト形式では、モデルデータがテキスト表現で格納されます。
バイナリ形式では、モデルデータがバイナリ表現で格納されます。
ヘッダ、ブロック、コマンドは、以下のような構造体に格納されます。
struct MdxHeader {
uint Signature ; // フォーマットシグネチャ ( 0x2e4d4458 )
uint Version ; // フォーマットバージョン ( 0x312e3030 )
uint Style ; // フォーマットスタイル ( 0x0050534d )
uint Option ; // フォーマットオプション ( 0x00000000 )
}
struct MdxBlock {
ushort Type ; // ブロックタイプ
ushort NameEnd ; // ブロック名の終了位置
uint ArgsEnd ; // ブロック引数の終了位置
uint DataEnd ; // ブロックデータの終了位置
uint ChildEnd ; // 子要素の終了位置
// ブロック名
// ブロック引数
// ブロックデータ
// 子要素
}
struct MdxCommand {
ushort Type ; // コマンドタイプ | 0x8000
ushort ArgsEnd ; // コマンド引数の終了位置
// コマンド引数
}
コマンド引数、ブロック引数、ブロックデータに含まれる値の位置は、それぞれのデータ型のサイズでアラインされています。ブロックへの参照は以下のようなビットフィールド値として格納されます。
struct MdxReference {
uint Bits ;
// ブロックのタイプ
int Type { get { return (int)( Bits >> 16 ) & 0xffff ; } }
// ブロックの相対レベル
int Level { get { return (int)( Bits >> 12 ) & 0x000f ; } }
// 同じ階層内の同タイプブロック内のブロック番号
int Index { get { return (int)( Bits >> 0 ) & 0x0fff ; } }
}
[概要] ファイル本体をあらわすブロック [書式] File $name { ... } [引数] string $name ブロック名 [要素] Model
[概要] モデル本体をあらわすブロック [書式] Model $name { ... } [引数] string $name ブロック名 [要素] BoundingBox BoundingSphere Bone (複数可) Part (複数可) Material (複数可) Texture (複数可) Motion (複数可)
[概要] 階層ノードをあらわすブロック [書式] Bone $name { ... } [引数] string $name ブロック名 [要素] BoundingBox BoundingSphere ParentBone Visibility Pivot Translate Rotate* Scale BlendBone (複数可) DrawPart (複数可)
[概要] 形状データをあらわすブロック [書式] Part $name { ... } [引数] string $name ブロック名 [要素] BoundingBox BoundingSphere Mesh (複数可) Arrays (複数可)
[概要] 描画メッシュをあらわすブロック [書式] Mesh $name { ... } [引数] string $name ブロック名 [要素] BoundingBox BoundingSphere SetMaterial SetArrays BlendIndices DrawArrays (複数可)
[概要] 頂点データをあらわすブロック [書式] Arrays $name $format $stride $count { ... } [引数] string $name ブロック名 enum VertexFormat $format 頂点フォーマット int $stride 頂点ストライド int $count 頂点数 [データ] 頂点データは (1頂点のデータ x 頂点数) で構成されます。 ------------------------------------------------ Position Normal Color TexCoord Weights Indices // Data for one vertex Position Normal Color TexCoord Weights Indices // Data for one vertex Position Normal Color TexCoord Weights Indices // Data for one vertex ... ------------------------------------------------ 頂点データの内容は、頂点フォーマットの論理和で定義されます。 頂点フォーマットと、対応する頂点要素は以下のとおりです。 ------------------------------------------------ POSITION float x 3 位置座標 NORMAL float x 3 法線ベクトル COLOR float x 4 頂点カラー TEXCOORD float x 2 テクスチャ座標 WEIGHTn float x n ブレンドウェイト INDICES ubyte x n ブレンドインデックス ------------------------------------------------
[概要] マテリアル設定をあらわすブロック [書式] Material $name { ... } [引数] string $name ブロック名 [要素] Diffuse Ambient Specular Emission Opacity Shininess Layer (複数可)
[概要] テクスチャマッピングをあらわすブロック [書式] Layer $name { ... } [引数] string $name ブロック名 [要素] SetTexture
[概要] テクスチャ画像をあらわすブロック [書式] Texture $name { ... } [引数] string $name ブロック名 [要素] FileName FileImage UVTranslate UVScale
[概要] アニメーション集合をあらわすブロック [書式] Motion $name { ... } [引数] string $name ブロック名 [要素] FrameLoop FrameRate FrameRepeat Animate (複数可) FCurve (複数可)
[概要] アニメーションカーブをあらわすブロック [書式] FCurve $name $interp $extrap $dimCount $keyCount { ... } [引数] string $name ブロック名 enum InterpType $interp 内挿タイプ enum ExtrapType $extrap 外挿タイプ int $dimCount 次元数 int $keyCount キーフレーム数 [データ] アニメーションカーブは (1キーフレームのデータ x キーフレーム数) で構成されます。 基本的には、1つのキーフレームにはフレームとキー値が格納されます。要素数は (次元数 + 1) になります。 ------------------------------------------------ Frame Values[n] // Data for one key-frame Frame Values[n] // Data for one key-frame Frame Values[n] // Data for one key-frame ... ------------------------------------------------ 内挿タイプが HERMITE の場合、さらに接線ベクトルの Y 成分が格納されます。要素数は (次元数 x 3 + 1) となります。 ------------------------------------------------ Frame Values[n] InTangentY[n] OutTangentY[n] Frame Values[n] InTangentY[n] OutTangentY[n] Frame Values[n] InTangentY[n] OutTangentY[n] ... ------------------------------------------------ 内挿タイプが CUBIC の場合、さらに接線ベクトルの X 成分が格納されます。要素数は (次元数 x 5 + 1) となります。 ------------------------------------------------ Frame Values[n] InTangentY[n] OutTangentY[n] InTangentX[n] OutTangentX[n] Frame Values[n] InTangentY[n] OutTangentY[n] InTangentX[n] OutTangentX[n] Frame Values[n] InTangentY[n] OutTangentY[n] InTangentX[n] OutTangentX[n] ... ------------------------------------------------
[概要] ファイル名 [書式] FileName $name [引数] string $name ファイル名
[概要] ファイルイメージ [書式] FileImage $size $data ... [引数] uint $size サイズ (単位=バイト) uint $data ... データ (32bit ごと)
[概要] バウンディングボックス [書式] BoundingBox $minX $minY $minZ $maxX $maxY $maxZ [引数] float $minX 最小 X float $minY 最小 Y float $minZ 最小 Z float $maxX 最大 X float $maxY 最大 Y float $maxZ 最大 Z
[概要] バウンディングスフィア [書式] BoundingSphere $centerX $centerY $centerZ $radius [引数] float $centerX 中心 X float $centerY 中心 Y float $centerZ 中心 Z float $radius 半径
[概要] 親ボーン [書式] ParentBone $bone [引数] ref Bone $bone 親ボーンへの参照
[概要] ビジビリティ [書式] Visibility $visibility [引数] uint $visibility ビジビリティ
[概要] ピボット [書式] Pivot $x $y $z [引数] float $x X float $y Y float $z Z
[概要] トランスレーション [書式] Translate $x $y $z [引数] float $x X float $y Y float $z Z
[概要] ローテーション (四元数) [書式] Rotate $x $y $z $w [引数] float $x X float $y Y float $z Z float $w W
[概要] ローテーション (オイラー角) [書式] RotateXYZ $x $y $z RotateYZX $x $y $z RotateZXY $x $y $z RotateXZY $x $y $z RotateYXZ $x $y $z RotateZYX $x $y $z [引数] float $x X (単位=度) float $y Y (単位=度) float $z Z (単位=度)
[概要] スケーリング [書式] Scale $x $y $z [引数] float $x X float $y Y float $z Z
[概要] 頂点ブレンドボーン [書式] BlendBone $bone $m11 $m12 $m13 $m14 \ $m21 $m22 $m23 $m24 \ $m31 $m32 $m33 $m34 \ $m41 $m42 $m43 $m44 [引数] ref Bone $bone 頂点ブレンドボーンへの参照 float $m11 ... $m14 オフセット行列の 1 列目 float $m21 ... $m24 オフセット行列の 2 列目 float $m31 ... $m34 オフセット行列の 3 列目 float $m41 ... $m44 オフセット行列の 4 列目
[概要] 描画パート [書式] DrawPart $part [引数] ref Part $part 描画パートへの参照
[概要] マテリアル設定 [書式] SetMaterial $material [引数] ref Material $material マテリアル設定への参照
[概要] 頂点データ [書式] SetArrays $arrays [引数] ref Arrays $arrays 頂点データへの参照
[概要] 頂点ブレンドインデックス [書式] BlendIndices $count $index ... [引数] int $count 頂点ブレンド数 int $index ... 頂点ブレンドインデックス
[概要] 描画プリミティブ [書式] DrawArrays $mode $vertCount $primCount $index ... [引数] enum DrawMode $mode 描画モード int $vertCount 頂点数 int $primCount プリミティブ数 ushort $index ... 頂点インデックス
[概要] ディフューズカラー [書式] Diffuse $r $g $b [引数] float $r R float $g G float $b B
[概要] アンビエントカラー [書式] Ambient $r $g $b [引数] float $r R float $g G float $b B
[概要] スペキュラーカラー [書式] Specular $r $g $b [引数] float $r R float $g G float $b B
[概要] エミッションカラー [書式] Emission $r $g $b [引数] float $r R float $g G float $b B
[概要] 不透明度 [書式] Opacity $opacity [引数] float $opacity 不透明度
[概要] スペキュラー指数 [書式] Shininess $shininess [引数] float $shininess スペキュラー指数
[概要] テクスチャ画像 [書式] SetTexture $texture [引数] ref Texture $texture テクスチャへの参照
[概要] UV トランスレーション [書式] UVTranslate $u $v [引数] float $u U float $v V
[概要] UV スケーリング [書式] UVScale $u $v [引数] float $u U float $v V
[概要] ループ範囲 [書式] FrameLoop $start $end [引数] $start 開始フレーム $end 終了フレーム
[概要] フレームレート [書式] FrameRate $fps [引数] float $fps フレームレート (単位=フレーム毎秒)
[概要] 繰り返しモード [書式] FrameRepeat $mode [引数] enum RepeatMode $mode 繰り返しモード
[概要] アニメーション [書式] Animate $block $command $option $fcurve [引数] ref Block $block ブロックへの参照 enum CommandType $command コマンドタイプ int $option オプション ref FCurve $fcurve アニメーションカーブへの参照
File = 0x0002 Model = 0x0010 Bone = 0x0011 Part = 0x0012 Mesh = 0x0013 Arrays = 0x0014 Material = 0x0016 Layer = 0x0017 Texture = 0x0018 Motion = 0x001b FCurve = 0x001c
FileName = 0x0080 FileImage = 0x0081 BoundingBox = 0x0082 BoundingSphere = 0x0083 ParentBone = 0x0440 Visibility = 0x0441 Pivot = 0x0442 Translate = 0x0443 Rotate = 0x0444 RotateXYZ = 0x0445 RotateYZX = 0x0446 RotateZXY = 0x0447 RotateXZY = 0x0448 RotateYXZ = 0x0449 RotateZYX = 0x044a Scale = 0x044b BlendBone = 0x0460 DrawPart = 0x047f SetMaterial = 0x04c0 SetArrays = 0x04c1 BlendIndices = 0x04c2 DrawArrays = 0x04e0 Diffuse = 0x0581 Ambient = 0x0582 Specular = 0x0583 Emission = 0x0584 Opacity = 0x0588 Shininess = 0x0589 SetTexture = 0x05c0 UVTranslate = 0x0621 UVScale = 0x0623 FrameLoop = 0x06c0 FrameRate = 0x06c1 FrameRepeat = 0x06c2 Animate = 0x06e0
POSITION = 1 << 0 NORMAL = 1 << 1 COLOR = 1 << 3 TEXCOORD = 1 << 5 WEIGHTn = n << 8 INDICES = 1 << 16
CONSTANT = 0x0000 LINEAR = 0x0001 HERMITE = 0x0002 CUBIC = 0x0003 SPHERICAL = 0x0004
HOLD = 0x0000 CYCLE = 0x0011 SHUTTLE = 0x0022 HOLD_HOLD = 0x0000 HOLD_CYCLE = 0x0001 HOLD_SHUTTLE = 0x0002 CYCLE_HOLD = 0x0010 CYCLE_CYCLE = 0x0011 CYCLE_SHUTTLE = 0x0012 SHUTTLE_HOLD = 0x0020 SHUTTLE_CYCLE = 0x0021 SHUTTLE_SHUTTLE = 0x0022
POINTS = 0x0000 LINES = 0x0001 LINE_STRIP = 0x0002 TRIANGLES = 0x0003 TRIANGLE_STRIP = 0x0004 TRIANGLE_FAN = 0x0005
HOLD = 0x0000 CYCLE = 0x0001