0

私は OpenTK ツールを使用して c# で OpenGL を使用しています。

私の問題は次のとおりです。最初に、glwindows で線を使用して図形を描画したい場合、ボタン MouseDown イベントで線の描画を開始し、キー(e) で終了します。線の描画が終了したら、次に新しい描画を行います。行、windowsframe (ColorBufferBit) がクリアされ、何をしなければならないのかわかりません??

詳細については、線を描いているときに を呼び出し
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); 、それを終了したときに、新しい線を強制的に描画する必要があると言わ
GL.Clear(ClearBufferMask.AccumBufferBit | ClearBufferMask.DepthBufferBit);
なければなりません。ここにコードがあります

using System;
using OpenTK;
using OpenTK.Graphics;
using OpenTK.Graphics.OpenGL;
using OpenTK.Audio;
using OpenTK.Audio.OpenAL;
using OpenTK.Input;
using System.Drawing;
using System.Drawing.Imaging;

namespace FarmApp
{
class openGLfarm : GameWindow
{
    bool flage, chechFirst;
    float XMouseBegin_first, YMouseBegin_first;
    //-----------------------------
    public openGLfarm(GraphicsMode mode)
        : base(700, 700, GraphicsMode.Default, "O Sample")
    {
        VSync = VSyncMode.On;
        chechFirst = true;
        Mouse.ButtonDown += new EventHandler<MouseButtonEventArgs>(Mouse_ButtonDown);
        Mouse.ButtonUp += new EventHandler<MouseButtonEventArgs>(Mouse_ButtonUp);
        Mouse.Move += new EventHandler<MouseMoveEventArgs>(Mouse_Move);

        Mouse.ButtonDown += new EventHandler<MouseButtonEventArgs>(Mouse_ButtonDown);
        Mouse.ButtonUp += new EventHandler<MouseButtonEventArgs>(Mouse_ButtonUp);
        Mouse.Move += new EventHandler<MouseMoveEventArgs>(Mouse_Move);


    }
    //-------------------------------
         public openGLfarm()
    {
        // TODO: Complete member initialization
    }


    void Mouse_Move(object sender, MouseMoveEventArgs e)
    {
        // Now use mouse_delta to move the camera
    }

    void Mouse_ButtonUp(object sender, MouseButtonEventArgs e)
    {
        switch (e.Button)
        {
            case MouseButton.Left:
                {
                    flage = true;
                    if (chechFirst)
                    {
                        chechFirst = false;
                        XMouseBegin_first = Mouse.X;
                        YMouseBegin_first = Mouse.Y;

                    }
                    break;
                }
            case MouseButton.Middle:
                ///camera_mode = ECameraMode.CAMERA_DOLLY;
                break;
            case MouseButton.Right:
                //camera_mode = ECameraMode.CAMERA_ORBIT;
                break;
        }

    }

    void Mouse_ButtonDown(object sender, MouseButtonEventArgs e)
    {
        switch (e.Button)
        {
            case MouseButton.Left:
                {
                    break;
                }
            case MouseButton.Middle:
                ///camera_mode = ECameraMode.CAMERA_DOLLY;
                break;
            case MouseButton.Right:
                //camera_mode = ECameraMode.CAMERA_ORBIT;
                break;
        }
    }

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
    }

    protected override void OnResize(EventArgs e)
    {
        base.OnResize(e);

    }

    protected override void OnUpdateFrame(FrameEventArgs e)
    {
        base.OnUpdateFrame(e);
        if (Keyboard[Key.Escape])
            Exit();
        if (Keyboard[Key.E])
        {
            flage = false;
            chechFirst = true;

       }
    }



    void table(float count)
    {
        float x, y;
        GL.Color4(Color4.Wheat);

        float z = (2f) / (count);
        x = -1;
        y = -1;
        for (double i = 0; i < count; i++)
        {
            GL.Begin(BeginMode.Lines);

            GL.Vertex2(x + (z), -1);
            GL.Vertex2(x + (z), 1);

            GL.End();
            x = x + (z);
        }

        for (double i = 0; i < count; i++)
        {
            GL.Begin(BeginMode.Lines);

            GL.Vertex2(-1, y + (z));
            GL.Vertex2(1, y + (z));

            GL.End();
            y = y + (z);
        }


    }
    public void DrawLine(float Xbegin, float Ybegin, float Xend, float Yend)
    {
        GL.Begin(BeginMode.Lines);
        GL.Vertex2(Xbegin, Ybegin);
        GL.Vertex2(Xend, Yend);
        GL.End();

    }
    protected override void OnRenderFrame(FrameEventArgs e)
    {
        //base.OnRenderFrame(e);
        if (chechFirst)
            GL.Clear(ClearBufferMask.AccumBufferBit | ClearBufferMask.DepthBufferBit);

        else
            GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
        GL.MatrixMode(MatrixMode.Modelview);
        GL.LoadIdentity();
        table(Form1.co);
        if (flage)
        {
            //flage = false;
            DrawLine((XMouseBegin_first / 350f - 1f), -(YMouseBegin_first / 350f - 1f), (Mouse.X / 350f - 1f), -(Mouse.Y / 350f - 1f));
        }
        SwapBuffers();
    }
}

}

4

1 に答える 1

0

たとえば、Vector2の配列を作成し、その開始点と終了点を保存することができます。次に、線を描画する関数で、線を作成し、それらすべてを描画します。

于 2012-07-11T07:20:13.710 に答える