PlayStation(R)Mobile MDX ファイル形式

PlayStation(R)Mobile MDX ファイル形式は、モデルデータを格納するファイル形式です。

MDX ファイル形式

モデルデータ

MDX ファイルは、以下の機能をもつモデルデータを格納できます。

  • 階層ノード (トランスフォーメーション、ビジビリティ、スキニング)
  • 形状データ (ポイント、ライン、トライアングル)
  • 頂点データ (位置、法線、カラー、UV、ウェイト、インデックス)
  • マテリアル設定 (レガシーマテリアル)
  • テクスチャマッピング (シングルレイヤー)
  • テクスチャ画像 (DDS, PNG, JPG, BMP, GIF)
  • アニメーション (トランスフォーメーション、マテリアル、UV)

モデルデータのデフォルト設定は、以下のようになっています。

  • 3D 座標 : 右手系 (Y=上)
  • UV 座標 : 左上原点
  • 行列順序 : Column-major
  • 面カリング : CCW が表面
  • 法線ベクトル : 表面方向

ブロック構造

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  

テキスト形式

テキスト形式では、モデルデータがテキスト表現で格納されます。

  • ファイル名の拡張子は ".MDS" です。
  • フォーマットシグネチャは ".MDS" です。
  • キャラクタのサイズは 8bit です。
  • File ブロックは省略されます
  • Arrays ブロックの頂点ストライドは 0 になります

バイナリ形式

バイナリ形式では、モデルデータがバイナリ表現で格納されます。

  • ファイル名の拡張子は ".MDX" です。
  • フォーマットシグネチャは '.MDX' です。
  • バイトオーダーはリトルエンディアンです
  • File ブロックが出力されます
  • Arrays ブロックの頂点ストライドは計算された値になります

ヘッダ、ブロック、コマンドは、以下のような構造体に格納されます。

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 ;        // コマンド引数の終了位置

    // コマンド引数
}
  • 構造体とその要素の位置は、4バイト単位でアラインされています。
  • ある要素の開始位置は、直前の要素の終了位置から計算できます。
  • ある要素の終了位置は、構造体先頭からのオフセットとして、構造体に格納されています。

コマンド引数、ブロック引数、ブロックデータに含まれる値の位置は、それぞれのデータ型のサイズでアラインされています。ブロックへの参照は以下のようなビットフィールド値として格納されます。

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

[概要]

    ファイル本体をあらわすブロック

[書式]

    File $name {
        ...
    }

[引数]

    string $name                ブロック名

[要素]

    Model

Model

[概要]

    モデル本体をあらわすブロック

[書式]

    Model $name {
        ...
    }

[引数]

    string $name                ブロック名

[要素]

    BoundingBox
    BoundingSphere
    Bone                        (複数可)
    Part                        (複数可)
    Material                    (複数可)
    Texture                     (複数可)
    Motion                      (複数可)

Bone

[概要]

    階層ノードをあらわすブロック

[書式]

    Bone $name {
        ...
    }

[引数]

    string $name                ブロック名

[要素]

    BoundingBox
    BoundingSphere
    ParentBone
    Visibility
    Pivot
    Translate
    Rotate*
    Scale
    BlendBone                   (複数可)
    DrawPart                    (複数可)

Part

[概要]

    形状データをあらわすブロック

[書式]

    Part $name {
        ...
    }

[引数]

    string $name                ブロック名

[要素]

    BoundingBox
    BoundingSphere
    Mesh                        (複数可)
    Arrays                      (複数可)

Mesh

[概要]

    描画メッシュをあらわすブロック

[書式]

    Mesh $name {
        ...
    }

[引数]

    string $name                ブロック名

[要素]

    BoundingBox
    BoundingSphere
    SetMaterial
    SetArrays
    BlendIndices
    DrawArrays                  (複数可)

Arrays

[概要]

    頂点データをあらわすブロック

[書式]

    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

[概要]

    マテリアル設定をあらわすブロック

[書式]

    Material $name {
        ...
    }

[引数]

    string $name                ブロック名

[要素]

    Diffuse
    Ambient
    Specular
    Emission
    Opacity
    Shininess
    Layer                       (複数可)

Layer

[概要]

    テクスチャマッピングをあらわすブロック

[書式]

    Layer $name {
        ...
    }

[引数]

    string $name                ブロック名

[要素]

    SetTexture

Texture

[概要]

    テクスチャ画像をあらわすブロック

[書式]

    Texture $name {
        ...
    }

[引数]

    string $name                ブロック名

[要素]

    FileName
    FileImage
    UVTranslate
    UVScale

Motion

[概要]

    アニメーション集合をあらわすブロック

[書式]

    Motion $name {
        ...
    }

[引数]

    string $name                ブロック名

[要素]

    FrameLoop
    FrameRate
    FrameRepeat
    Animate                     (複数可)
    FCurve                      (複数可)

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

[概要]

    ファイル名

[書式]

    FileName $name

[引数]

    string $name                ファイル名

FileImage

[概要]

    ファイルイメージ

[書式]

    FileImage $size $data ...

[引数]

    uint $size                  サイズ (単位=バイト)
    uint $data ...              データ (32bit ごと)

BoundingBox

[概要]

    バウンディングボックス

[書式]

    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

[概要]

    バウンディングスフィア

[書式]

    BoundingSphere $centerX $centerY $centerZ $radius

[引数]

    float $centerX              中心 X
    float $centerY              中心 Y
    float $centerZ              中心 Z
    float $radius               半径

