57
SSAW08 第7回 Jitter入門 Ⅱ OpenGLを用いた3Dグラフィクス 2008年6月10日

Ssaw08 0610

Embed Size (px)

Citation preview

Page 1: Ssaw08 0610

SSAW08 第7回Jitter入門 ⅡOpenGLを用いた3Dグラフィクス2008年6月10日

Page 2: Ssaw08 0610

今日の内容

• OpenGLを用いた3Dグラフィクスの描画:基本編• OpenGLについて• OpenGL描画の基本• 3Dプリミティブ図形の生成• ライティングとシェーデイング• 物体の大きさ、位置、色の設定• より詳細な色の設定• 視点の移動、視野角の変更• テクスチャの使用

• OpenGLを用いた3Dグラフィクスの描画:応用編• 複数の物体を一括して描画するには?• jit.noise + jit.iterをもちいて、物体を複製• MSPのオブジェクトを用いて、物体の場所をあるごリズミックに決定• jit.nurbを使ってみる• jit.nurbをサウンドファイルで変形させる

Page 3: Ssaw08 0610

OpenGLとは

• Silicon Graphics社が中心となって開発された、グラフィックス処理のためのプログラミングインターフェース。

• SGIのワークステーション向けに開発されたGLをベースに、ハードウェアやOSに依存しない形に改良したもの

• 3次元グラフィックスに関する機能が充実している• テクスチャマッピングやZバッファ法、グローシェーディングなど

• パソコンに3Dグラフィックスアクセラレータが搭載されている場合は、OpenGLでハードウェアを直接制御して、その持てる機能を最大限に生かすことができる• 比較:DirectX

Page 4: Ssaw08 0610

OpenGL描画の基本

• jit.gl.renderオブジェクト• JitterにおけるすべてのOpenGLグラフィックスは、jit.gl.renderオブジェクトを用いて描画される

• 使い方:「jit.gl.render 送り先の名前」• 例:「 jit.gl.render hoge」helloという名前の送り先ウィンドウに描画するjit.gl.render オブジェクトを生成

• jit.qt.movieと同様に"bang"を第1インレットに受けると、描画を更新する• qmetroを用いて定期的に描画を更新• ただし、一度描画した内容は、"erase"メッセージを入力しないとクリアされない

• triggerを用いて、"bang"と"erase"を交互に送る工夫が必要となる

Page 5: Ssaw08 0610

OpenGL描画の基本

Page 6: Ssaw08 0610

jit.gl.gridshapeオブジェクト

• jit.gl.gridshapeオブジェクト• 単純な3Dジオメトリを生成する• 扱える図形• sphere、torus、cylinder、opencyclinder、cube、opencube、plane、circle

• 生成された結果を、jit.gl.renderオブジェクトに接続する• 影や光沢の無い)3D図形が描かれるはず

Page 7: Ssaw08 0610

3Dプリミティブ図形の生成

Page 8: Ssaw08 0610

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

• 光線の設定や影の付け方の設定• jit.gl.gridshapeオブジェクトに「lighting_enable 1」というメッセージを送る• 物体に環境光があてられる→陰影がつく

• jit.gl.gridshapeオブジェクトに「smooth_shading 1」というメッセージを送る• 図形の曲面を滑らかに塗る(スムース・シェーディング)

Page 9: Ssaw08 0610

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

Page 10: Ssaw08 0610

マウスで物体を回転・移動

• jit.gl.handleオブジェクト• マウスで3Dモデルを回転・移動させることができる• 画面上でドラッグすることで回転• 画面上でcommand-clickで位置の移動• 画面上でoption-clickで拡大縮小

• 出力をjit.gl.gridshapeに送る• jit.gl.gridshapeに「autorotate 1」というメッセージを送ると、設定した回転が持続する

Page 11: Ssaw08 0610

マウスで物体を回転・移動

Page 12: Ssaw08 0610

基本パッチの完成

Page 13: Ssaw08 0610

物体の大きさ、位置、色の設定

• jit.gl.gridshapeオブジェクトにメッセージを送る• 物体の大きさ「scale xスケール yスケール zスケール」x, y, zは1.0を基準とした比率

• 物体の位置「scale x y z」x, y, z軸状の位置• 物体の色「scale r g b」r, g, bは赤・緑・青の混ぜる割合

Page 14: Ssaw08 0610

物体の大きさ、位置、色の設定

Page 15: Ssaw08 0610

より詳細な色の設定

• シェーディングの原理• 拡散反射(diffuse):光沢の無い物体表面で起こる反射、すべての方向に一様に散乱する

• 鏡面反射(specular):鏡の面の反射のように、法線に対して入射光の反対方向に強く反射する成分

• 環境光反射(ambient):光源からの直接光の他に2次反射、3次反射により全ての方向から照らされる光の成分

• この3つの成分を調整して物体の色、質感を細かく設定できる

Page 16: Ssaw08 0610

より詳細な色の設定

