チュートリアル36

3Dモデル


このチュートリアルでは、jit.gl.modelオブジェクトを使った3Dモデルをロードし、それをJitterで、ライティング、素材、テクスチャマッピングを使ってレンダリングする方法を示します。


レビューと設定

・Jitter Tutorialフォルダの中の“Tutorial 36”フォルダにある36j3Dmodels.pat というチュートリアルパッチを開いてください。そして、“Start Rendering”というラベルが付いたtoggleをクリックしてください。

jit.pwindowオブジェクトに茶色の背景が見えるでしょう。その茶色はjit.gl.renderオブジェクトのerase_colorアトリビュートによるものです。

・jit.pwindowオブジェクトの上にあるname ml, depth buffer 1(訳注:原文では「name me, depth buffer 1」ですが、パッチでは「name ml…」なのでパッチに合わせました)というメッセージボックスをクリックしていください。

nameアトリビュートは、そのjit.pwindowオブジェクトを描画先として使えるようにします。ただし、これは、チュートリアルパッチをセーブしたときに一緒に記憶されています。そのメッセージのdepth buffer 1は、描画先にデプスバッファを付加し、自動的に隠面を消去できるようにします。

jit.pwindowオブジェクトの上にあるtexture grid 64 64というメッセージボックスをクリックしてください。

テクスチャを紹介したチュートリアルで見たように、このメッセージをjit.gl.renderオブジェクトに送ることで、高さと幅の両方が64ピクセルで、デフォルトのチェス盤パターンで塗り潰されたテクスチャを構築します。そのテクスチャは、そのコンテキストに描画しているGLグループの任意のオブジェクトによって利用できます。これで、いくつかのモデルをロードしてレンダリングするための準備が整いました。


モデルファイルの読み込み

jit.gl.modelオブジェクトは、3Dオブジェクトの内容をポリゴンの集合として読み込みます。これらの内容は.objファイル形式で格納されています。そのモデルファイルを読み込むためには、ファイル拡張子が.objでなければなりません。この形式は広く使われており、普通のテキストエディタで読んだり編集したりすることが可能だという利点があります。

・パッチの“Draw a Model”部分の左上にあるverbose $1というメッセージボックスの上のtoggleをクリックしてください。

これは、jit.gl.modelオブジェクトにverbose 1というメッセージを送り、verboseモードを有効にします。このモードがオンのときには、ロードしたモデルファイルについての情報をMaxウィンドウに見ることができます。リアルタイムグラフィックスのレンダリング中に、verboseモードをオンにしたままにすることは良いとは言えません。しかし、パッチの設定やデバッグしているときには、そのメッセージはとても役に立つものです。

・read mushrooms.objというメッセージボックスをクリックしてください。このオブジェクトは、 jit.gl.modelオブジェクトの上に見つけることができます。

そのmushrooms.objというファイルは、Jitterがインストールされたときに、すでにMaxのサーチパス内にインストールされているはずです。もし、なにかしらの理由でこのファイルが移動していれば、Maxウィンドウに・ error: jit.gl.model: can't find mushrooms.objというメッセージが表れるでしょう。もし、このファイルが正しく見つかったときには、Maxウィンドウに次のようなメッセージが見えるでしょう:

reading mushrooms.obj . . . . . . . .
done.
jit.gl.model: rebuilding
groups: 11
materials: 0
triangles: 10560
vertices: 6199
texture coords: 5589
normals: 6046
636408 bytes used

readメッセージに続けて指定したファイルが見つかり、正しいモデルファイルだと判断されたとき、reading [file].objというメッセージが表示されます。それから、たいていの場合にはファイルのロード中にいくつかの点が表示されます。テキストファイルからの大きなモデルの読み込みにはかなりの時間がかかるので、それらの点が表示されることで、何も間違ったことが起きていないことがわかります。

モデルのロードが終了すると、jit.gl.model: rebuildingが表示されます。新しいモデルの読み込みに加え、いくつかの工程はモデルの表現を内部的に再構築します。それらはすべてメッセージとして表示されるので、あなたは何が行われているかを知ることができます。

groups: 11というメッセージは、そのモデルに11個のポリゴングループがあることを示しています。モデルは、リンゴやマッシュルームのように一つのものである必要はなく、グループであったり、全体のシーンであることができます。モデル内の様々なオブジェクトを別々のポリゴングループに割り当てることで、それらがパッチ内で独立して操作されることを可能にします。

materials:0というメッセージは、そのモデルファイルの中にどれくらいの素材定義があるのかを示します。素材定義は、チュートリアル35で見たように、オブジェクト表面色の環境光、拡散反射光、鏡面反射光の要素を指定します。モデルファイルは、モデル内の1つ以上のポリゴングループに適用可能な複数の素材定義を持つことができます。ただし、このモデルには何もありません。

また、このモデルが、6,199の頂点につながった10,560の三角形を含み、5,589のテクスチャ座標や6,046の法線を持つことがわかります。テクスチャ座標と法線が頂点よりも少しだけ少ないのは、これらの数はモデルが読み込まれるときに大きなインデックスで参照されるからで、三角形が構築されるときには再利用されることが可能です。

