jsui, Sketch および OpenGL

jsui にロードされる Javascript ファイルはSketch オブジェクトにアクセスします。これは、グラフィックスを描画するために使用されるオブジェクトです。 ここでは、Sketch オブジェクトと、Sketch API として公開されているそのメソッドについて述べます。Sketch API はクロスプラットフォームな OpenGL API を土台として作られ、2つのカテゴリ、「OpenGL メソッド」と「高レベルメソッド」に分けることができます。「OpenGL メソッド」は低レベル OpenGL API の大部分と直接結びつけられるもので、「高レベルメソッド」は、低レベル OpenGL 呼出しを土台とした拡張にあたります。

高レベルメソッドの例としては、sketch.sphere(0. 1) が挙げられるでしょう。これはジオメトリの全てを計算し、球をレンダリングするための多くの OpenGL呼出しを行なう sketch オブジェクトのカレントステート(現在持っている状態)に基づいたライティングや色情報と結びつけられます。sketch.spere() メソッドは、その土台となる OpenGL 呼出しを利用する場合に比べ、非常にシンプルに使えます。「高レベル」はプログラマが OpenGL の複雑な詳細事項を考えずに済むように考慮されたものです。

OpenGL の仕様と相違点

OpenGL メソッドはすべて “gl” というプリフィックスで始まります。このドキュメントではサポートされる OpenGL メソッドのリストを提供しますが、OpenGL についてより詳しく知るには、OpenGL API に関する、オンライン、あるいは印刷されたドキュメントを参照することを推奨します。web サイト、www.opengl.orgはOpenGL のオフィシャルなオンラインリソースであり、オンラインドキュメント、チュートリアル、リンク、ニュース、および他の OpenGL 関連の情報を得るためのの良い出発点となります。Sketch オブジェクトが公開しているメソッドと OpenGL API の間には、いくつかの重要な相違点があります。

  1. Sketch メソッドはすべて小文字で、sketch オブジェクトのコンテキスト内だけに存在します。これは、例えば、glBegin() は sketch.glbegin() となり、glClearColor() は sketch.glclearcolor() となるということを意味します。Javascript の “with”文を使用することができるため、すべてのメソッド呼出しで “sketch.”とタイプせずに済ますこともできます。
  2. 全てのシンボル定数は小文字による Javascript 文字列になり、“GL_”プリフィックスを持ちません。例えば、定数 GL_LIGHTING は Javascript 文字列“lighting”になり、GL_LINE_STRIP は “line_strip” に置き換えられます。
  3. 特別なベクタ呼び出しのバージョンはありません。浮動小数点数のみがサポートされ、sketch は残りの値にデフォルトを適用します。例えば、glColorv4fv()、glColorv3fv()等は単に sketch.gcolor() になります。
  4. Sketch は 個々のアーギュメントの代わりに、Javascript 配列で渡すことをサポートしています。このため、 glColor3f(0.,0.,1.)は、sketch.gcolor(0.,0.,1.)で置き換えることができるだけでなく、frgb が配列 [0.,0.,1.] のとき sketch.gcolor(frgb)で置き換えることもできます。

色と座標

色の値は、OpenGL の記法と同様、各要素ごとに、0. 〜 1. の範囲の浮動小数点数で指定しなければなりません。0 〜 255 の整数での指定はできません。 例えば、赤は (255,0,0) ではなく (1.,0.,0.)になります。OpenGL はまた、透明度やブレンディングモードの他のタイプために、アルファチャンネルの使用をサポートします。アルファチャンネル値を伴う色の指定は RGBA になります。例えば、25 % の不透明度を持つ緑の場合には、 (0.,1.,0.,0.25) になります。アルファチャンネルの値が与えられない場合、1.、すなわち不透明度が 100% であると見なされます。デフォルトでは、アルファブレンディングは使用可になっています。ブレンディングをオフに切り替えるには、sketch.bldisable("blend") を使います。3D で実行する場合、デプスバッファリングはデフォルトでオンになっていて、通常、透明なオブジェクトをブレンドしようとするのを妨げます。デプスバッファリングをオフにするためには、 sketch.gldisable("depth_test") を使います。

他のいくつかのグラフィック APIと異なり、OpenGL API は 2D 描画 と 3D 描画を区別しません。従来の 2D 描画は、単に、特定のグラフィックステート(ライティングがない、デプステストがない、正投影である、等々)で呼び出される 3D 描画のサブセットです。高レベル・ユーティリティメソッドは、一般的に 2D あるいは 3D グラフィックで使用される OpenGL のグラフィックステートをセットアップするための利便性を図るものとして提供されています。2D 描画の記法があるとすれば、普通に z 座標を 0 にするだけで、全てのメソッドをそのために利用できます。

OpenGL の座標は、絶対的なピクセル座標ではなく、ワールド座標からの相対的な浮動小数点数によって与えられます。このワールド座標のスケールは、その時点での図形変換、すなわち、平行移動、回転、スケーリング、投影モード、ビューポート等によって変化します。けれども、デフォルトのマッピングでは、Y 座標は一番下から一番上までを -1.〜 1.の範囲で表し、X 座標は、画面の幅/高さの比の値を aspect とした場合、左から右へ、-aspect 〜 +aspect の範囲で表されます。デフォルトの場合では、(0,0)がオブジェクトの中央になり、(-aspect,1.)が左上隅、(aspect, -1)が右下隅になります。

通常、ユーザのイベントはスクリーン上の絶対座標で与えられるという点に注意して下さい。この絶対スクリーン座標から相対ワールド座標への変換に関しては、 sketch.screentoworld() sketch.worldtoscreen() メソッドを参照して下さい。