.. :tocdepth:2 ============================ MoNo.Graphics.GLViewControl ============================ GLViewControl は MoNo.OpenGL.GLControl の派生クラスです。 内部に SceneGraph を持ち、SceneGraph に登録されたシーンオブジェクトを描画します。 プロジェクトション行列の設定やマウスによるビュー操作など、便利で基本的な機能が実装されています。 LINQPad で動かしてみる ================================ LINQPad を立ち上げ、次の設定をします。 * 参照設定に MoNo.dll, MoNo.OpenGL.dll, MoNo.Basics.dll, MoNo.Framework.dll を加える。 * インポートする namespace に MoNo, MoNo.OpenGL, System.Windows.Forms を加える。 * Language を F# Expression にする。 次のコードを実行すると OpenGL ビューに直線が表示されます。 .. code-block:: fsharp let form = new Form() let view = new Graphics.GLViewControl(Dock = DockStyle.Fill) form.Controls.Add view form.Show() view.SceneGraph.WorldScenes.Add(fun sc -> MGL.DrawArrays (GLPrimType.Lines, [| Point3d.Zero; Point3d(0.5, 0.7, 0.) |]) ) |> ignore MoNo.OpenGL.GLControl のサンプルコードと非常によく似ていますが、動かしてみると以下の違いがあります。 * 右下にモノコミュニティ社の企業ロゴが表示されます。 この表示はモノコミュニティ社より発行されるライセンスDLLを設定することで消去することが出来ます。 * マウスによるビュー操作(右ドラッグで回転、Shift+右ドラッグでパン、ホイールで拡大縮小、etc)が出来ます。 次のコードを書き加えると座標軸が描画されます。 .. code-block:: fsharp view.SceneGraph.WorldScenes.Add(Graphics.Scenes.AxisScene()) ``IView`` インターフェイス ======================================== 上記サンプルコードで使った ``GLViewControl`` は ``IView`` インターフェイスを実装しています。 下記に ``IView`` インターフェイスの定義の一部を抜粋しました。 .. code-block:: csharp public interface IViewContext { void Invalidate(); // ビュー領域全体を無効化し、描画メッセージを送信します。 void Refresh(); // ビューを強制的に即時再描画します。 ... } public interface IView : IViewContext { ICamera Camera { get; } // ビューを描画するためのカメラ情報 ISceneGraph SceneGraph { get; } // ビューに関連付けられたシーングラフ ... } ``IView`` の ``SceneGraph`` プロパティにシーンオブジェクトを登録することにより、OpenGLによる描画が行われます。 ``ISceneGraph`` インターフェイスと ``IScene`` インターフェイス ==================================================================== まず ``IScene`` インターフェイスが(C# で)次のように定義されています。 ``Draw`` メソッドがあるだけの非常にシンプルなインターフェイスです。 .. code-block:: csharp public interface IScene { void Draw( ISceneContext sc ); } 続いて ``ISceneGraph`` インターフェイスは次のように定義されています。 .. code-block:: csharp public interface ISceneHolder : Core.IBreath { BoundarySceneCollection WorldScenes { get; } SceneCollection CameraScenes { get; } SceneCollection BackgroundScenes { get; } SceneCollection ForegroundScenes { get; } } public interface ISceneGraph : ISceneHolder, ... { Light[] Lights { get; set; } } ``ISceneGraph`` に ``IScene`` オブジェクトを登録すると、そのシーンがビューに描画されます。 登録先には次の4種類があります。 ================= ==================== 登録先 座標系 ================= ==================== WorldScenes ワールド座標系 CameraScenes カメラ座標系 ForegroundScenes スクリーン座標系(前景) BackgroundScenes スクリーン座標系(背景) ================= ==================== 通常の3Dオブジェクトは WorldScenes に登録してください。 カメラ座標系は、カメラの注視点(画面中央)を原点として、右方向をX軸、上方向をY軸とする座標系です。 スケールはワールド座標系と同じです。 スクリーン座標系は、原点は左上の隅にあり、Y軸は下向きです。 まず背景 BackgroundScenes が描画され、最後に前景 ForegroundScenes が描画されます。