OpenTKを使って立方体を描画してみましょう。

OpenGLはC#では使えないのか? 疑問に思い調べてみたところ、OpenTK というライブラリがあることがわかりました。そこでOpenTKを使ってみることにします。

OpenTKはOpenGLのコマンドをそのまま使えるようなシンプルさが特徴です。

まずはここからダウンロードしてインストールしましょう。

OpenTK をダウンロードしてインストールする

opentk-1.0.0-rc1.exeというファイルをダウンロードすることができるのでインストールしてみましょう。

[ソリューション エクスプローラー] の中から [参照設定] を右クリックして、[参照の追加] を選択します。するとダイアログが出てくるので、OpenTK.dll と OpenTK.GLControl.dll の2つを選択して追加します。

しかしこれだけでは自動で [ツールボックス] にOpenTK のコントロールが表示されません。そこでどうするか? Form1.Designer.csを編集する方法もあるのですが、OpenTK.GLControlを継承して新しいクラスを作成します。

これならForm1.Designer.csを編集しなくても、[ツールボックス] にGLControlExが表示されるようになります。

まずコントロールがロードされたらProjection の設定と視界の設定をおこないます。

SetProjection()メソッドでやることはビューポートの設定と視体積の設定です。視体積の設定するとき MatrixMode を変更するのですが、終わったらGL.MatrixMode(MatrixMode.Modelview)メソッドで戻します。

視界の設定をしているのが自作メソッドのSetInitSight()です。視点を(0, 0, 3.0)の位置に設定しています。

それからフォームの大きさがかわったときにコントロールの大きさを変更します。クライアント領域にいっぱいに貼り付けるわけです。そこで glControl_Resize メソッドを呼び出し、glControlが全面に表示されるようにしています。

glControl.Refresh();が実行されるとPaintイベントが発生するのですが、このときに何を表示させるのかを記述する必要があります。ここでは立方体を表示させます。そして立体に見えるように光が当たっている部分と影になっている部分をつくります。

DrawCube()は立方体を表示させるための自作メソッドです。原点を中心に6つの正方形の平面を描画しています。

これで実行すると立方体が表示されますが、立方体ではなくただの正方形です。最前面にある面の向こう側に他の面が隠れているからです。立方体らしくするためには立方体を斜めの位置からみる必要があります。そこで視点を変更できるようにします。

方向キーが押されたら視点をその方向に移動させます。

視点を立方体を中心に球面上を移動するように移動させます。どれだけ移動したかはフィールド変数に格納して記憶しておきます。自作メソッドのDraw()では新しい視点の設定とglControl.Refresh()メソッドの呼び出しを行ないます。

自作メソッドSetOfSight()で新しい場所に視界を設定するのですが、視界が上下に移動する場合、向こう側に移動してしまうと上下が逆になってしまいます。そのためMath.Cos(b)が負数になる場合は上下を反転しています。