• 物体そのものの色、物体を照らす光線、それぞれに設定できる• 物体そのものの色• mat_diffuse:拡散反射• mat_specular:鏡面反射• mat_ambient:環境光反射• 色の設定をjit.gl.gridshapeオブジェクトにメッセージとして送る

Page 17: Ssaw08 0610

より詳細な色の設定

• 物体を照らす光線の色• light_diffuse:拡散反射• light_specular:鏡面反射• light_ambient:環境光反射• 色の設定をjit.gl.renderオブジェクトにメッセージとして送る

Page 18: Ssaw08 0610

より詳細な色の設定

• 画面書き換えの際の色:erase_color• qmetroによる画面の更新の際に更新する色を指定することが可能• alphaの値を1より小さくすると、フェードがかかったような効果が得られる

Page 19: Ssaw08 0610

より詳細な色の設定

Page 20: Ssaw08 0610

視点(カメラ)の設定

• jit.gl.renderにメッセージを送る• 「camera x y z」:xyz軸上のカメラの位置を指定• 「up x y z」:xyz軸をそれぞれ回転軸にしたカメラの向き• 「lookat x y z」:注視点• lens_angle:視野角の設定、値が大きいほど広角レンズのようなゆがみが生じる

• ortho:オーソグラフィックプロジェクションのon/off、onにした場合、カメラ位置によってオブジェクトの大きさが縮小されない。3DCADの画面のような状態•

Page 21: Ssaw08 0610

視点(カメラ)の設定

Page 22: Ssaw08 0610

テクスチャの使用

• テクスチャとは• ジオメトリを覆う画像• テクスチャに名前をつけて、jit.gl.renderオブジェクトが持つ• jit.gl.renderオブジェクトと結び付いた描画コンテキストに加えられた他のオブジェクト(jit.gl.gridshapeなど)は、その jit.gl.renderオブジェクトが持つ名前が付いた任意のテクスチャを使えるようになる

Page 23: Ssaw08 0610

テクスチャの使用

• テクスチャ貼付けの手順• テクスチャの生成:jit.gl.renderに「textuer picture 128 128」のようにメッセージを投げる

• 数字はテクスチャのサイズ、大きいほど解像度の細かい画像となる、2の階数を用いる

• jit.gl.gridshapeに「texture picture」というメッセージを送る• 物体にテクスチャが貼られる

Page 24: Ssaw08 0610

テクスチャの使用

• マッピングモード• 3つのモードがある• object linear:テクスチャをオブジェクト座標系に対して固定した形式で貼り付け

• eye linear:視覚の座標系に対して固定した形式でテクスチャを貼り付け

• sphere map:一般に環境マッピングと呼ばれる効果を生み出し、オブジェクトは周囲の環境を反射したかのようにレンダリングされ、テクスチャが周囲の環境のスフェアマッピングされたイメージを含んでいるように見せる

Page 25: Ssaw08 0610

テクスチャの使用

• テクスチャの向き• 2つの向き:4次元の均一な座標における各ベクトル• tex_plane_s:水平方向のベクトル• tex_plane_t:垂直方向のベクトル

Page 26: Ssaw08 0610

テクスチャの使用

Page 27: Ssaw08 0610

複数のOpenGLジオメトリの生成

• 複数のジオメトリ(物体)を一つの画面に描くには• 一番単純な方法:複数のjit.gridshapeを作成し、同じ名前を名付けてjit.renderに送る

• 色や位置、形態などを変化させると複数の物体が描画されていることが確認できる

• 全ての物体を書き出すのは、面倒…

Page 28: Ssaw08 0610

複数のOpenGLジオメトリの生成

Page 29: Ssaw08 0610

複数のOpenGLジオメトリの生成

Page 30: Ssaw08 0610

3Dジオメトリのパラメータ管理

• 複数の物体を生成する、もっと賢い方法はないか?• 基本となる形をもとに、位置、色などのパラメータだけ変化させて、指定した数だけ複製する

• 以下の機能が必要• パラメータ設定 x 物体の個数、を格納する機能• パラメータを変化させながら物体を設定した個数分複製していく機能

Page 31: Ssaw08 0610

3Dジオメトリのパラメータ管理

• 3Dオブジェクトに関する膨大なパラメータをどのように管理すればよいのか?

• 例えば、物体の位置(position x, y, z)の場合• 3 x [物体の個数] のパラメータが必要

x

y

z

(x,y,z)

(x,y,z)

(x,y,z)

(x,y,z)

Page 32: Ssaw08 0610

3Dジオメトリのパラメータ管理

• よくみると、表形式のデータになっている• マトリクスで表現できるのではないだろうか?

x y z

0.132 0.335 0.612

0.52 0.667 0.982

1.546 0.224 0.541

0.336 0.246 0.998

... ... ...

Page 33: Ssaw08 0610

3Dジオメトリのパラメータ管理

• 「1 x [ジオメトリの個数] x 3 plane」というマトリクスで物体の位置情報を管理してみる

• それぞれのplaneの濃度が、(x, y, z)の位置に相当する

R:x座標を格納

G:y座標を格納

B:z座標を格納

物体の個数

Page 34: Ssaw08 0610

