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