0

WindowsフォームでGLControl(OpenTK)を使用していくつかの図をペイントします。ただし、問題は、GL.Ortho()メソッドの使用方法がわからないことです。

これが私が書いたコードです:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void GlControlPaint(object sender, PaintEventArgs e)
    {
        GlControl.MakeCurrent();
        GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);


        GL.Viewport(150, 150, 300, 300);
        //GL.Ortho(0, 1, 0, 1, -1, 1);
        GL.ClearColor(Color.White);

        PaintSquareOrBorder(BeginMode.Quads, Color.Cyan, 0.2, 0.2, 0.45, 0.2, 0.45, -0.2, 0.2, -0.2);
        PaintSquareOrBorder(BeginMode.Quads, Color.Cyan, 0.1, -0.1, 0.1, 0.1, 0.2, 0.2, 0.2, -0.2);
        PaintSquareOrBorder(BeginMode.Quads, Color.Cyan, -0.2, -0.2, -0.45, -0.2, -0.45, 0.2, -0.2, 0.2);
        PaintSquareOrBorder(BeginMode.Quads, Color.Cyan, -0.1, 0.1, -0.1, -0.1, -0.2, -0.2, -0.2, 0.2);
        PaintSquareOrBorder(BeginMode.Quads, Color.Cyan, -0.1, 0.1, -0.2, 0.2, 0.2, 0.2, 0.1, 0.1);
        PaintSquareOrBorder(BeginMode.Quads, Color.Cyan, 0.1, -0.1, 0.2, -0.2, -0.2, -0.2, -0.1, -0.1);
        PaintSquareOrBorder(BeginMode.Quads, Color.Cyan, -0.2, 0.2, -0.2, 0.45, 0.2, 0.45, 0.2, 0.2);
        PaintSquareOrBorder(BeginMode.Quads, Color.Cyan, 0.2, -0.2, 0.2, -0.45, -0.2, -0.45, -0.2, -0.2);
        PaintSquareOrBorder(BeginMode.LineLoop, Color.Black, -0.1, -0.1, 0.1, -0.1, 0.1, 0.1, -0.1, 0.1);

        PaintBordersForMainFigure();



        GlControl.SwapBuffers();
        GlControl.Refresh();

    }

    private void PaintBordersForMainFigure()
    {
        PaintLine(Color.Black, 0.2, 0.2, 0.45, 0.2);
        PaintLine(Color.Black, 0.45, 0.2, 0.45, -0.2);
        PaintLine(Color.Black, 0.45, -0.2, 0.2, -0.2);
        PaintLine(Color.Black, 0.2, -0.2, 0.2, -0.45);
        PaintLine(Color.Black, 0.2, -0.45, -0.2, -0.45);
        PaintLine(Color.Black, -0.2, -0.45, -0.2, -0.2);
        PaintLine(Color.Black, -0.2, -0.2, -0.45, -0.2);
        PaintLine(Color.Black, -0.45, -0.2, -0.45, 0.2);
        PaintLine(Color.Black, -0.45, 0.2, -0.2, 0.2);
        PaintLine(Color.Black, -0.2, 0.2, -0.2, 0.45);
        PaintLine(Color.Black, -0.2, 0.45, 0.2, 0.45);
        PaintLine(Color.Black, 0.2, 0.45, 0.2, 0.2);
    }

    private static void PaintLine(Color color, double x1, double y1, double x2, double y2)
    {
        GL.Color3(color);

        GL.Begin(BeginMode.Lines);

        GL.Vertex2(x1, y1);
        GL.Vertex2(x2, y2);

        GL.End();
    }

    private static void PaintSquareOrBorder(BeginMode beginMode, Color color, double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4)
    {
        GL.Color3(color);

        GL.Begin(beginMode);

        GL.Vertex2(x1, y1);
        GL.Vertex2(x2, y2);
        GL.Vertex2(x3, y3);
        GL.Vertex2(x4, y4);

        GL.End();
    }
}

これは私がGL.Orthoなしで得た結果です:

これは私がGL.Orthoで得たい結果です

しかし、GL.Orthoコードのコメントを外すと、次のようになります。

最初は、2Dオブジェクトのみを使用するので、Ortho2Dを使用する必要があると思いました。しかし、OpenTKにはGl.Ortho2dが存在しないことがわかりました。私が見つけた公式ドキュメントを使用すると、Ortho2dを使用する場合、nearパラメーターとfarパラメーターがそれぞれ暗黙的に-1と1に設定されるという事実を除いて、これら2の間にそれほど大きな違いはないことがわかりました。

これらのパラメータを設定すると、白い画面が表示されます。知りたいのですが、何が間違っているのでしょうか?

免責事項:スクリーンショットの結果を達成するために正確な座標は必要ありません。私はあなたが私がやろうとしていることを見ることができるようにするためにそれを使うだけです。Gl.Ortho2dを使用すると、ウィンドウが完全に空白になる理由を知りたいのですが。

4

2 に答える 2

1

問題は、GL.Ortho()が現在の行列に正投影行列を乗算することです。したがって、レンダリングされたフレームごとに、マトリックスに新しい正投影マトリックスを乗算し続けると、ビューは何も見えない場所に移動します。

そのようなものに変更すると、素晴らしいアニメーションが表示されます。

GL.Ortho(-0.99, 1, -0.99, 1, -1, 1);

GL.Ortho()呼び出しの前にこれらの2行を追加します。これにより、正投影行列と乗算する前に、行列が単位行列になります。

GL.MatrixMode(MatrixMode.Projection);
GL.LoadIdentity();
于 2013-04-16T18:18:41.260 に答える
0

これが私のプロジェクトでのやり方です。お役に立てば幸いです。しかし、なぜ私がこのようにしたのか覚えていません。

GL.MatrixMode(MatrixMode.Projection);
Matrix4 ortho = Matrix4.CreateOrthographic(glControl1.Width, glControl1.Height, 10, 3000);
GL.LoadMatrix(ref ortho);
v = Matrix4.LookAt(0, 0, 100, 0, 0, 0, 0, 1, 0);
GL.MatrixMode(MatrixMode.Modelview);
GL.LoadMatrix(ref  v);

私のビューポートはGL.Viewport(0、0、glControl1.Width、glControl1.Height);です。

于 2013-04-10T15:03:41.693 に答える