/**/

チュートリアル 37:
覆いの下のジオメトリ

訳注:このタイトルは、ジオメトリの「低レベル」での処理を意味しています。低レベルとは、よりシステム寄りであることを表す用語です。

このチュートリアルでは、ジオメトリデータをマトリックスとして指定し、それを jit.gl.render オブジェクトでレンダリングするという、Jitterにおける低レベルのサポートを紹介します。データは通常のJitterマトリックスに格納されるため、ジオメトリマトリックスの生成や処理に任意のマトリックス演算子を使用できる可能性が開けます。このチュートリアルでは、GLグループの matrixoutput アトリビュート、ジオメトリマトリックス内のデータの構成、マトリックス演算子を用いてジオメトリマトリックスを処理する場合の例を取り上げ、さらに、jit.gl.render オブジェクトでサポートされる様々な描画プリミティブを紹介しようと思います。

・Jitter Tutorialフォルダにある37jGeometryUnderTheHood.patというチュートリアルパッチを開き、Start Rendering と表示された toggle オブジェクトをクリックして下さい。

マトリックス出力

・Turn matrixoutput on/off と表示された toggle ボックスをクリックして下さい。

ちょっと待って下さい。さきほどまであった球が消えてしまいました。いったい何が起きたのでしょうか?

GLグループのいくつかのオブジェクトは、matrixoutput アトリビュートをサポートしています。そして、 jit.gl.gridshape はその内の一つです。このアトリビュートは、そのオブジェクトのジオメトリが、オブジェクトが関連する描画コンテキストに直接レンダリングされるか、オブジェクトの左アウトレットからジオメトリデータを持つマトリックスとして送信されるかを決定します。この状態では、ジオメトリは閉じた gate に送られているため見ることができません。

・“Matrix Destination”と表示された ubumenu オブジェクトのメニューから print という項目を選んで下さい。

Maxウィンドウには、print: jit_matrix u26300000007 quad_grid というようなメッセージが繰り返し表示されていくのが見えるはずです。このメッセージは、これまでのチュートリアルの中で、マトリックスデータを渡すためのオブジェクトの出力として見てきたものと同様ですが、これまでにはなかった要素が追加されています。jit.gl.gridshape オブジェクトは、おなじみの jit_matrix [matrix-name] というメッセージを送信するのではなく、jit_matrix [matrix-name] [drawing-primitive] というメッセージを送信します。このケースでは、描画プリミティブ (drawing-primitive)は quad_gridです。これは、マトリックスが四角形のグリッド(格子)として解釈されることを意味しています。


Maxウィンドウにおける jit.gl.gridshape オブジェクトの出力

このチュートリアルを書いた時点では、matrixoutput アトリビュートをサポートするオブジェクトは、jit.gl.gridshapejit.gl.nurbsjit.gl.plato オブジェクトだけです。しかし、あなたがこのチュートリアルを読んでいる時点では、この処理モードをサポートする他のオブジェクトが存在するかもしれません。

ウィンドウには何の反応もありませんが、この状況を変えることは簡単です。

・Matrix Destination と表示された ubumenu オブジェクトから、direct というメニュー項目を選んで下さい。

direct を選ぶと、再び球が見えるようになります。これは、jit_matrix [matrix-name] [drawing-primitive] というメッセージが jit.gl.render オブジェクトに送られるようになるためです。このメッセージを受信すると、jit.gl.render オブジェクトは、指定された描画プリミティブを使用して入力されるマトリックスを描画します。描画プリミティブの指定がない場合には、jit.gl.renderオブジェクトのカレントの(現在設定されている)描画プリミティブが使用されます。有効な描画プリミティブは、points linesline_strip line_looptriangles tri_strip tri_fan quads quad_strip polygontri_gridquad_gridです。

jit.gl.renderオブジェクトのカレントの描画プリミティブは、[drawing-primitive] というメッセージを送ることによって設定できます。[drawing-primitive] には、上記の有効な描画プリミティブの中の任意のものを使用できます。

ビデオデータのディメンション(大きさ)を変更する場合と同じ方法で、マトリックス出力の大きさを変更することができます。そのためには、jit.gl.gridshape オブジェクトに dim メッセージを送信します。jit.gl.gridshape が出力するマトリックスのディメンション(大きさ)は、デフォルト(初期値)では20×20になっています。

・Wireframeと表示された toggle ボックスをクリックして下さい。

・Matrix Dimensions と表示されたナンバーボックスを変更して下さい。

・ワイヤーフレームの球体をマウスを使って回転させてみて下さい。


“The Death Star plans are not in the main computer.”
「メインコンピュータには、デススター計画はありません」
(訳注:スターウォーズでの台詞。映画内でデススターと
いうものがワイヤーフレームで描かれていたようです)

