5.複雑なメッシュの描画


『立体の描画』

ここまでで、簡単な三角形を一つ表示するところまで出来ました。次はもう一歩進めて立方体(箱)を描画してみましょう。とは言ってもこれまでにやった三角形の描画をベースに、三角形の数を増やしただけのことなので、全然難しくはありません。



立方体は、上下左右前後の6面の平面を持つ箱であり、その面それぞれは三角形を2枚組み合わせた四角形です。なので、6面×2枚(1面に付き)=12枚の三角形を組み合わせで立方体を構成できます。



三角形の準備には、G3@VERTEXADD関数を3個とG3@FACEADD3関数を1個を使っています。単純に考えると三角形を12枚組み合わせるので、G3@VERTEXADD関数を36個とG3@FACEADD3関数を12個が必要となります。これをそのままプログラムしてもいいのですが、ここで簡単なテクニックを使います。単純に12枚の三角形を組み合わせると、36個の頂点を必要となります。しかし、三角形の頂点の多くは同じ座標で重なる事がわかります。



立方体の場合最小で8つの頂点があれば良い事になります。G3@VERTEXADD関数で定義した頂点は同一のメッシュ内であれば複数のフェースで共有できるので、頂点を共有化し頂点を減らします。頂点が減ることで演算量を減らす事が出来るので、処理速度の向上に貢献します。



以下に立方体のプログラムを示します。三角形描画のプログラム時と比べて異なる点があります。それは、以前はG3@VERTEXADD関数の戻り値(頂点の番号)をG3@FACEADD3の引数に引き渡していましたが、今回はそれがありません。これは同一メッシュでG3@VERTEXADD関数を実行した場合、頂点の番号は0から0,1,2,3・・・と昇順に割り当てられるという法則を利用し、G3@FACEADD3関数にはその法則にもとついた値を指定しているのです。

CH = G@SETUP( 640 , 480 , 16 , 1 )
MS = G3@MESHMAKE()
G3@VERTEXADD(MS, 1.0, 1.0, 2.0) //頂点0登録
G3@VERTEXADD(MS,-1.0, 1.0, 2.0) //頂点1登録
G3@VERTEXADD(MS,-1.0, 1.0, 4.0) //頂点2登録
G3@VERTEXADD(MS, 1.0, 1.0, 4.0) //頂点3登録
G3@VERTEXADD(MS, 1.0,-1.0, 2.0) //頂点4登録
G3@VERTEXADD(MS,-1.0,-1.0, 2.0) //頂点5登録
G3@VERTEXADD(MS,-1.0,-1.0, 4.0) //頂点6登録
G3@VERTEXADD(MS, 1.0,-1.0, 4.0) //頂点7登録
G3@FACEADD3(MS,0,1,2) //頂点0、1、2を持つ3角形を登録
G3@FACEADD3(MS,0,2,3) //頂点0、2、3を持つ3角形を登録
G3@FACEADD3(MS,0,4,5) //頂点0、4、5を持つ3角形を登録
G3@FACEADD3(MS,0,5,1) //頂点0、5、1を持つ3角形を登録
G3@FACEADD3(MS,1,5,6) //頂点1、5、6を持つ3角形を登録
G3@FACEADD3(MS,1,6,2) //頂点1、6、2を持つ3角形を登録
G3@FACEADD3(MS,2,6,7) //頂点2、6、7を持つ3角形を登録
G3@FACEADD3(MS,2,7,3) //頂点2、7、3を持つ3角形を登録
G3@FACEADD3(MS,3,7,4) //頂点3、7、4を持つ3角形を登録
G3@FACEADD3(MS,3,4,0) //頂点3、4、0を持つ3角形を登録
G3@FACEADD3(MS,4,7,6) //頂点4、7、6を持つ3角形を登録
G3@FACEADD3(MS,4,6,5) //頂点4、6、5を持つ3角形を登録
G3@ADD( MS , 0 )
G3@FRMSETAMBIENT( FM , 65535 , 65535 , 65535 )
LOOP
  G3@RENDER()
  G@FLIP()
ENDLOOP

残念なことに、描画の結果は真正面から見たものになるので、単なる四角い板に見え、せっかくの立体が見えません。後でなんとかするのでここでは我慢してください。

『Xファイル( メッシュファイル )』(編集中)

