ゼロから始めるBVE5(仮2)~ストラクチャを作る 2 (Bvets5向けに特化した.xファイルをメモ帳で作る)~

| コメント(1)

BVE4から使えるようになったx形式のストラクチャファイルですが、
このとき同時に光源の方向を設定する構文も登場しました。

この「光源の方向を設定する構文」はストラクチャの面に対し明暗をつける作用をしますが、
他の3Dを扱うソフトとは異なり影を作る機能までは有していません。
いわばBVE2まででマニュアルで行っていた太陽の当たる側に明るい面を、当たらない側には面をそれぞれ設定する作業を
BVE側で自動でやってくれる機能といってもいいかと思います。

BVE4が出た当時は便利な機能だなーと思ったものですが、いざこの機能を使って作ってみると問題が生じました。

問題が起きたのは国境の長いトンネルを有する上越国境。
どんな問題なのか見てみましょう。
k201.jpg
屋外では太陽光があたっていますが、トンネルに入ると当然ながら太陽光は差し込みません。
変わりにトンネル内を照らすのは前照灯。

この2つの光は当然ながら角度が違います。

しかしBVE4・Bvets5では光源の方向を設定できるのは路線ファイル中でただ1回のみ
トンネルに入る前の光源設定がトンネル内でも生きてしまい、不自然な描画になってしまいます。

これを解決する方法のひとつがBvets5から出てきたLight.Diffuse構文(平行光の色)の値を(0,0,0)に設定することです。
(0,0,0)に設定することで一切の明暗が自動で付くことがなくなり
面の明暗はテクスチャのみで表現されることになります。

ここでの例は日なたとトンネルですが、ビル陰に隠れる都市路線や、木々の間を縫うローカル線など
日なたと日陰が連続する路線でも同様に平行光を無効化したほうが扱いやすいかと思います。

さて、ここで.xファイルに関してですが、.xファイルの面の明暗は各面の法線ベクトル等の要素で決まります。
しかし面の明暗は先ほど平行光を無効にすることで付かなくなるようにしたいと書いたわけですから、
現行のBvets5においては.xファイル自体に面の明暗を設定する記述を書かなくても特に問題はないわけです。
(ただ完全に消し去ってしまうとエラーとなって正常に読み込めないので、テキトーな値を入れておく必要はあります)

テキスト形式の.xファイルをメモ帳等で開いてみれば分かりますが、.xファイルの中身は
頂点座標、面の張り方、面の色、透過率、テクスチャ名、テクスチャマッピングと面の明暗に関わる情報です。
つまりメモ帳で書く限りは、面の明暗に関わる情報を除けばcsvを書くのと同じ感じで手打ちすることが可能なのです。

では前置きはこのあたりにして実際にストラクチャを作ってみましょう。
今回のお題はコレ。速度制限標識です。
k202.jpg
テクスチャはこちら
limit25.png
【lim25.png】

まずは柱なしで標識の板だけで書いてみましょう。
従来のcsvの書き方だと



CreateMeshBuilder,
AddVertex,-2.4,2.2,-0.04,
AddVertex,-1.8,2.2,-0.04,
AddVertex,-1.8,1.7,-0.04,
AddVertex,-2.4,1.7,-0.04,
AddFace,0,1,2,3
GenerateNormals,

LoadTexture,limit25.bmp,
SetTextureCoordinates,0,0,0,
SetTextureCoordinates,1,1,0,
SetTextureCoordinates,2,1,0.78,
SetTextureCoordinates,3,0,0.78,
SetDecalTransparentColor,0,0,0,



書き方に個人差はあるにしても見慣れた文かと思います。
ではこれを.xの書き方でやってみましょう。


xof 0303txt 0032

Material limit25 {
1.0000;1.0000;1.0000; 1.0000;;
0.0000;
0.0000;0.0000;0.0000;;
0.0000;0.0000;0.0000;;
TextureFilename { "limit25.png"; }
}

Mesh{
4;
-2.4000; 2.2000;-0.0400;,
-1.8000; 2.2000;-0.0400;,
-1.8000; 1.7000;-0.0400;,
-2.4000; 1.7000;-0.0400;;
1;
4;0,1,2,3;;

MeshMaterialList {
1;
1;
0;
{ limit25 }
}

MeshTextureCoords {
4;
0.0000,0.0000;
1.0000,0.0000;
1.0000,1.0000;
0.0000,1.0000;
}
}



これをメモ帳に貼って.x形式で保存してビューワで見ると正常に表示されているはずです。
詳しく見てみましょう。