このパッチの中で、jit.gl.handle オブジェクトが、jit.gl.gridshape オブジェクトではなく、jit.gl.render オブジェクトと通信していることに気がついたかもしれません。これには、シーン全体を回転させたり、移動させたりする効果があります。これを正しく動作させるためには、@inherit_transform 1 というアーギュメントが必要です。そうでないと、この回転がシーンの回転と再び合成され、大きな混乱を引き起こすでしょう。

ジオメトリマトリックスの詳細

Jitterのビデオは、通常、4プレーンの char データによって表されますが、ジオメトリデータはどのように表されるのでしょうか?

ジオメトリの各頂点は、通常、プレーン数が3、5、8、12、13である float 32のデータで表されます。プレーン 0 〜 2は、その頂点の x、y、z 位置を指定します。プレーン 3 と 4 は、テクスチャ座標の s と t を指定します。プレーン 5 〜 7 は、ジオメトリでのライティングの影響を計算するために使用する法線ベクトル nx、ny、nzを指定します。プレーン 8 〜 11 は、頂点の色の赤、緑、青、アルファを指定します。プレーン12は、エッジフラグ e を指定します。

jit.gl.gridshape オブジェクトの出力マトリックスには12個のプレーンがありますが、ジオメトリにテクスチャを適用せず、ライティングが無効になっているため、テクスチャ座標と法線ベクトルは無視されます。

ジオメトリマトリックスの処理

これまでのようにジオメトリをそのまま単純にレンダリングするのではなく、マトリックス演算子によってこのジオメトリを処理することも可能です。

・Matrix Destinationと表示された ubumenu オブジェクトから xfadeというメニュー項目を選んで下さい。

これによって、マトリックスは jit.xfade オブジェクトに送られ、ノイズのマトリックスで作られるジオメトリマトリックスとクロスフェードされるようになります。jit.xfade オブジェクトは、2つのビデオマトリックス間のクロスフェードに使用できるのと同様に、ジオメトリマトリックス間のクロスフェードに使用することができます。

・“Generate Noise”と表示された button オブジェクトをクリックして下さい。

・“Crossfade Value”と表示されたナンバーボックスを徐々に 0.1 まで変化させて下さい。

・Wireframeと表示された toggle ボックスをクリックし、ワイヤーフレームでのレンダリングのオンとオフを切り替えて下さい。ノイズが、シェイプのジオメトリと色の両方をどのように変形させるかに注目して下さい。

これによって、ランダムな色が加わったのと同時に、ノイズによって球が微妙に変形されます。テクスチャ座標と法線ベクトルも影響を受けますが、テクスチャが適用されておらず、ライティングも無効になっているため、これを見ることはできません。


わずかに変形された球体(ワイヤーフレーム、および塗り潰されたもの)

・“Generate Noise”と表示されたbuttonオブジェクトをさらに数回クリックするか、“Rapid Noise”と表示された toggleボックスをオンにして、ジオメトリが描画される毎に新しいノイズのマトリックスが生成されるように設定して下さい。

・ “Crossfade Value”と表示されたナンバーボックスを徐々に1.0まで変化させて下さい。再びワイヤーフレームでのレンダリングのオンとオフを切り替え、ノイズがどのように視覚化されるかを見て下さい。

これで、描画されるジオメトリは純粋なノイズになりました。


ジオメトリとして表現されるホワイトノイズ(ワイヤーフレームと塗り潰されたもの)

・“Crossfade Value”と表示されたナンバーボックスを0に戻して下さい。

描画プリミティブ

jit.gl.gridshapejit_matrix [matrixname] quad_grid というメッセージを出力しているにも関わらず、jit.xfade の出力に quod_grid を追加していることに気がつくと思います。これは、多くのマトリックス演算子が描画プリミティブを指定するアーギュメントを無視し、単に message jit_matrix [matrix-name] というメッセージを出力するためです。したがって、メッセージに描画プリミティブの名前を追加する必要があります。これは、様々な描画プリミティブを試してみる良い機会を与えてくれます。

・Drawing Primitiveと表示された ubumenu から、様々なメニュー項目を選んでみて下さい。


様々な描画プリミティブの使用:points(上左)、 line_strip(上右)、triangles(下中央)

まとめ

GLグループの中のいくつかのオブジェクトは、関連した描画コンテキストに直接描画することに加え、matrixoutput アトリビュートをサポートしています。このアトリビュートが有効な場合、ジオメトリマトリックスは、オブジェクトの左アウトレットから、jit_matrix [matrix-name] [drawing-primitive] というメッセージによって出力されます。

ジオメトリマトリックスは、一般に、プレーン数 3、5、8、12、13 の float32データで、ビデオマトリックス処理と同様な方法によって、任意のマトリックス演算子を使った処理を行なうことができます。

jit.gl.render オブジェクトは、このジオメトリマトリックスをレンダリングするために、様々な描画プリミティブをサポートします。サポートされる描画プリミティブは points linesline_strip line_looptriangles tri_strip tri_fan quads quad_strip polygontri_gridquad_gridです。