/**/

チュートリアル 36:
3Dモデル

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

レビューと設定

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

訳注:原文では "Tutorial 36" フォルダの中にチュートリアルパッチがあるようになっていますが、Jitter 1.6ではJitter Tutorial フォルダの中にチュートリアルパッチがあります。

jit.pwindow オブジェクトの背景が茶色い背景になります。この茶色はjit.gl.renderオブジェクトの erase_color アトリビュートによるものです。

jit.pwindowオブジェクトの上にある name ml, depth buffer 1 というメッセージボックスをクリックして下さい。

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個のポリゴングループがあることを示しています。モデルは、リンゴやマッシュルームのように1つの物体だけで構成されなければならないというわけではありません。物体のグループや、シーン全体であることも可能です。モデル内の様々なオブジェクトを異なったポリゴングループに割り当てることによって、それらをパッチ内で独立して扱うことができるようになります。

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

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

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

.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 linearsphere mapeye 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 メッセージで指定された名前のテクスチャを使用します。texgroup [group-number] 0 というメッセージが受信された場合、texgroup メッセージで指定された名前のテクスチャはそのグループではもはや使用されなくなり、グループはモデル全体のテクスチャに戻ります。

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

描画グループ

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

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

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

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

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

drawgroup 0 というメッセージボックスをクリックし、すべてのポリゴングループを表示する状態に戻して下さい。

マテリアルモード

モデルはマテリアル定義を含むことができますが、このモデルには何も含まれていません。マテリアル定義を持ったモデルをロードしてみましょう。

read apple.obj というメッセージボックスをクリックし、Tutorial フォルダにあるリンゴのモデルを読み込んで下さい。

このモデルは、前のものほど複雑ではないため、読み込むのはかなり速いでしょう。Maxウィンドウに表示された jit.gl.model オブジェクトの出力を読むと、このモデルには4,452個の三角形があることがわかります。さらに、Max ウィンドウの表示から3つのマテリアルがあることもわかります。モデルがレンダリングされた画像では、これらのマテリアルによる効果を見ることができます。テクスチャが何も適用されていない状態でも、リンゴは赤く、軸は茶色くなっています。


2つのマテリアルを表示するリンゴモデル

jit.gl.model オブジェクトの material_mode アトリビュートは、モデルをレンダリングするためにモデルファイル内で指定されたマテリアルをどの程度使用するかを決定します。現在のマテリアルモードは 1で、これがデフォルトの値です。

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

軸は同じ均一な茶色のままですが、リンゴの皮は光沢を持ち、わずかに青みがかった状態に表示されることに気がつくでしょう。これは、マテリアルの鏡面反射光コンポーネントがレンダリングで使用されるようになったためです。最初に、デフォルトの設定(material_modeアトリビュートが 1)でリンゴを読み込んだときには、素材の拡散反射要素だけがレンダリングで使用されていました。


マテリアルの鏡面反射要素が有効になったリンゴ

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

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

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) に謝辞を送ります。