xof 0303txt 0032  ←ヘッダ

Material limit25 {  ←材質グループ「limit25」の設定をする宣言
1.0000;1.0000;1.0000; 1.0000;;  ←面の色(RGBの3色、255が100%=1)と不透過率(100%=1)
0.0000;  ←面の明暗に関する値なので適当な値を入力
0.0000;0.0000;0.0000;;  ←面の明暗に関する値なので適当な値を入力
0.0000;0.0000;0.0000;;  ←面の明暗に関する値なので適当な値を入力
TextureFilename { "limit25.png"; }  ←テクスチャファイル名
}

Mesh{  ←頂点を作る宣言
4;  ←作る頂点の総数
-2.4000; 2.2000;-0.0400;,  ←0番目の頂点座標
-1.8000; 2.2000;-0.0400;,  ←1番目の頂点座標
-1.8000; 1.7000;-0.0400;,  ←2番目の頂点座標
-2.4000; 1.7000;-0.0400;;  ←3番目の頂点座標
2;  ←作る面の総数
4;0,1,2,3;;  ←0番目の面の構成要素(面を構成する頂点数;面を構成する頂点の番数)・右回りの順

MeshMaterialList {  ←面ごとの材質グループを設定する宣言
1;  ←設定する材質グループの総数
1;  ←材質グループを設定する面の総数
0;  ←0番目の面に0番の材質グループを設定
{ limit25 }  ←0番の材質グループに「limit25」を設定
}

MeshTextureCoords {  ←テクスチャマッピングを設定する宣言
4;  ←頂点の総数
0.0000,0.0000;  ←0番目の頂点のテクスチャマッピングの座標
1.0000,0.0000;  ←1番目の頂点のテクスチャマッピングの座標
1.0000,1.0000;  ←2番目の頂点のテクスチャマッピングの座標
0.0000,1.0000;  ←3番目の頂点のテクスチャマッピングの座標
}
}



最初は行数も多くなっているので難しく感じてしまうかもしれませんが、何度か試しているうちに慣れてくるかと思います。
ただエラーに関しては非常にシビアで、1箇所でも誤りがあるとビューワが固まるので、
その場合は記述をよく見直して修正して下さい。

続いてこのファイルに柱を入れます。
従来のcsvだと



CreateMeshBuilder,
AddVertex,-2.4,2.2,-0.04,
AddVertex,-1.8,2.2,-0.04,
AddVertex,-1.8,1.7,-0.04,
AddVertex,-2.4,1.7,-0.04,
AddFace,0,1,2,3
GenerateNormals,

LoadTexture,limit25.bmp,
SetTextureCoordinates,0,0,0,
SetTextureCoordinates,1,1,0,
SetTextureCoordinates,2,1,0.78,
SetTextureCoordinates,3,0,0.78,
SetDecalTransparentColor,0,0,0,

;柱
CreateMeshBuilder,
AddVertex,-2.13,1.8,0,
AddVertex,-2.07,1.8,0,
AddVertex,-2.07,-1,0,
AddVertex,-2.13,-1,0,
AddVertex,-2.13,1.8,0.06,
AddVertex,-2.07,1.8,0.06,
AddVertex,-2.07,-1,0.06,
AddVertex,-2.13,-1,0.06,
AddFace,0,1,2,3,
AddFace,5,4,7,6,
AddFace,1,5,6,2,
AddFace,4,0,3,7,
SetColor,192,192,192,
GenerateNormals,



これの.x形式での書き方は2つあり、1つはコンバータで作成される全ブロック一纏めという書き方ですが、
たとえば上の構文で標識自体に面や頂点を追加すると後ろの柱のブロックまで
書き換えが必要となる場合もあるので不向きな場合が多いかと思います。


xof 0303txt 0032

Material limit25 {
1.0000;1.0000;1.0000; 1.0000;;
0.0000;
0.0000;0.0000;0.0000;;
0.0000;0.0000;0.0000;;
TextureFilename { "limit25.png"; }
}

Material pole {
0.7500;0.7500;0.7500; 1.0000;;
0.0000;
0.0000;0.0000;0.0000;;
0.0000;0.0000;0.0000;;
}

