Как я могу повернуть треугольник (по часовой стрелке) с CSGL? - PullRequest
0 голосов
/ 22 декабря 2010

Я пытаюсь сделать вращающийся по часовой стрелке треугольник, но не могу. Я сделал управление таймером, но результат без таймера. В результате код ниже не показывает вращающийся треугольник. Как я могу повернуть треугольник с 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 ]

1 голос
/ 22 декабря 2010

Из размещенного кода я вижу пару вещей:

  1. У вас нет никаких настроек матрицы. В то время как вы можете использовать матрицы по умолчанию, вы почти наверняка должны указать свои собственные, чтобы убедиться, что треугольник находится там, где вы ожидаете. Матрицы по умолчанию должны работать здесь, поскольку они определяют вид и проекцию идентификационной модели.

  2. У вас нет вызова для замены буферов. После завершения рисования вам нужен вызов, чтобы поменять местами передний и задний буферы, чтобы отобразился треугольник. Для CsGL я думаю, что есть метод SwapBuffer(), который вы можете использовать.

  3. Не используйте таймер для прокачки вашего перерисовки. Таймеры работают ненадежно, поскольку они используют насос сообщений Windows, и от них трудно добиться хороших результатов. Вместо этого вы должны использовать цикл рендеринга - цикл, который выполняется все время, пока ваша программа работает, и просто обновляет экран. Вы должны убедиться, что даете операционной системе время на обработку ваших сообщений. Очень простой цикл рендеринга может быть:

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

    обратите внимание, что есть лучшие способы получить хороший цикл сообщений в C #, но это легко настроить и рассуждать.

0 голосов
/ 22 декабря 2010

Дважды проверьте эту строку:

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

Разве это не должно быть?

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

Похоже, ваше приращение угла поворота (а) должно быть в порядке .... но как быстро таймер "тикает" и срабатывает ayarlar и Gosterim?

Также вы можете добавить проверку относительно угла поворота, если он многократно повторяется и превышает 359,5 (поскольку вы добавляете 0,5 каждый раз), то вы буквально «полный круг»

...