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
インターフェイス¶
上記サンプルコードで使った GLViewControl
は IView
インターフェイスを実装しています。
下記に IView
インターフェイスの定義の一部を抜粋しました。
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
メソッドがあるだけの非常にシンプルなインターフェイスです。
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; }
}
ISceneGraph
に IScene
オブジェクトを登録すると、そのシーンがビューに描画されます。
登録先には次の4種類があります。
登録先 | 座標系 |
---|---|
WorldScenes | ワールド座標系 |
CameraScenes | カメラ座標系 |
ForegroundScenes | スクリーン座標系(前景) |
BackgroundScenes | スクリーン座標系(背景) |
通常の3Dオブジェクトは WorldScenes に登録してください。
カメラ座標系は、カメラの注視点(画面中央)を原点として、右方向をX軸、上方向をY軸とする座標系です。 スケールはワールド座標系と同じです。
スクリーン座標系は、原点は左上の隅にあり、Y軸は下向きです。 まず背景 BackgroundScenes が描画され、最後に前景 ForegroundScenes が描画されます。