Mesh{
12;
-2.4000; 2.2000;-0.0400;,
-1.8000; 2.2000;-0.0400;,
-1.8000; 1.7000;-0.0400;,
-2.4000; 1.7000;-0.0400;,
-2.1300; 1.8000; 0.0000;,
-2.0700; 1.8000; 0.0000;,
-2.0700;-1.0000; 0.0000;,
-2.1300;-1.0000; 0.0000;,
-2.1300; 1.8000; 0.0600;,
-2.0700; 1.8000; 0.0600;,
-2.0700;-1.0000; 0.0600;,
-2.1300;-1.0000; 0.0600;;
5;
4;0,1,2,3;,
4;4,5,6,7;,
4;5,9,10,6;,
4;9,8,11,10;,
4;8,4,7,11;;

MeshMaterialList {
2;
5;
0,
1,
1,
1,
1;
{ limit25 }
{ pole }
}

MeshTextureCoords {
12;
0.0000,0.0000;
1.0000,0.0000;
1.0000,1.0000;
0.0000,1.0000;
0.0000,0.0000;
0.0000,0.0000;
0.0000,0.0000;
0.0000,0.0000;
0.0000,0.0000;
0.0000,0.0000;
0.0000,0.0000;
0.0000,0.0000;
}
}



もう1つの書き方、標識は標識ブロック、柱は柱ブロック、という風に分けて書いていくことにします。


xof 0303txt 0032

Material limit25 {
1.0000;1.0000;1.0000; 1.0000;;
0.0000;
0.0000;0.0000;0.0000;;
0.0000;0.0000;0.0000;;
TextureFilename { "limit25.png"; }
}

Material pole {
0.7500;0.7500;0.7500; 1.0000;;
0.0000;
0.0000;0.0000;0.0000;;
0.0000;0.0000;0.0000;;
}

Mesh{
4;
-2.4000; 2.2000;-0.0400;,
-1.8000; 2.2000;-0.0400;,
-1.8000; 1.7000;-0.0400;,
-2.4000; 1.7000;-0.0400;;
1;
4;0,1,2,3;;

MeshMaterialList {
1;
1;
0;
{ limit25 }
}

MeshTextureCoords {
4;
0.0000,0.0000;
1.0000,0.0000;
1.0000,1.0000;
0.0000,1.0000;
}

MeshNormals {
1;
0.0000;0.0000;-1.0000;;
1;
4;0,0,0,0;;
}
}

Mesh{
8;
-2.1300; 1.8000; 0.0000;,
-2.0700; 1.8000; 0.0000;,
-2.0700;-1.0000; 0.0000;,
-2.1300;-1.0000; 0.0000;,
-2.1300; 1.8000; 0.0600;,
-2.0700; 1.8000; 0.0600;,
-2.0700;-1.0000; 0.0600;,
-2.1300;-1.0000; 0.0600;;
4;
4;0,1,2,3;,
4;5,4,7,6;,
4;1,5,6,2;,
4;4,0,3,7;;

MeshMaterialList {
1;
4;
0,
0,
0,
0;
{ pole }
}
}


こちらの柱のブロックではテクスチャを使用していないのでMeshTextureCoordsを省略できます。

Materialのところの0.7500という数字は192÷255の近似値です。

数値は上で小数で書いているところは小数で書く必要があるようで、
整数で書くとエラーを返される場合があります。

csv形式では「;」を文頭にすることでコメント扱いにできましたが.x形式ではできないようです。
代わりにそれぞれのブロックごとに名前をつけることはできるようで、
Mesh{ の箇所を Mesh limit25{ や Mesh pole{ とすることができます。
k203.jpg

なお最後になりますが、ビューワとしてRock_Onさんのストラクチャビューワを使う場合は
View>Change render setting から Deffuse color を 0,0,0 に変更して確認して下さい。

今回の記事は以下のwebページを参考にしました。
ゲームプログラマーを目指すひと Xファイルを解析してみる
mikunanakusa/MMDExporter・GitHub

コメント(1)

まったく関係のない話のようで申し訳ないのですが、
BVEでは「腕木式信号機」
は再現できるのでしょうか?

一応、このページ見て、ストラクチャだけは作ったのですが・・・
  (投稿者: kimagure | 2013年04月30日 22:00)
-----------------------------------------------------
遮断桿の動作が再現できるので、腕木式信号機も再現可能かと思います
  (投稿者: k_40s2 | 2013年04月30日 22:08)
-----------------------------------------------------
ありがとうございます。
  (投稿者: kimagure207 | 2013年05月01日 23:05)

コメントする

カテゴリ

アーカイブ

Twitter

連絡先

  • E-mail

    • 迷惑メール振分け防止のため、件名に「BVE」を入れてください

最近のコメント