|
|
2008/8/19(Tue) 13:50:42|NO.18446
注意事項
Q. xファイルって何ですか?
A. お前に必要無い物だ。
hgimg3なんかを使っていると、「モデラでデータ作るより、自分で自動生成したマップとか使いたいよな。」
とか思ったりする事もあるであろう。うむ、うむ。その気持ちよく分かる。よぉーく分かるぞ。
俺もそう思ったしな。
そこで、俺はxファイルについて調べてみた。
以下はその記録である。
参考にしたのはここだ。
http://sora.cc.nagoya-u.ac.jp/t4369/fortran/DirectX/Xfile.htm
ここの記述とDirectX9の日本語マニュアルを読んだ上で書いているので、
ここに書いた以上の事が知りたければ、そっちをみれば良い。
○最低限記述する必要があるデータ
まず、xファイルに最低限必要なものは、結構少ない。
・ヘッダ
・Mesh テンプレート
だけだ。
○ヘッダについて
ヘッダは、ぶっちゃけ、ファイル先頭に
xof 0302txt 0064
とだけ書いときゃいい。
DirectX9の日本語マニュアルによれば
xof 0303txt 0064
になっているが、取りあえずどっちでも動作した。
○Meshテンプレートについて
Meshという「テンプレート」が、実際の品物の形を記述する部分にあたる。
ルールは簡単だ。
[登録する座標の数];
[X座標];[Y座標];[Z座標];,
(注意:最終行は [X座標];[Y座標];[Z座標];;)
[登録するポリゴンの数];
[ポリゴンの頂点数];[頂点1],[頂点2],[頂点3];,
(注意:最終行は [ポリゴンの頂点数];[頂点1],[頂点2],[頂点3];;)
これを数字で書きまくって、最後に{}で囲むだけだ。
|
|
2008/8/19(Tue) 13:51:06|NO.18447
○サンプル
試しに、四角を作ってみる。
----------ここから----------
xof 0303txt 0064
Mesh Shikaku {
4; // 4個の点を登録
-10.000000; 10.000000;0.00000;, // 左上の点 点番号 0番
10.000000; 10.000000;0.00000;, // 右上の点 点番号 1番
10.000000;-10.000000;0.00000;, // 右下の点 点番号 2番
-10.000000;-10.000000;0.00000;; // 左下の点 点番号 3番(最終)
2; // 2枚のポリゴンを登録
3;0,3,1;, // 3点のポリゴン で、点番号 0、2、1の順に囲む場所 ポリゴン番号 0番
3;1,3,2;; // 3点のポリゴン で、点番号 0、4、2の順に囲む場所 ポリゴン番号 1番
}
----------ここまで----------
これだけでいい。
実際のHSPでの表示はとりあえずこれで。
上の内容を「test.x」として保存したあと、同じフォルダに以下のスクリプトを
保存して実行して欲しい。
#include "hgimg3.as"
hgini
// オブジェクト配置
addxfile model , "test.x"
regobj object , model
setpos object , 0.0,0.0,0.0
// カメラ設定
setdir HGOBJ_CAMERA , 0.0, 0.0, 0.0
setpos HGOBJ_CAMERA , 0.0, 0.0, 100.0
cammode CAM_MODE_LOOKAT
// 描画ループ
*lp
hgdraw
hgsync 10
await 0
goto *lp
|
|
2008/8/19(Tue) 13:51:26|NO.18448
○順に解説
xof 0303txt 0064
まず、ここだ。
ここはもう、あれだ。手紙を書く時の「拝啓」位の意味で覚えとけ。
試しに抜いてみたらエラーが出た。必須らしい。本当に必須かどうかは知らん。
気になるならDirectXのマニュアル読め。
Mesh Shikaku {
Meshテンプレートだ。なんか知らんが、xファイルはこーゆーひとかたまりを「テンプレート」と呼ぶ慣わしらしい。
マイクロソフトじゃあ曾爺さんの代からそう呼ぶって決まってんだよ!!てやんでい!!
とりあえず、Meshテンプレートを「Shikaku」と言う名前で宣言しているところだ。
名前は、全角文字は使わない方が良いらしい。少なくとも、全角文字を使うと読め無い事が多いのは経験で知ってる。
理由は知らん。対応してないんだろう。
4; // 4個の点を登録
-10.000000; 10.000000;0.00000;, // 左上の点 点番号 0番
10.000000; 10.000000;0.00000;, // 右上の点 点番号 1番
10.000000;-10.000000;0.00000;, // 右下の点 点番号 2番
-10.000000;-10.000000;0.00000;; // 左下の点 点番号 3番(最終)
四角の形を決める座標の登録だ。
最初に、登録する点数を書いて、後は登録する数だけx,y,zの順番に並んでいるので、特に言う事も無いだろう。
0-----1
| |
| | 0:( -10.0 , 10.0 ) 1:( 10.0 , 10.0 )
| |
| | 3:( -10.0 , -10.0 ) 2:( 10.0 , -10.0 )
| |
3-----2
絵にするとこんな感じの配置だ
2; // 2枚のポリゴンを登録
3;0,3,1;, // 3点のポリゴン で、点番号 0、2、1の順に囲む場所 ポリゴン番号 0番
3;1,3,2;; // 3点のポリゴン で、点番号 0、4、2の順に囲む場所 ポリゴン番号 1番(最終)
ここで、上で登録した点番号を繋いで、板を作る。
DirectXでは三角と四角のポリゴンが使えるが、三角単位で作った方が、予想外の歪みもなくていいだろう。
最初に登録するポリゴン数を書いて、次にポリゴンにする点を結ぶ設定を書けばいいのは、点の登録と同じだ。
気をつけなければ成らないのは、「ポリゴンを作る時に選ぶ点の順番」だ。
ポリゴンには「表裏」がある。裏になったポリゴンは表示されない。表裏を判断するのが、この点を繋ぐ順番だ。
上の例では、三角形の形を、「逆時計周り」になる順番で結んだ。
0-----1
| /|
| 0 / | ポリゴン0: 0 -> 3 -> 1
| / | ポリゴン1: 1 -> 3 -> 2
| / 1 |
|/ |
3-----2
この向きで繋ぐと、「表」扱いになり、実際に表示される。
表示する時、ポリゴンが裏返っていれば、表示時の座標配置が時計回り方向に見える為に、判別が付くのだ。
・・・が、多分、座標系とか見るのに基準にする方向とかによって「時計回り」か「逆時計回り」かが
変わるので、自分で実際に確認するように。
}
最後に、Meshテンプレートを閉じる。
これで完了だ。
基本的に、物体形状を設定するのは、これだけだ。
もっと大きな形を作りたければ、使う点数とポリゴンの数を増やせばいい。
| |
|
2008/8/19(Tue) 13:51:44|NO.18449
○注意事項
上記は、必要最低限の物だ。
必要最小限なので、色々な物がが足りない。よって表示も貧弱だ。
具体的には
・色が付かない。
・もちろんテクスチャもネェ。
・というか、「法線」が入ってないので、どこが境目なのかも分からん。
まあ、「法線」に関しては、HGIMG3の方で、読み込み時に自動で再計算してくれるモードもあるらしいので、よしとする。
色やテクスチャは、また気が向いた時に書いたりするかもしれない。
HSPコンテスト2008開催で、皆色々遊んでいる事と思うが、3Dゲームを作る際の参考になれば良いかもしれん。
|
|
2008/8/19(Tue) 18:04:11|NO.18454
○ポリゴンに色をつける
さて、ポリゴンに色を付けてみようと思う。
手順はこうだ。
・Materialテンプレートで、色の定義をする。
・Meshテンプレート内に、MeshMaterialListテンプレートと、MeshNormalsテンプレートを入れる
以上。
|
|
2008/8/19(Tue) 18:04:25|NO.18455
○Materialテンプレートについて
これは「色の情報」を定義するテンプレートで、ここで登録した「色」が、今後使えるようになる。
書き方は
Material 名前 {
[赤の強さ];[緑の強さ];[青の強さ];;
[パワー];
[スペキュラ色赤の強さ];[スペキュラ色緑の強さ];[スペキュラ色青の強さ];;
[エミッシブ色赤の強さ];[エミッシブ色緑の強さ];[エミッシブ色青の強さ];;
}
だ。
数字は全て「0.0〜1.0」の範囲で指定する。0.0が最小で1.0が最大だ。
パワーが何の事か分からん。というか、スペキュラとかエミッシブとかも、何の事か分からん。
誰か教えてくれ。
|
|
2008/8/19(Tue) 18:04:42|NO.18456
○MeshMaterialListテンプレートについて
Meshmaterialテンプレートは、Meshテンプレートの中に書き加える。
座標データとポリゴンデータを書いた後に書けば良い。
書き方は、
MeshMaterialList {
[使用する色の数];
[ポリゴン総数];
[0番ポリゴンに割り当てる色番号];
[1番ポリゴンに割り当てる色番号];
|
|
|
[最後のポリゴンに割り当てる色番号];; // <-最後には「;」が一個多い
{0番の色番号の名前}
|
|
|
{最後の色番号の名前}
}
になる。
|
|
2008/8/19(Tue) 18:05:01|NO.18457
○MeshNormalsテンプレートについて
MeshNormalsは、ポリゴン各頂点の「法線」を定義するテンプレートだ。
法線とは何か?これを説明するのが面倒だ。なので、最初は色について話をしなかった。
ぶっちゃけて言うと「その点が向いている方向」だ。
ポリゴンの各頂点はこの向きによって、「照明の当たり具合」を計算している。
たとえば、こんな座標配置がある。
1 ->
/|
/ |
0->| ^ ^
| | | |
| 2-> 5_______4
| / ^ / ^ /
|/ |/ |/
3-> 4-------5
面0,1,2,3と、面4,5,6,7は、見た目にも分かるように向きが違う。ので、当然、照明の当たり具合が変わる。
つまり、この二つの面は、同じ色に設定していても、明るさが変わって見えないといけない。
法線は、この向きを指定するものだ。
そんなもん、見たら一発で方向わかるやんか。なんで態々1点づつ指定せにゃならんのか?
それはこんな場合の為である。
1->
/|
/ |
0->| . ^
| |/ |
| 2_______4
| / ^ /
|/ |/
3-------5
座標0,1は、真右を向いている。その付近は、右を向いている明るさになる。
座標4,5は、真上を向いている。その付近は、上を向いている明るさになる。
この時、座標2,3が、斜めに「右上」を向いていたら、座標3,2の辺りは、
「ここは斜め右上」を向いている、という程度の明るさになるのだ。
そして、その間の色は徐々に変化し、如何にも「丸く形が変化している」様に見えるのである。
ゲームで表示されているキャラクタが、大昔の「初代バーチャファイター」のようにポリポリしていないのは、
実はこの法線が、座標毎にその点の向きを決めていたからなのだ。
さて、そこで、説明に困った事態が発生する。ようするに「ベクトル」が分からん事にはどうにもならんのだわ。
とりあえずだな。
3点の座標から、その3点が作る法線(ベクトル)を求める公式だけ書いておく。
Vx = ((y2 - y1) * (z3 - z1)) - ((y3 - y1) * (z2 - z1))
Vy = ((z2 - z1) * (x3 - x1)) - ((z3 - z1) * (x2 - x1))
Vz = ((x2 - x1) * (y3 - y1)) - ((x3 - x1) * (y2 - y1))
あとは自力で何とかしろ。
MeshNormalsの書き方だが、
MeshNormals {
[法線の数];
[法線のX方向];[法線のY方向];[法線のY方向];,
(注意:最終行は [法線のX方向];[法線のY方向];[法線のY方向];;)
[ポリゴンの数];
[ポリゴン0番の頂点数];[頂点1の法線番号],[頂点2の法線番号],[頂点3法線番号];,
(注意:最終行は [ポリゴン0番の頂点数];[頂点1の法線番号],[頂点2の法線番号],[頂点3法線番号];;)
}
になる。
これも、Meshテンプレートの中に書く必要が有る。
| |
|
2008/8/19(Tue) 18:05:23|NO.18458
○サンプル
取りあえず、最初に表示した四角に、色を付けてみる。
見えていた四角形は、実は3角形2つの合体画像だった事は、ちゃんと内容見てれば分かると思う。
そこで、ポリゴン0のほうを赤に、1の方を青にしてみる。
xof 0303txt 0064
Material Aka {
1.000000;0.000000;0.000000;;
1.000000;
0.000000;0.000000;0.000000;;
0.000000;0.000000;0.000000;;
}
Material Ao {
0.000000;0.000000;1.000000;;
1.000000;
0.000000;0.000000;0.000000;;
0.000000;0.000000;0.000000;;
}
Mesh Shikaku {
4; // 4個の点を登録
-10.000000; 10.000000;0.00000;, // 左上の点 点番号 0番
10.000000; 10.000000;0.00000;, // 右上の点 点番号 1番
10.000000;-10.000000;0.00000;, // 右下の点 点番号 2番
-10.000000;-10.000000;0.00000;; // 左下の点 点番号 3番(最終)
2; // 2枚のポリゴンを登録
3;0,3,1;, // 3点のポリゴン で、点番号 0、2、1の順に囲む場所 ポリゴン番号 0番
3;1,3,2;; // 3点のポリゴン で、点番号 0、4、2の順に囲む場所 ポリゴン番号 1番
MeshMaterialList {
2;
2;
0;
1;
{Aka}
{Ao}
}
MeshNormals {
1;
0.000000; 0.000000; 1.000000;;
2;
3;0,0,0;,
3;0,0,0;;
}
}
法線は、Z軸でプラスの方向にしてある。
サンプルソフトの位置からなら、真正面から向き合う方向だ。
|
|
2008/8/19(Tue) 18:30:19|NO.18459
うぉ、お久しぶりですねww
ってか、Xファイルを解折しようとする根気がすごいです。
|
|
2008/8/20(Wed) 08:39:57|NO.18473
お久しぶりで御座います。現在、別言語に絶賛浮気中であります。
xファイルはアニメをさせようとしなければ簡単なんだが、
HSPでゲームを作ろうとする者は敷居を高く感じる所が有るようなので敢えてやってみた。
とは言え、俺にしても幾つかのサイトとDirectXのマニュアル流し読んだだけで、
極めている訳でもないので平気で嘘を含んでいる可能性がある事だけは知った上で利用してもらいたく。
では、
○テクスチャを貼ってみる
法線の設定が出来てしまえば、テクスチャを貼るのはとても簡単だ。
・Materialテンプレートに、TextureFilenameテンプレートを加える
・Meshテンプレートに、MeshTextureCoordsテンプレートを加える
以上。
|
|
2008/8/20(Wed) 08:40:15|NO.18474
○TextureFilenameテンプレートについて
これはMaterialに「ファイル名」を入れることで、そのマテリアルにテクスチャ画像が有る事を
指定するものだ。
Materialテンプレート内に
TextureFilename { "(ファイルネーム)"; }
を追加してやれば良い。
ファイルネームについては、幾つか注意点が有る。
・日本語は駄目。
・フォルダを指定する時は「\」の記号を、HSPスクリプトエディタのように「\\」と書く。
それと、もう一件。
実は、Materialの方で「色」を指定すると、画像もその色になる。
テクスチャを貼りたい時は、色の指定を「白」になるようにしておくと良いが、
いっそ色を付けたいというなら好きに指定すれば良い。
|
|
2008/8/20(Wed) 08:40:59|NO.18475
○MeshTextureCoordsテンプレートについて
既に設定している頂点位置に、UV座標を設定する。
UV座標とは何か?
テクスチャ画像の座標を言う時は「XY座標」と言う表現を「UV座標」と言い換える慣わしだ。
めんどうくさいが、普通にxy座標xy座標と連呼していたら、頂点の実際の位置の事なのかテクスチャの事なのか
区別が付かなくなるので態々言い換えるらしい。
XファイルのUV座標は、最小0.0、最大1.0だ。いや、それより低い数字も大きい数字も指定できるが。
たとえば、小さい画像と大きい画像があるとする。
128*128
+----------------+
| |
64*64 | |
+--------+ | |
| | | |
| | | |
| | | |
+--------+ +----------------+
この2枚の画像は、大きさが違うだけで、絵の内容は同じだとしよう。
これを、その座標のまま表現したとする。
四角いポリゴンに、この画像を丸ごと貼り付けるとすると、座標指定は
小さい方の画像は、左上座標(0,0)、右上座標( 64,0)、右下座標( 64, 64)、左下画像(0, 64)となる。
大きい方の画像は、左上座標(0,0)、右上座標(128,0)、右下座標(128,128)、左下画像(0,128)となる。
となる。
すると何がどうなるのか?
テクスチャの絵の大きさが変わると、座標を全て設定しなおしになってしまうのだ。
そこで、
「大きさはもうどうでもいい!左上は(0.0,0.0)、右上は(1.0,0.0)、
右下は(1.0,1.0)、左下は(0.0,1.0)に決めて、割合で座標を表してしまえ!」
と考える。
そうすれば
小さい方の画像は、左上座標(0.0,0.0)、右上座標(1.0,0.0)、右下座標(1.0,1.0)、左下画像(0.0,1.0)となる。
大きい方の画像も、左上座標(0.0,0.0)、右上座標(1.0,0.0)、右下座標(1.0,1.0)、左下画像(0.0,1.0)となる。
大きさが変わっても、UV座標は同じまま使えるのである。
書き方はこうだ。
MeshTextureCoords {
[登録した座標の数];
[座標番号0に対するU座標];[座標番号0に対するV座標];
[座標番号0に対するU座標];[座標番号0に対するV座標];
|
|
(注意:最終行は [座標番号(最後)に対するU座標];[座標番号(最後)に対するV座標];;)
}
| |
|
2008/8/20(Wed) 08:41:19|NO.18476
○サンプル
では実際に貼ってみる。
前回はポリゴン0,1に色分けしたが、今回はポリゴン0の方にだけ、画像を貼る設定にしてみる。
使う画像は、サンプルの画像だ。
この位置は俺のインストール先だが、必要に応じて修正してくれ。
xof 0303txt 0064
Material Aka {
1.000000;1.000000;1.000000;;
1.000000;
0.000000;0.000000;0.000000;;
0.000000;0.000000;0.000000;;
TextureFilename { "C:\\hsp\\sample\\game\\face.bmp"; }
}
Material Ao {
0.000000;0.000000;1.000000;;
1.000000;
0.000000;0.000000;0.000000;;
0.000000;0.000000;0.000000;;
}
Mesh Shikaku {
4; // 4個の点を登録
-10.000000; 10.000000;0.00000;, // 左上の点 点番号 0番
10.000000; 10.000000;0.00000;, // 右上の点 点番号 1番
10.000000;-10.000000;0.00000;, // 右下の点 点番号 2番
-10.000000;-10.000000;0.00000;; // 左下の点 点番号 3番(最終)
2; // 2枚のポリゴンを登録
3;0,3,1;, // 3点のポリゴン で、点番号 0、3、1の順に囲む場所 ポリゴン番号 0番
3;1,3,2;; // 3点のポリゴン で、点番号 1、3、2の順に囲む場所 ポリゴン番号 1番
MeshMaterialList {
2;
2;
0;
1;
{Aka}
{Ao}
}
MeshNormals {
1;
0.000000; 0.000000; 1.000000;,
2;
3;0,0,0;,
3;0,0,0;;
}
MeshTextureCoords {
4;
0.000000;0.000000;
1.000000;0.000000;
1.000000;1.000000;
0.000000;1.000000;;
}
}
|
|
2008/8/20(Wed) 08:46:38|NO.18477
これで、当面、xファイルでデータを作る上で、実用最低限は書けたと思う。
形が作れて色が付けれてテクスチャ貼れたら、十分だろう?
夏休みも後半だが、今からでもHSPのコンテスト2008には間に合うかもしれん。
まあ、「しれん」とか言ってる奴では間に合う気はしないが。
ゲーム作りの参考にでもなったら、便利な仕組みのファイルを作ってくれた
マイクロソフトと、それを手軽に使えるようにしてくれたおにたまに感謝して
崇拝して寝ろ。
|
|
2008/8/20(Wed) 21:12:23|NO.18540
で?
|
|
2008/8/20(Wed) 21:49:08|NO.18545
(笑
|
|
2008/9/24(Wed) 00:39:23|NO.19712
xファイルの話だけでは寂しいので、実際にHSPでxファイルを作らせて見る。
配列変数mapの1の所にポリゴンが出来る。
表示は上の方にある簡単なビュアか、適当に自作したソフトで見てくれ。
// X File Make sample
dim point, (10*10*4),2 : dim polygon , (10*10*2),3 : sdim map ,11,10
sdim data , 32000 : notesel data : point_counter = 0 : polygon_counter = 0
map( 0)="0000000000"
map( 1)="0100000000"
map( 2)="0100000000"
map( 3)="0100000000"
map( 4)="0100000000"
map( 5)="0100000000"
map( 6)="0100000000"
map( 7)="0111111110"
map( 8)="0000000010"
map( 9)="0000000000"
// DataMake
for y,0,10
for x,0,10
if strmid(map(y),x,1)="1" {
// 四角形の4点の座標指定用変数
p1 = point_counter
p2 = point_counter + 1
p3 = point_counter + 2
p4 = point_counter + 3
point_counter += 4
point(p1 , 0) = x : point(p1 , 1) = y // 左上(基点)
point(p2 , 0) = x + 1 : point(p2 , 1) = y // 右上
point(p3 , 0) = x + 1 : point(p3 , 1) = y + 1 // 右下
point(p4 , 0) = x : point(p4 , 1) = y + 1 // 左下
// 四角形の2枚のポリゴン指定用変数
pl1 = polygon_counter
pl2 = polygon_counter + 1
polygon_counter += 2
polygon( pl1 , 0) = p1 : polygon( pl1 , 1) = p2 : polygon( pl1 , 2) = p3
polygon( pl2 , 0) = p1 : polygon( pl2 , 1) = p3 : polygon( pl2 , 2) = p4
}
next
next
//----------------------------------------------------------------------------
// X File Header
noteadd "xof 0302txt 0064"
noteadd ""
// X File Mesh Template
noteadd "Mesh {"
noteadd "" + point_counter + ";"
// 座標
for i,0,point_counter
string = "" + double(point(i,0)) + ";" + double(point(i,1)) + ";0.000000;"
if i < point_counter-1 { string += "," }
else { string += ";" }
noteadd string
next
noteadd ""
// ポリゴン結線
noteadd "" + polygon_counter + ";"
for i , 0 , polygon_counter
string = "3;" + polygon(i,0) + "," + polygon(i,1) + "," + polygon(i,2) + ";"
if i < polygon_counter - 1 { string += "," }
else { string += ";" }
noteadd string
next
noteadd ""
// X File Footer
noteadd "}"
// X File write
notesave "test.x"
end
| |
|
2008/9/24(Wed) 00:50:05|NO.19713
お久しぶりです。
根性に感服しました。
個人的には浮気先の言語が知りたかったりします。
久々にIRCの方にも顔出してもらえたら〜 とか思ってます(笑
それでは、3D疎いbegriffでした。
|
|
2008/9/24(Wed) 08:03:45|NO.19715
HSPを始めたばかりの俺には さっぱり分からない話だったけど、
結局、「ダンジョン生成ソース」は どこに在るの?
|
|
2008/9/24(Wed) 08:11:24|NO.19717
バグ野郎!!
欲しい物は全てスクリプトエディタに埋まっているんだYO!!
掘り出せるかどうかは、当人の根性次第だな。
|
|