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 ビューに直線が表示されます。

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)が出来ます。

次のコードを書き加えると座標軸が描画されます。

view.SceneGraph.WorldScenes.Add(Graphics.Scenes.AxisScene())

IView インターフェイス

上記サンプルコードで使った GLViewControlIView インターフェイスを実装しています。 下記に IView インターフェイスの定義の一部を抜粋しました。

public interface IViewContext
{
  void Invalidate(); // ビュー領域全体を無効化し、描画メッセージを送信します。
  void Refresh();    // ビューを強制的に即時再描画します。
  ...
}

public interface IView : IViewContext
{
  ICamera Camera { get; }  // ビューを描画するためのカメラ情報
  ISceneGraph SceneGraph { get; }  // ビューに関連付けられたシーングラフ
  ...
}

IViewSceneGraph プロパティにシーンオブジェクトを登録することにより、OpenGLによる描画が行われます。

ISceneGraph インターフェイスと IScene インターフェイス

まず IScene インターフェイスが(C# で)次のように定義されています。 Draw メソッドがあるだけの非常にシンプルなインターフェイスです。

public interface IScene
{
  void Draw( ISceneContext sc );
}

続いて ISceneGraph インターフェイスは次のように定義されています。

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; }
}

ISceneGraphIScene オブジェクトを登録すると、そのシーンがビューに描画されます。 登録先には次の4種類があります。

登録先 座標系
WorldScenes ワールド座標系
CameraScenes カメラ座標系
ForegroundScenes スクリーン座標系(前景)
BackgroundScenes スクリーン座標系(背景)

通常の3Dオブジェクトは WorldScenes に登録してください。

カメラ座標系は、カメラの注視点(画面中央)を原点として、右方向をX軸、上方向をY軸とする座標系です。 スケールはワールド座標系と同じです。

スクリーン座標系は、原点は左上の隅にあり、Y軸は下向きです。 まず背景 BackgroundScenes が描画され、最後に前景 ForegroundScenes が描画されます。