Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Перемещение определенного объекта в OpenGL C Linux

Автор вопроса: Hugo GonçalvesОтветов: 2

У меня проблема с перемещением определенного объекта в OpenGL с помощью C.

КОД объекта

glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1, 0.73, 0.06);
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
glPushMatrix();
glMatrixMode(GL_MODELVIEW);
glRotatef(0,PacX,PacY,0);
glBegin(GL_QUADS);
    glVertex2f(ax, ay);
    glVertex2f(bx, by);
    glVertex2f(cx, cy);
    glVertex2f(dx, dy);
glEnd();
glPopMatrix();
glFlush();

Это нарисует квадрат, но в окне у меня есть другие объекты, поэтому, когда я пытаюсь переместить только квадрат с помощью glTranslatef(), он перемещает все объекты, есть ли способ или переменная, где я могу сохранить указатель или идентификатор для квадрат, так что я могу двигаться только квадрат?

clinuxopenglglut

Ответы

Ответ 1 · рейтинг 2 · unwind

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

См. функцию glPushMatrix().

Ответ 2 · рейтинг 1 · Edwin Buck

Прочтите о списках отображения OpenGL и разместите список отображения в видеокарте. Из руководства по программированию OpenGL

/* Create display list with Torus and initialize state*/
static void init(void)
{
   theTorus = glGenLists (1);
   glNewList(theTorus, GL_COMPILE);
   torus(8, 25);
   glEndList();

   glShadeModel(GL_FLAT);
   glClearColor(0.0, 0.0, 0.0, 0.0);
}

где torus(8, 25) вызывает функцию, которая рисует элементы, захваченные в theTorus окружающими функциями glNewList(...) и glEndList(). Тогда ваш рисунок больше похож на

void display(void)
{
   glClear(GL_COLOR_BUFFER_BIT);
   glColor3f (1.0, 1.0, 1.0);
   glCallList(theTorus);
   glFlush();
}

это означает, что вы можете изменить окружение перед рисованием тора, вызывая различные glRotatef(...) и другие вызовы масштабирования и преобразования.

Весь пример, ссылки на который я брал из , доступен здесь.

С помощью нескольких дополнительных структур данных вы можете хранить ориентацию объекта в структуре, применять преобразования к среде, а затем рисовать конкретный список отображения. Не забудьте отменить преобразование среды после этого, и тогда вы эффективно повернете, переместите или сделаете что-то еще с одним объектом, представленным в списке отображения.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы