如何用CSGL旋转三角形(顺时针方向)?

时间:2010-12-21 21:26:28

标签: c# visual-studio-2008 opengl transform

我正在尝试制作一个顺时针旋转的三角形,但我不能。我做了一个定时器控制,但没有定时器的结果是一样的。因此,下面的代码不显示旋转三角形。 如何用CSGL旋转三角形?

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

        private float a = 0.0f;
        private void Form1_Load(object sender, EventArgs e)
        {

            timer1.Start();
        }

        protected void Gosterim()
        {
            GL.glClear(GL.GL_COLOR_BUFFER_BIT);
            GL.glLoadIdentity();
            Hesapla();
            Ucgen();

        }
        protected void ayarlar()
        {
            GL.glClearColor(1, 1, 1, 1);
            GL.glShadeModel(GL.GL_FLAT);
        }
        protected void Hesapla()
        {
            a += 0.5f;
            this.Refresh();
        }

        protected void Ucgen()
        {
            GL.glColor3f(0, 1, 1);
            GL.glRotatef(a, 0, 0, -1);
            GL.glBegin(GL.GL_TRIANGLES);
            GL.glVertex2f(-0.2f, -0.2f);
            GL.glVertex2f(0.2f, -0.2f);
            GL.glVertex2f(0.0f, 0.2f);
            GL.glEnd();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            ayarlar();

            Gosterim();
        }
    }

2 个答案:

答案 0 :(得分:1)

从发布的代码中我看到了几件事:

  1. 您没有任何矩阵设置。虽然您可以使用默认矩阵,但您几乎肯定会指定自己的矩阵,以确保三角形符合您的预期。默认矩阵 应该在这里工作,因为它们指定了身份模型视图和投影。

  2. 您没有调用交换缓冲区。完成绘图后需要调用以交换前后缓冲区,以便显示三角形。对于CsGL,我认为您可以使用SwapBuffer()方法。

  3. 请勿使用计时器来重绘。定时器在使用Windows消息泵时工作不可靠,很难从中获得好的结果。相反,你应该使用一个渲染循环 - 一个循环,它运行你的程序运行的整个时间,只是不断刷新屏幕。您必须确保为操作系统提供时间来处理您的消息。一个非常简单的渲染循环可能是:

    void RenderLoop() {
      while (true) {
        SetUpCamera();
        CreateGeometry();
        SwapBuffers();
        Application.DoEvents(); // this lets windows process messages
      }
    }
    

    请注意,有更好的方法可以在C#中获得良好的消息循环,但这很容易设置和推理。

答案 1 :(得分:0)

仔细检查这一行:

GL.glRotatef(a, 0, 0, -1);

不应该吗?

GL.glRotatef(a, 0, 0, 1);

看起来你的旋转角度(a)的增量应该没问题....但是计时器“滴答”并开火ayarlarGosterim的速度有多快?

另外你可能想要添加一个关于旋转角度的检查,如果它循环很多并且超过359.5(因为你每次增加0.5),那么你将逐字地“完整圆”