3Dジオメトリのパラメータ管理

• 1x10の、ランダムに生成されたRGBのプレーンから成るマトリクスを生成してみる

• jit.noiseを使用

Page 35: Ssaw08 0610

3Dジオメトリのパラメータ管理

• position x, y, zのデータとして使用するには、マトリクスに格納された情報をリストに分解して取り出さなくては成らない

• jit.iterを使用する• マトリクスの一つ一つの情報を、プレーンに分解し、リスト形式でマトリクスの数だけ繰り返し出力する

Page 36: Ssaw08 0610

3Dジオメトリのパラメータ管理

• jit.noiseで生成したマトリクスを、jit.iterを用いてposition x y z の形式のリストに分解

Page 37: Ssaw08 0610

3Dジオメトリのパラメータ管理

• 下記の順序で、ランダムな座標のcubeを複製する• jit.noiseでランダムな値のマトリクスを生成• マトリクスの値を整える(オフセット、範囲)• 情報をマトリクスに格納• jit.iterを用いて、位置情報のリストに変換• 変換した座標の位置に、git.gridshapeを用いてcubeを生成する• jit.renderで表示

Page 38: Ssaw08 0610

3Dジオメトリのパラメータ管理

Page 39: Ssaw08 0610

3Dジオメトリのパラメータ管理

Page 40: Ssaw08 0610

3Dジオメトリのパラメータ管理

• 座標変化の際の動きをスムーズに補完したい• jit.slideを用いる• 座標の変化の差分をslide_up、slide_downを設定、滑らかに補完する

Page 41: Ssaw08 0610

3Dジオメトリのパラメータ管理

Page 42: Ssaw08 0610

3Dジオメトリのパラメータ管理

Page 43: Ssaw08 0610

シグナルでマトリクスをコントロール

• MSPでシグナルを生成し、その情報でアルゴリズミックに物体の位置をコントロールする

• 例えば、cycle~を用いて、x, y, z座標それぞれを別々の周波数でコントロールしてみる

• シグナルをマトリクスに変換する• jit.poke~を用いる• jit.poke~ マトリクス名 次元1 次元2...

Page 44: Ssaw08 0610

• x, y, zそれぞれ周波数の違うsin波の値を座標に適用

シグナルでマトリクスをコントロール

x座標(R)

y座標(G)

z座標(B)

Page 45: Ssaw08 0610

• sin波で計算した座標を適用するマトリクスを、phasor~(鋸形波)で順番にスキャンしていく

シグナルでマトリクスをコントロールマトリクスの個数

Page 46: Ssaw08 0610

シグナルでマトリクスをコントロール

Page 47: Ssaw08 0610

シグナルでマトリクスをコントロール

Page 48: Ssaw08 0610

NURB曲面を使ってみる

• NURB曲面とは• 非一様有理Bスプライン(Non-Uniform Rational B-Spline)の略• ベジェ曲線のように、コントロールポイントによって曲面の形状を制御できる

• 少数のコントロールポイントで、滑らかで、正確な形状をつくることができる

• 自動車などの工業製品のモデリングにも使用されている

Page 49: Ssaw08 0610

NURB曲面を使ってみる

• JitterでNURB曲面を生成する• jit.gl.nurbsを使用する• 4つのプレーンから成るマトリクスをコントロールポイントとして指定する

• (x, y, z, w) ※w → weight(重み)

Page 50: Ssaw08 0610

• 例)コントロールポイントが4つある場合• 4 x 4のマトリクスが必要

NURB曲面を使ってみる

x y z w

0.124 0.981 0.593 0.442

0.536 0.832 0.4221 0.874

0.981 0.536 0.593 0.442

0.593 0.442 0.124 0.832

Page 51: Ssaw08 0610

NURB曲面を使ってみる

• jit.noiseで、NURBのコントロールポイントをランダムに生成する• jit.slideを用いて、値の変化を補完する• 生成したマトリクスをそのままjit.gl.nurbのコントロールポイントに• prepend ctlmatrixする

Page 52: Ssaw08 0610

NURB曲面を使ってみる

Page 53: Ssaw08 0610

NURB曲面を使ってみる

Page 54: Ssaw08 0610

サウンドファイルのシグナル情報をNURB曲面に変換する

• sfplay~を用いて、サウンドファイルのシグナルを読み込み、その情報をもとにNURB曲面を生成してみる

Page 55: Ssaw08 0610

サウンドファイルのシグナル情報をNURB曲面に変換する

• 生成の手順• サウンドを512フレームずつマトリクスへ• さらに30 x 10のマトリクスに変換• マトリクスを3列に分解• 分解した列をRGBのプレーンに対応させて10x10のマトリクスに再合成

• サウンドのマトリクスを取り出し• 滑らかに変化を補完• 全体の値を増幅• コントロールポイントに当てはめる• NURB曲面の生成

Page 56: Ssaw08 0610

サウンドファイルのシグナル情報をNURB曲面に変換する

Page 57: Ssaw08 0610

サウンドファイルのシグナル情報をNURB曲面に変換する