.mrbファイルについて

EMT.zip?で.mqo(メタセコイヤファイル)とある程度相互変換可能。

きれいに整形できるひと修正お願いしますm(_ _)m
綺麗じゃないけどとりあえず色々追加してコメント外してみた

ファイル構造は
ファイルヘッダ+{データヘッダ + ( or モデル or 動作データ)} * α

ファイルヘッダ

struct ファイルヘッダ
{
	char[4]	:"MRB" + char(0) 
	dword	:9			//わかんね9固定ぽ(バージョン?)
	dword	:データ数			//骨とモデルdataの合計数
}

データヘッダ

struct データヘッダ
{
	dword	:データタイプ		//1:Model 2:Bone 3:Anim 4:? 5:?
	char[32]:名前			//余った分は0で埋め。Boneは0で埋め
					// (attrのマテリアル指定に対応)
	dword	:データ長			//データヘッダ+データ長
	dword	:データ種別(BitFlag)	//{Bone :0x003}
		 (データの有無を表すフラグ	//{Anim :0x017,0x1F3,0x01FB}
					//{Model:0x0ff,0x13F,0x6BF0x73F,0x7FF,0x18FF,19FF,1FFF}
}

データ

全てのデータは

struct {
 dword データ個数;
 dword データサイズ;
}
struct {
 データサイズ分のデータ
} * データ個数

で構成されており。(例外として文字列など個数とサイズが曖昧な物はある)
データサイズ * データ個数が4(sizeof(dword))で割り切れなかった場合、その不足分は0x00で埋められ(構造体メンバのアライメント)
複数のデータがあった場合次のデータが続く。
データの有無はデータ種別により管理され

モデルデータ (データタイプ:0x01)

とりあえずどのモデルデータにも以下のデータは必ずある。

表内の値は1データのサイズ

データ種別頂点数面数法線数法線対応面数Uv組数uv対応面数
0x00010x00020x00040x00080x00100x0020
0x003ffloat[3]short[3]float[3]short[3]float[2]short[3]
{
	dword	:頂点数
	dword	:単位長	0x0C
	struct VERTEX{
		float	:x
		float	:y
		float	:z
	} * 頂点数
	dword	:面数(頂点対応数)
	dword	:単位長	0x06
	struct face{
		short[3]	:頂点Index
	} * 面数
	byte * (0 <= word区切りになる様に0x00で埋め < 4)
	dword	:法線数
	dword	:単位長 0x0C
	struct normal{
		float	:x
		float	:y
		float	:z
	}  * 法線数
	dword	:法線対応面数 面数に同じ
	dword	:単位長	0x06
	struct face{
		short[3]	:法線Index
	} * 面数
	byte * (0 <= word区切りになる様に0x00で埋め < 4)
	dword	:Uv組数
	dword	:単位長 0x08
	struct	uv{
		float	:u
		float	:v
	} * uv組数
	dword	:uv対応面数 面数に同じ
	dword	:単位長	0x06
	struct face{
		short[3]	:uvIndex
	} * 面数
	byte * (0 <= word区切りになる様に0x00で埋め < 4)

以下はデータ種別しだいで、有無がわかれるぽ

表内の値は1データのサイズ

データ種別頂点色左の対応面bone name骨の影響力アルファ値左の対応面
0x00400x00800x01000x02000x04000x08000x1000
0x00bfshort[3]
0x00ffbyte[4]short[3]
0x013fdword + float[3]
0x01ffbyte[4]short[3]dword + float[3]
0x06bfshort[3]charfloat[3] + dword + byte[4]
0x073fdword + float[3]charfloat[3] + dword + byte[4]
0x07ffbyte[4]short[3]dword + float[3]charfloat[3] + dword + byte[4]
0x18ffbyte[4]short[3]byteshort[3]
0x19ffbyte[4]short[3]dword + float[3]byteshort[3]
0x1fffbyte[4]short[3]dword + float[3]charfloat[3] + dword + byte[4]byteshort[3]
	//頂点色 (byte[4]) データ種別0x0040
	dword	:データ個数
	dword	:データ長	 0x04
	struct rgba{
		byte red;
		byte green;
		byte blue;
		byte alpha;//使用されてないかもしれない
	}
	//頂点色の対応面 (short[3]) データ種別0x0080
	dword	:データ個数 面数に同じ
	dword	:データ長	 0x06
	struct {
		short[3];			//上のデータのindex
	}
	//拡大率?ではなさそう (dword + float[3])データ種別0x0100
	dword	:データ個数		//必ず1固定ぽ
	dword	:データ長	 0x10
	struct tranceform?{
		dword	:面数に同じ
		float	:x倍率 //0.0〜1.0ぐらい範囲を取っており
		float	:y倍率 //x=y=zである?
		float	:z倍率 //拡大率だとすると0.0はおかしい
	} * データ個数
	//骨の名前(char: bone name)+データ種別0x0200
	dword	:骨名長
	dword	:骨名単位長 0x01
	char * 骨名長
	//骨でーたのやつと同じぽ
	//骨でーたとちがって、使わない骨の名前はないぽ
	byte * (0 <= word区切りになる様に0x00で埋め < 4)
	//上のとセット。骨の影響力(float[3] + dword + byte[4])データ種別0x0400
	dword	:頂点数 頂点数に同じ?
	dword	:単位長	0x14
	struct anchor{//ボーンの影響力
		float	:一本目	
		float	:二本目	//四本あわせて1(100%)になるぽ 正規化されてるね!
		float	:三本目	//
		float	:四本目	//
		byte	:骨名indexいち本目	//無いときはFFで埋め
		byte	:骨名indexに本目
		byte	:骨名indexさん本目
		byte	:骨名indexよん本目
	} * 頂点数
	//アルファ値 (byte) データ種別0x0800
	dword	:データ数 //一個の場合が多い(75%程のデータが
	dword	:単位長	0x01
	byte	:alpha //一個の場合 大抵FF
	//上のとセット (short[3]) データ種別0x1000
	dword	:データ数 面数に同じ
	dword	:単位長	0x06
	struct {
		short[3];			//上のデータのindex
	}
}

骨データ (データタイプ:0x02)

表内の値は1データのサイズ

データ種別骨リスト骨データ
0x00010x0002
0x003chardword + byte[4] + float[3] + float[4] + float[3]
{
	dword	:骨リスト長		//骨リスト長と単位長が逆転してる事もある
	dword	:骨リスト単位長		//↑のため1固定では無い。乗算すれば一緒だけど
	char[名前長 * 単位長]:骨リスト	//骨ファイル名が0x00で区切られている
	byte * (0 <= word区切りになる様に0x00で埋め < 4)
	dword	:骨データ数			//骨リストの骨名の個数と一緒
	dword	:骨データ単位長
	struct 骨データ{
		dword	:flag 		//子モデル用 0 or 1
						//1の場合、武器等 他のモデルがつく所
		byte	:骨No
		byte	:parentNo		//この骨がぶら下がってる骨No 
		byte	:childNo		//この骨にぶら下がってる骨No。
					//複数ある場合はchildNoのsiblingNoが次のぶら下がってる骨No
		byte	:siblingNo	//parentNoのこの骨と同じようにぶら下がってる骨No

	/*********************************************************/
	/******             flag == 0 の時                  ******/
		struct	vector{		//移動っぽい 骨の節
			float	:x
			float	:y
			float	:z	//左手座標系なので、メタセコで使うときは*(-1)
		}
		struct	quaternion{		//回転っぽい 四元数 クォータニオン
			float	:a0,a1,a2,a3;	//(回転*拡大率で移動ベクトルと同じ傾きに)
		}
		struct	vector{	//拡大率っぽい
			float	:x		// 大体ほぼ+1.0で たまに-1.0とか 0.8とか
			float	:y		// 大体 x=y=z effectのmrbは違ったりする
			float	:z		// effectの場合 最大で10まで行ってたりする

	/*********************************************************/
	/******             flag == 1 の時                  ******/
		struct	vector;		//移動ベクトル*回転クォータニオン+この骨の親骨の座標=子モデルの座標
		struct	quaternion;	//
		struct	vector;		//この骨の先に付くモデルの拡大率
	} * 骨数
}

モーションデータ (データタイプ:0x03)

//この部位は、未検証すべて推測
もーしょん データタイプ:0x02 データ種別:0x0030,0x017,0x1F3,0x01FB
骨名KeyFrame???effect関係?vector?quaternion?vector?Key関係
0x00010x00020x00040x00080x00100x00200x00400x00800x0100
0x0017
0x01EB
0x01F3
0x01FB
{
	dword	:骨名長
	dword	:骨名単位長
	char * 骨名長	:0区切り
	byte * (0 <= word区切りになる様に0x00で埋め < 4)
	//キーフレーム
	dword	:キーフレーム数
	dword	:単位長 0x04
	dword[キーフレーム数]	time;// 1/1000秒単位
	//行列キー?(local座標キーかな? 1026_00_353,1026_00_354,3004_00_112にのみ存在。
	dword   :不明データ数(=骨数
	dword   :単位長 0x1c * キーフレ数
	struct {
		struct {
			vector3{		//位置から考えて移動?
				float x;
				float y;
				float z;
			}
		 	quaternion{	//回転な気がする
				float	:x
		 		float	:y
				float	:z
				float	:w
			}
	 	} * キーフレ数
	} * 骨数
	//effect関係
	dword   :effect数
	dword   :単位長 0x44
	struct {
		DWORD frame;	//恐らくフレームタイム。このタイムになったら実行
		char str[0x40];	//使用されているのは最初の文字列データのみ。他は保存時のメモリデータ。
				//カンマ(,)で区切られてる事あり。
				//"SE %d" サウンド再生
				//"EFF %d" エフェクト表示
				//"DELEFF" 不明。エフェクト非表示?
				//"HIT"  攻撃SE&EFF再生(MISS等で変化)
				//"REF"  不明。
	} * 数
	//不明?
	dword	:不明	何かの数 1固定
 	dword	:不明	何かの単位長 0x04
 	dword[何かの数]	:不明 //100とか200とか300
	//移動キー ベクトル 其の壱
	dword	:ベクトル数
	dword	:単位長	0x0C
	struct vector3{
		float	:x
		float	:y
		float	:z
	} * ベクトル数
	//回転キー クオータニオンと思われ
	dword	:クオータニオン数
	dword	:単位長 0x10
	struct quaternion{
		float	:x
		float	:y
		float	:z
		float	:w
	}
	//拡大縮小キー ベクトルと思われ 其の弐
	dword	:ベクトル数
	dword	:単位長	0x0C
	struct vector3{
		float	:x
		float	:y
		float	:z
	} * ベクトル数
	dword	:骨数
	dword	:単位長 キーフレ数*6 キーフレの数で変わるみたい
	struct bone{
		struct keyframe{
			short	:移動KeyIndex
			short	:回転KeyIndex
			short	:拡大KeyIndex
		} * キーフレ数 
	}* 骨数
	byte * (0 <= word区切りになる様に0x00で埋め < 4)
}

タイプ4のデータ

タイプ4のデータは、二種類のデータで構成されている。 
基本的にMonster,家具,MapObjに存在しているが、草や飛空挺の土台には無かったりする。 

存在しないモデルは当たり判定の無さそうな物ばかりなので、当たり判定に使用されるデータだと思われる

*追記
 その後の調べにより、クリック時のターゲティングや家具配置等に使用される事が判明
一つめは座標二つ分のデータで構成されている。
二点を結んだ線を対角線とした立方体を表示させると当たり判定に使いそうなデータに見えた。
 
二つのデータは座標二つ分+ベクトル三つ分という変わった組み合わせ。 
座標の一つめは一つめのデータの中心位置っぽい? 
座標の二つめはベクトルを掛けるとそれぞれ縦,横,奥行きの長さになるような気もする…けどなんか微妙。
当たり判定用データ1?当たり判定用データ2
0x00010x0002
0x0003
	dword	:当たり判定用データ?1個数
	dword	:当たり判定用データ?1単位長(0x18)
	struct 当たり判定用データ1{
		struct VERTEX{
			float	x,y,z;
		} * 2
	} * 当たり判定用データ?1個数
	

	dword	:当たり判定用データ2?個数
	dword	:当たり判定用データ2?単位長(0x3C)
	struct 当たり判定用データ2{
		struct VERTEX{		//当たり判定用データ1の中心位置っぽい?
			float	x,y,z
		}
		struct VERTEX{		//不明
			float	x,y,z
		}
		struct 不明データ{		// -1.0 0.0 +1.0とか入ってる
			float	:a
			float	:b
			float	:c
		} * 3
	} * データ個数


参考画像:ワイヤーフレームで表示されている線が タイプ4の一つめのデータ
&ref(): File not found: "eco167.jpg" at page "Spec/mrb";

タイプ5のデータ

  • 主に視点解除マップにのみ入っている
    • 視点開放マップでも小さくて構造が簡単なもの(光の塔の各フロア)には入っていない。
    • 小さなマップでも遺跡のL字型のマップや十字型のマップ等には丁寧に配置されている。
キャラクターが壁に隠れて見えなくなってしまわないために、
視線とこのデータ面が交差した時にカメラ位置を調整させるための物では無いかと思われる
視点判定用面?
0x0001
0x0001
	dword	:視点判定用面個数?
	dword	:視点判定用面単位長?(0x30)
	struct 視点判定用面{		//座標四個。面
		struct VERTEX{
			float	:x
			float	:y
			float	:z
		} * 4
	} * データ個数


参考画像:カラフルな板状の物がタイプ5のデータ
&ref(): File not found: "eco166.jpg" at page "Spec/mrb";

comment

  • hi, there's some way to translate these articles to english? it would help so much. Anyway thanks for the documentation. -- 2009-08-10 (月) 09:18:11
  • use translation site -- 2009-08-16 (日) 17:44:36
  • how to import the MRB file for 3DMAX ? -- 2009-10-05 (月) 22:25:07
  • cant. -- 2009-10-06 (火) 19:18:32
  • and How to convert ECO-MRB file to MQO file formats -- 2009-10-07 (水) 15:36:43
  • Please use EMT(Eco Model Translator) for conversion. But, EMT is incomplete. So the convert is inaccurate. -- 2009-10-07 (水) 22:11:29
  • •how to import the MRB file for 3DMAX -- 2011-08-22 (月) 16:12:02
  • •how to import the MRB file for 3DMAX -- 2011-08-22 (月) 17:08:12
  • How can I open EcoModelTranslator on window7 64 bit -- 2011-08-30 (火) 01:11:58
  • How can I open EcoModelTranslator on window7 64 bit -- 2011-08-30 (火) 01:13:47
  • How can I open EcoModelTranslator on window7 64 bit -- 2011-08-30 (火) 01:14:24


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-06-15 (土) 20:33:15 (1708d)