Bone コマンド

ParentBone

[概要]

    親ボーン

[書式]

    ParentBone $bone

[引数]

    ref Bone $bone              親ボーンへの参照

Visibility

[概要]

    ビジビリティ

[書式]

    Visibility $visibility

[引数]

    uint $visibility            ビジビリティ

Pivot

[概要]

    ピボット

[書式]

    Pivot $x $y $z

[引数]

    float $x                    X
    float $y                    Y
    float $z                    Z

Translate

[概要]

    トランスレーション

[書式]

    Translate $x $y $z

[引数]

    float $x                    X
    float $y                    Y
    float $z                    Z

Rotate

[概要]

    ローテーション (四元数)

[書式]

    Rotate $x $y $z $w

[引数]

    float $x                    X
    float $y                    Y
    float $z                    Z
    float $w                    W

RotateXYZ/YZX/ZXY/XZY/YXZ/ZYX

[概要]

    ローテーション (オイラー角)

[書式]

    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

[概要]

    スケーリング

[書式]

    Scale $x $y $z

[引数]

    float $x                    X
    float $y                    Y
    float $z                    Z

BlendBone

[概要]

    頂点ブレンドボーン

[書式]

    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

[概要]

    描画パート

[書式]

    DrawPart $part

[引数]

    ref Part $part              描画パートへの参照

Mesh コマンド

SetMaterial

[概要]

    マテリアル設定

[書式]

    SetMaterial $material

[引数]

    ref Material $material      マテリアル設定への参照

SetArrays

[概要]

    頂点データ

[書式]

    SetArrays $arrays

[引数]

    ref Arrays $arrays          頂点データへの参照

BlendIndices

[概要]

    頂点ブレンドインデックス

[書式]

    BlendIndices $count $index ...

[引数]

    int $count                  頂点ブレンド数
    int $index ...              頂点ブレンドインデックス

DrawArrays

[概要]

    描画プリミティブ

[書式]

    DrawArrays $mode $vertCount $primCount $index ...

[引数]

    enum DrawMode $mode         描画モード
    int $vertCount              頂点数
    int $primCount              プリミティブ数
    ushort $index ...           頂点インデックス

Material コマンド

Diffuse

[概要]

    ディフューズカラー

[書式]

    Diffuse $r $g $b

[引数]

    float $r                    R
    float $g                    G
    float $b                    B

Ambient

[概要]

    アンビエントカラー

[書式]

    Ambient $r $g $b

[引数]

    float $r                    R
    float $g                    G
    float $b                    B

Specular

[概要]

    スペキュラーカラー

[書式]

    Specular $r $g $b

[引数]

    float $r                    R
    float $g                    G
    float $b                    B

Emission

[概要]

    エミッションカラー

[書式]

    Emission $r $g $b

[引数]

    float $r                    R
    float $g                    G
    float $b                    B

Opacity

[概要]

    不透明度

[書式]

    Opacity $opacity

[引数]

    float $opacity              不透明度

Shininess

[概要]

    スペキュラー指数

[書式]

    Shininess $shininess

[引数]

    float $shininess            スペキュラー指数

Layer コマンド

SetTexture

[概要]

    テクスチャ画像

[書式]

    SetTexture $texture

[引数]

    ref Texture $texture        テクスチャへの参照

Texture コマンド

UVTranslate

[概要]

    UV トランスレーション

[書式]

    UVTranslate $u $v

[引数]

    float $u                    U
    float $v                    V

UVScale

[概要]

    UV スケーリング

[書式]

    UVScale $u $v

[引数]

    float $u                    U
    float $v                    V

Motion コマンド

FrameLoop

[概要]

    ループ範囲

[書式]

    FrameLoop $start $end

[引数]

    $start                      開始フレーム
    $end                        終了フレーム

FrameRate

[概要]

    フレームレート

[書式]

    FrameRate $fps

[引数]

    float $fps                  フレームレート (単位=フレーム毎秒)

FrameRepeat

[概要]

    繰り返しモード

[書式]

    FrameRepeat $mode

[引数]

    enum RepeatMode $mode       繰り返しモード

Animate

[概要]

    アニメーション

[書式]

    Animate $block $command $option $fcurve

[引数]

    ref Block $block            ブロックへの参照
    enum CommandType $command   コマンドタイプ
    int $option                 オプション
    ref FCurve $fcurve          アニメーションカーブへの参照

列挙定数

BlockType

File            = 0x0002
Model           = 0x0010
Bone            = 0x0011
Part            = 0x0012
Mesh            = 0x0013
Arrays          = 0x0014
Material        = 0x0016
Layer           = 0x0017
Texture         = 0x0018
Motion          = 0x001b
FCurve          = 0x001c

CommandType

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

VertexFormat

POSITION        = 1 << 0
NORMAL          = 1 << 1
COLOR           = 1 << 3
TEXCOORD        = 1 << 5
WEIGHTn         = n << 8
INDICES         = 1 << 16

InterpType

CONSTANT        = 0x0000
LINEAR          = 0x0001
HERMITE         = 0x0002
CUBIC           = 0x0003
SPHERICAL       = 0x0004

ExtrapType

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

DrawMode

POINTS          = 0x0000
LINES           = 0x0001
LINE_STRIP      = 0x0002
TRIANGLES       = 0x0003
TRIANGLE_STRIP  = 0x0004
TRIANGLE_FAN    = 0x0005

RepeatMode

HOLD            = 0x0000
CYCLE           = 0x0001