三角形の描画は簡単でしたか?考え方は三角形の描画と同じなので難しくはないと思います。しかし、難しくは無いけれど面倒です。これがさらに複雑な物体であったらどうしますか?同じように数値の組み合わせで形作るのはさすがに大変です。実際のゲームや映画の製作でこんな事を地道にやっているかといえば、さすがにそれは「NO」です。この作業には「モデリングツール(モデラー)」という専用のツール使って行います。ツールの価格はピンキリで高いものになると100万円の大台になるものもあります。しかし入門者がそんなに高いものを購入するのは無理です。逆に数千円で購入できるものや、無料で使用できるフリーウェアもあるので、まずはそれらを使うことにしましょう。 ポイントはDirectXが扱える、Xファイルという形式のファイルフォーマットで結果を出力できるものを選ぶ事です。Xファイルへのファイルコンバータを別途用意するものもあるけど、直接出力できる方が楽に決まっています。
例えば次にあげる製品はどうでしょうか?

# 製品名 価格 概要
1 Metasequoia 5000円(無料版あり) ここで取り上げるものの中では最もオーソドックスなモデラーです。とはいっても、直感的に操作できるかなり使い勝手のいい製品です。
作者のホームページ「http://www1.sphere.ne.jp/mizno/」からダウンロードすることで取得できます。フルパッケージとLEという簡易版があります。LEでも必要なことはできますが、使い勝手を考えればフルパッケージの購入もいいかもしれません。
2 Shade 9800円〜 滑らかなカーブを持つ物体をモデリングするのに便利な製品です。Metasequoiaはフェースを一枚ずつ操作するため滑らかなカーブを描くのは大変です。それに比べShadeはベージュ曲線を使ってモデリングを行うため滑らかなカーブを簡単に描くことができます。つまり、カーブする面の微妙なフェースの調整を自動でやってくれるのです。ただし、自動でやるためフェースの量を調整することが困難(無駄にフェースを作ったりします)となります。
サポートページ「http://www.ex-tools.co.jp/」からダウンロードすることで取得できます。
3 DOGA-Lシリーズ L2:2000円
L3:3000円
上で紹介した製品とはちょっと異なる製品です。上では1からフェースを組み立てて物体を作るのに対して、この製品では既に出来上がったパーツを組み合わせて完成品を作るのです。飛行機やロボットなどのメカを作るのに適しています。
サポートページ「http://www.doga.co.jp/ptdoga/index.html」からダウンロードすることで取得できます。DOGA-Lは、それ単体で 3Dムービーを作る事のできる製品です。L2よりもL3の方が機能は高いのですが、LGPで使用するメッシュを作るだけであればL2でも十分です。
4 六角大王 1万円前後(無料版あり) これもちょっと特殊な製品です。左右対称の物体を作るのに適しています。使い勝手もちょっと特殊ですが一見の価値はあります。
作者のホームページ「http://www.shusaku.co.jp/www/」からダウンロードすることで取得できます。
製品版と比べると機能は少なくかなりシンプルですが無料版もあります。

ここでは各ツールの使い方は説明しませんが、マニュアルを見ながらやればなんとかなります。で、Dogaを使い5分そこそこで作ったものが下です。センスがないのは気にせずに行きましょう。

モデラーで作った Xファイルを使うのはとても楽です。G3@MESHLOAD関数でXファイル(メッシュ)を読み込むだけです。モデラーでは後で説明する色やマテリクス(材質)の情報も同時に設定できるので楽です。
前章で作った立方体ならこれで苦労しなくても数分でOKです。なら、最初からこの方法を教えろよ!!といわれそうだけど、まあ基本は大事ですから・・・
以下に上記の飛行機を描画するプログラムを示します。2,4,7,8行目にはじめて見る関数や使い方があります。これは飛行機を少し置くに配置するためのものですが、詳細は後で説明するのでここでは気にしないでください。

CH = G@SETUP( 640 , 480 , 16 , 1 )
FM = G3@FRMMAKE()
MS = G3@MESHLOAD("hikouki.X")
G3@ADD( MS , FM )
G3@ADD( FM , 0 )
G3@FRMSETPOS( FM , 0 , 0 , 2.0 )
G3@FRMSETMATERIALMODE( FM , 4 )
G3@FRMSETAMBIENT( FM , 65535 , 65535 , 65535 )
LOOP
  G3@RENDER()
  G@FLIP()
ENDLOOP

飛行機のxファイルのダウンロード

ちなみに、描画の結果は真正面から見た

残念なことに、描画の結果は真正面から見たものなので、少し単調な画像になります。