最後に、およそ636キロバイトのメモリが、Jitterで内部的にモデルを格納するために使われていることがわかります。常にもっと多くのメモリがあるとしても、この量が問題にならないというわけではありません。メモリの使用は、大きなパッチをデバッグするときには確実に注意しなければならないことです。
.

objモデルファイルの互換性:既存の基本的な.objファイル形式に対しての多くの拡張があります。これらのいくつかは、NURBSとパラメトリックサーフェイスです。いま現在は、頂点、ポリゴン、グループ、素材、テクスチャ座標だけをサポートしています。

 

モデルアトリビュート

あなたが指示通り進めているとすれば、このチュートリアルパッチに11個のマッシュルームが興味深く浮いているのを見ながらも、Maxウィンドウのメッセージについての、この素っ気ない文章をすべて読んでいることでしょう。さあ、モデルがどうレンダリングされるかに関わるアトリビュートを調べてみましょう。

ライティングとシェーディング

空間にマッシュルームが見えますが、それらの輪郭は単純にGLグループにおけるオブジェクトのデフォルトカラーである中間的なグレーで塗られています。


フラットシェーディングされたマッシュルーム


・lighting_enable $1というメッセージボックスの上にあるtoggleをクリックしてください。これは、jit.gl.modelオブジェクトにlighting_enable 1というメッセージを送るためです。

ここで、ポリゴンでできた領域の一部は明るくなり、他の部分は暗くなったため、そのモデルはより立体的な外観になりました。
しかし、各ポリゴンでは、全領域で一様にポリゴン毎の色が塗られています。この結果は少々粗いものです。

・smooth_shading $1というメッセージボックスの上にある、toggleオブジェクトをクリックしてください。これは、jit.gl.modelオブジェクトにsmooth_shading 1というメッセージを送るためです。

スムースシェーディングをオンにすると、モデル内の各ポリゴンの陰影は、頂点から頂点にかけて調和されます。これは、ポリゴンのエッジを隠し、滑らかな外見を与えます。私達がリアリティを目指すとすれば、その第一歩を踏み出したところです。


ライティングとスムースシェーディングを有効にしたマッシュルーム


テクスチャマッピング

GLグループの他のオブジェクトと同じように、textureメッセージを伴う全モデルにテクスチャを適用することができます。

prepend textureオブジェクトの上にあるgridというメッセージボックスをクリックしてください。これは、jit.gl.modelオブジェクトにtexture gridというメッセージを送るためです。

これは、モデルのテクスチャを設定します。どのようにテクスチャが適用されているかをよく見るために、このパッチにはjit.gl.modelに接続されたjit.gl.handleオブジェクトがあるので、チュートリアル32で説明したように、モデルを回転させたり移動させたりすることができます。

テクスチャによるマッシュルームの覆い方をよく見てください。マッシュルームの頭は放射状に、軸は円筒状に覆われています。そして、各マッシュルームの外見には多少の違いがあります。

これらのテクスチャ座標は、このモデルの作成者が3Dモデリングプログラムを使って生成しました。それらの座標は、各頂点で2Dテクスチャ上のどの位置を使うかを指定しています。


丁寧にテクスチャマッピングされたマッシュルーム


自動的に生成された座標を持ったモデルがどう見えるかを確認するために、tex_mapメッセージを利用することができます。チュートリアル34で説明したように、tex_mapのモードの1、2、3は、それぞれobject linear、sphere map、eye linearのマッピングを指定します。tex_map 0は、モデルで指定された座標を使います。

・もし、これらのモードを試してみたければ、tex_map $1というメッセージボックスの上にあるナンバーボックスを変えてみてください。それが終わったら、そのナンバーボックスを0に設定することで、モデルをあらかじめ設定されたテクスチャ座標に戻してください。

jit.gl.modelオブジェクトは、標準的なGLグループのテクスチャ適用機能に加え、モデル内の各ポリゴンに対して異なったテクスチャを適用することができます。

・モデルに対するテクスチャの適用を無効にするため、prepend textureオブジェクトの上の0というメッセージボックスをクリックしてください。

・texgroup 1 gridというメッセージボックスをクリックしてください。

texgroup [group-number] [texture-name]というメッセージは、モデル内の[groupnumber]のポリゴングループに、[texture-name]のテクスチャに設定します。そのメッセージを送ったときの結果として、ポリゴングループの1には、格子状のテクスチャが設定され、1つのマッシュルームが格子状に覆われますが、他のものはベタのグレーのままになります。このメッセージは、モデル内の各ポリゴングループに様々な画像や動画を適用するために、チュートリアル34で取り上げたテクスチャの書き換え方法と組み合わせて使うことができます。

もし、texgroupメッセージが決められたポリゴングループに受け取られると、そのグループは、textureメッセージを使ってモデル全体に送られていたどんなテクスチャも使わずに、そのメッセージで指定されたテクスチャを使います。もし、texgroup [group-number] 0というメッセージが受け取られると、指定されたテクスチャはそのグループではもう使われなくなり、そのグループはモデル全体のテクスチャに戻ります。

