チュートリアル32

カメラビュー


このチュートリアルでは、カメラビューをどのように設定するのか、また、jit.gl.handleを使い、どうやってGLグループオブジェクトの位置を合わせ、回転させるのかを説明します。それに併せて、カメラ位置、カメラが見る地点、“up”ベクトル、投影の種類、レンズのアングル、クリッピング面といったカメラビューを構成するコンポーネントのグループを網羅していきます。

・Jitter Tutorialフォルダにある32jCameraView.patというチュートリアルパッチを開いてください。

パッチの左中央部に、misterと名付けられたjit.windowオブジェクトがあります。このウィンドウはOpenGLの描画先になります。jit.windowオブジェクトには、デプスバッファの生成を指定するために、アトリビュートのアーギュメントとして@depthbuffer 1があることに注意してください。デプスバッファにより、OpenGLレンダラーが描画コマンドによってカメラに近いピクセルを見せることができるようになります。デプスバッファリングしない場合、OpenGLは“ペインターズアルゴリズム”と呼ばれるものをよく使用し、例えば、描画コマンドの実行結果として見えるのは、それらのコマンドの実行順に対応しています。

・Start Renderingというラベルが付いているtoggleオブジェクトをクリックしてください。

大きなグレーの円といくつかの黄色い線が見えます。これらはjit.gl.gridshapeオブジェクトの2つのインスタンスによって描かれているものです。jit.gl.gridshapeオブジェクトは、球、トーラス、円柱、立方体、面、円といった様々な3D形状を描くことができます。そのウィンドウに見られるグレーの円は実際には球で、パッチ内のGrey Shapeとラベルが付いた部分によって描かれているものです。黄色い線は実際には面で、パッチ内のYellow Planeとラベルが付いた部分によって描かれています。その黄色い面のレンダリングには、poly_mode 1 1が指定されています。それは、その形が表と裏の両面の塗り潰されたポリゴンではなく、アウトライン化されたポリゴンで描かれていることを意味します。もし、メッセージボックスのpoly_mode $1 $1に繋がっているtoggleオブジェクトをオフに切り替えれば、塗り潰されてレンダリングされた面を見ることができます。


描画コンテキストの"mister"


・パッチのGrey Shape部分にあるscale 0.3 0.3 0.3 のメッセージボックスをクリックし、それからshape torusと書かれているメッセージボックスをクリックしてください。グレーのドーナツのようなものが見えるはずです。

・メッセージボックスのlighting_enable $1に繋がっているtoggleオブジェクトをクリックし、それからメッセージボックスのsmooth_shading $1に繋がっているtoggleオブジェクトをクリックしてください。ライティングとスムースシェーディングがされている3Dのトーラスから見ていきましょう。

JitterのGLグループオブジェクトではライティングもスムースシェーディングもデフォルトで無効になっているので、それらをオンにする必要があります。ライティングの詳細はチュートリアル36で取り上げます。

スムースシェーディングとライティングを有効にしてレンダリングしたトーラス

・そのパッチのCamera View部分にあるjit.gl.render axesというラベルが付けられたtoggleオブジェクトをクリックしてください。

ウィンドウの真ん中から右への赤い線と、真ん中から上への緑の線が見えるでしょう。これらはそれぞれx軸とy軸です。これらはシーンの原点を決めるために役立ちます。デフォルトのカメラポジションは[0.,0.,2.]で、デフォルトのlookatポジションは[0.,0.,0.]なので、カメラはz軸に沿ってシーンの原点をまっすぐに見ています。そのため、カメラが見ている向きに沿ったz軸を表す青い線は見えていません。

・camera positionラベルの欄に、xの値として1.を設定してください。するとカメラが[1.,0.,2.]の位置になり、見ている点は[0.,0.,0.]の位置のままなので、z軸の青い線が見えるようになります。


別の視点での軸

・camera positionのxの値を6.、yを-6.、zを6.に設定してください。それにより、camera positionは[6,-6,6]になります。黄色い平面と軸は、実際には有限であることが見えるようになります。


平面の端を見る

これまで、y軸がカメラビューに対して上を向いていました。これはデフォルトの“up”ベクトルが[0.,1.,0.] すなわち単位yベクトルだからです。

・up vectorラベルの欄に、yの値として0.と、zの値として1.を設定してみましょう。ビューが回転し、z軸の青い線が上を向いているのが見えるでしょう。


別の“up”ベクトルの使用

原点から離れたところに移動するにつれて、トーラス、平面、軸が小さくなることに注意しなければならないでしょう。これは、デフォルトのビューイングモードがパースペクティブプロジェクション(透視投影)を用いているからで、私達が存在する3次元の世界においてモノを見る方法と似ています。もし、あなたがカメラのレンズに精通しているのなら、それがレンズ角に依存し、大きな視野に対応するためにレンズ角を増やせばオブジェクトが小さくなることもご存知でしょう。それと同じように、視野を広げるために視野変換のレンズ角を変えることもでき、そうすることによってオブジェクトはさらに小さくなります。

・デフォルトのレンズ角は45度です。メッセージボックスのlens_angle $1に繋がっているナンバーボックスを変え、60度程度に変化させてみてください。


60度のレンズ角の使用

OpenGLによってサポートされる他のタイプの投影には、オーソグラフィックプロジェクション(正投影)があります。このタイプの投影は、カメラ位置によってオブジェクトの大きさが縮小されません。オーソグラフィックプロジェクションは、メカニカルエンジニアリングのような仕事に使われる3D CADソフトウェアで一般的なものです。Q-Bertのような初期のビデオゲームの多くもまた、オーソグラフィックプロジェクションを使用していました。orthographoc projectionとラベルが付けられたtoggleボックスをクリックすることで、パースペクティブプロジェクションとオーソグラフィックプロジェクションを切り替えることができます。そのortho 1というメッセージは、オーソグラフィックプロジェクションに切り替えるものです。もし、orthograpic projectionをオンにしてカメラを動かした場合、オブジェクトが小さくなるのは見えないはずです。しかし、レンズ角の変更では、視野と、視野に比例したオブジェクトの大きさが変わるでしょう。


オーソグラフィックプロジェクションを用いたシーンを見る

・ortho 0メッセージによってオーソグラフィックプロジェクションをオフに戻すため、toggleをもう一度クリックしてください。

カメラの視野に入るレンダリング範囲を決めるクリッピングプレーンについて調べてみましょう。OpenGLには、nearクリッピングプレーンとfarクリッピングプレーンがあります。そして、これら2つのプレーン間に位置するジオメトリのみがレンダリングされます。これらのクリッピングプレーンは、clip_nearとclip_far メッセージを用いて、ビューイングベクトルに沿ったカメラからの距離の単位で指定されます。デフォルトでは、nearクリッピングプレーンは0.1に設定され、farクリッピングプレーンは100に設定されています。

・nearクリッピングプレーンを10に増やし、farクリッピングプレーンを12に減らしてみてください。クリッピングプレーンの外側が見えなくなった黄色い平面の近くと遠くの端が見えるはずです。


縮められたクリッピングプレーンの使用


・nearクリッピングプレーンをデフォルトの0.1に戻し、farクリッピングプレーンもデフォルトの100に戻してください。

これまで、カメラは常に原点の[0.,0.,0.]を向いていました。もし、lookatポジションのxの値を3.に変えれば、カメラは[3.,0.,0.]を向きます。

・パッチ内のUI Rotation and Position Controlとラベルが付けられた部分のposition 3. 0. 0.と書かれているメッセージボックスをクリックし、トーラスを[3.,0.,0.]の位置に動かしてみましょう。トーラスは、また視野の中心点[3.,0.,0.]に戻ります。


注目点(訳注:カメラが見ている先の位置)とトーラスの位置の変更