・ポリゴングループの1から格子状のテクスチャを取り除くために、texgroup 1 0というメッセージボックスをクリックしてください。


ドローインググループ

別々のテクスチャが可能なのに加えて、モデル内のポリゴングループを個別に描画することもできます。この描画は、drawgroupメッセージを使ってコントロールできます。

・チュートリアルパッチの右側にあるcounterオブジェクトの上のbuttonオブジェクトをクリックしてください。

これは、そのカウンタを増加させ、カウンタはdrawgroup 1というメッセージをjit.gl.modelオブジェクトに送ります。ポリゴングループは、1から始まるインデックスが付けられています。jit.gl.modelオブジェクトがdrawgroup [n]というメッセージを受け取ったときには、次のメッセージが来るまで、モデルのポリゴングループnだけを描画します。ですから、いまはフレーム内にマッシュルームが一つだけ見えているはずです。

buttonオブジェクトを繰り返しクリックすることで、順番に各マッシュルームを繰り返し見ることができます。このテクニックは、モデルの各ポリゴングループに、アニメーション化されたオブジェクトの1フレームを格納することで、3Dアニメーションの読み込みにも使うことができます。

jit.gl.modelオブジェクトがdrawgroup 0というメッセージを受け取ったときには、全ポリゴングループの表示に戻ります。

・全ポリゴングループの表示に戻すために、drawgroup 0というメッセージボックスをクリックしてください。


マテリアル(素材)モード

モデルは素材定義を含むことができますが、この特別なモデルには、何もありません。素材のあるものをロードしてみましょう。

・Jitter Tutorialフォルダにあるリンゴモデルを読み込むために、read apple.objというメッセージボックスをクリックしてください。

このモデルは、前のものよりも複雑ではありませんので、読み込むのはかなり速いでしょう。Maxウィンドウでのjit.gl.modelオブジェクトの出力を読むと、4,452の三角形があることがわかります。また、そのMaxウィンドウでは3つの素材があることもわかります。モデルがレンダリングされた画像では、これらの素材の影響が見えます。テクスチャが何も適用されていなくても、リンゴは赤く、茶色の軸があります。


2つの素材を見せるリンゴモデル

jit.gl.modelオブジェクトのmaterial_modeアトリビュートは、モデルファイル内で指定されたどの素材を、モデルをレンダリングするのに使うのかを決定します。ちょうどいまのマテリアルモードはデフォルトの1です。

・“material_mode $1”というメッセージボックスの上にあるナンバーボックスに2を設定してください。

軸はベタの茶色のままですが、リンゴの皮は光沢を持ち、少し汚れたような外観になることに気が付くでしょう。これは、素材の鏡面反射要素が、レンダリングで使われるようになったためです。最初にmaterial_modeアトリビュートが1のデフォルトの設定でリンゴを読み込んだときには、素材の拡散反射要素だけがレンダリングに使われていました。


鏡面反射要素が有効になったリンゴ

・同じナンバーボックスの値を0に設定してください。

これで、モデルの素材プロパティが何もレンダリングに使われないようになり、その代わりに、そのオブジェクトのカラーアトリビュートが、オブジェクトの拡散反射色を決定するのに使われます。そのため、モデルはデフォルトのグレーに見えます。では、様々なマテリアルモードがどう役に立つのかを見るために、もう一つの設定を試してみましょう。

・lighting_enable $1というメッセージボックスの上にあるtoggleオブジェクトをクリックしてオフにしてください。それから、material_modeアトリビュートの設定をすべて試してください。

ライティングが無効になったものが見え、マテリアルモードが1になっているときだけ、オブジェクトの素材には任意の効果があるでしょう。素材の拡散反射要素がオブジェクトの色を決定するのに使われるので、フラットシェーディングでの描画は、ポリゴングループ毎に異なった色になります。


マテリアルモードが1のフラットシェーディングのリンゴ


ここで、material_modeアトリビュートの設定を簡単にまとめます。

material_mode 0: モデルファイルの素材を使いません。オブジェクトのカラーアトリビュートは、拡散反射の色と、ライティングが無効ならベタの色も決めます。
material_mode 1: 拡散反射の色とレンダリングされたモデルのベタの色を決定するために、モデルファイルの拡散反射の素材要素を使います。
material_mode 2: モデルファイルのすべての素材要素を使います。


まとめ

ディスク上の.obj形式ファイルから、複雑で複数のパートからなる3Dモデルを読み出す方法について見てきました。jit.gl.modelオブジェクトのアトリビュートは、モデルのライティングやシェーディングへの影響や、素材がレンダリングにどう影響するのかを決定するために使うことができます。モデルファイルには、独立に描画やテクスチャマッピングが可能な様々なポリゴングループを含むことができます。

ここでの洗練されたフリーウェアモデルの使用に関して、Oliver Ffrench (http://o.ffrench.free.fr/meshbank)に感謝致します。