これは、position 3. 0. 0.メッセージをトーラスに送るだけではなく、jit.gl.handleオブジェクトにも送ります。jit.gl.handleオブジェクトは、3Dシーンにおいてオブジェクトの移動や回転をするためにマウス情報を使うGLグループオブジェクトです。jit.gl.handleオブジェクトは、jit.gl.gridshapeオブジェクトのように描画先の名前が付けられた描画コンテキストを必要とします。しかしそれはjit.gl.gridshape とは違って、描画コンテキストの送り先上でのマウスの動きをMaxメッセージに変換するユーザインタフェースオブジェクトでもあります。

このパッチでは、jit.gl.handleオブジェクトからのメッセージは、jit.gl.gridshapeオブジェクトに送られます。それらはroute rotate positionオブジェクトにも送られて書式を整えられるので、あなたは何が送られたのかを正確に見ることができます。これらのメッセージはjit.gl.handleオブジェクトからの情報を見せているだけで、実際には何もしていません。

もし、トーラスをクリックしてマウスをドラッグすれば、jit.gl.handleオブジェクトによって、まるでバーチャルなトラックボールのようにトーラスが回転し始めるのが見られるでしょう。もし、ドラッグするときにコマンドキーを押していれば、トーラスを上下左右に動かすことができます。ドラッグするときにオプションキーを押していれば、トーラスがあなたに近付いたり離れたりするように動かすことができます。これらのマウスの動きをしているとき、シフトキーを使うことで、その動きを一つの軸に対してのみ行うことができます。

jit.windowオブジェクト上のトーラスをクリックして、トーラスの向きを操作してみてください。
jit.gl.handleオブジェクトがどのように2次元のマウス情報から3次元の回転情報に変換するのかを体感してみてください。


オブジェクト位置を操作するためのjit.gl.handleオブジェクトの使用

jit.gl.renderオブジェクトでの表示可能な軸と同じように、jit.gl.handleオブジェクトは回転しているオブジェクトのx(赤)、y(緑)、z(青)平面に対応する色付きの線を表示します。その線は操作対象オブジェクトの周囲に円として見えます。マウスは現在の視野で最前面にある2つの円の軸を動かします。それらの円をオブジェクトの後ろに動かすように画像を操作することによって、次のマウスクリックで別の2つの軸をコントロールできるようになります。修飾キー(訳注:オプションキーやコマンドキーのこと)は、あなたがオブジェクトを3つの軸上で移動させることによってオブジェクトの位置を変えられるようにします。jit.gl.handleオブジェクトは、それに伴うGLグループオブジェクトのrotateとpositionアトリビュートを設定するために、関連するメッセージを出力します。もし、jit.pwindowにGLコンテキストを表示しているのなら、jit.gl.handleを使ってズームするために、MaxのHelp in Locked Patchersオプション(これはOptionsメニューの下で変更することができます)を無効にしておかなければなりません。そうしないでオプションキーを押しながらクリックすると、jit.pwindowに対するヘルプパッチが表示されてしまうでしょう。



まとめ

OpenGLシーンのカメラビューを作り出すいくつかの要素と、それらをコントロールするjit.gl.renderオブジェクトでの必要なアトリビュートについて調べてきました。cameraアトリビュートはカメラ位置を指定し、upは上向きベクトルを、lookatはカメラから見る位置を、orthoはオーソグラフィックプロジェクションとパースペクティブプロジェクションのどちらを使うかを、near_clipとfar_clipはクリッピングプレーンを指定します。ライティングとスムースシェーディングアトリビュートは、ジオメトリを扱うGLグループオブジェクト(この場合はjit.gl.gridshapeオブジェクト)のlighting_enableとsmooth_shadingアトリビュートを設定することによって有効になります。

jit.gl.handleオブジェクトは、マウスとキーボードの修飾キーを使ってGLグループオブジェクトを回転させたり、位置を動かしたりできるようにします。jit.gl.handleオブジェクトは、そのjit.gl.handleオブジェクト自身を正しい描画コンテキストに加えるため、そのコンテキストの名前を取得します。そして、そのコンテキストを使っていて繋がっているオブジェクトに対し、rotationやpositionの設定メッセージを送ります。