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

У меня проблема с перемещением определенного объекта в 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(), он перемещает все объекты, есть ли способ или переменная, где я могу сохранить указатель или идентификатор для квадрат, так что я могу двигаться только квадрат?


person Hugo Gonçalves    schedule 24.05.2012    source источник


Ответы (2)


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

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

person unwind    schedule 24.05.2012
comment
но glPushMatrix не возвращает никакого значения, так как я могу сохранить значение объекта и вернуть его, чтобы переместить? - person Hugo Gonçalves; 24.05.2012
comment
@ user1343820: OpenGL не хранит объекты, не поддерживает сцену. Он просто рисует точки, линии на треугольниках. Вы отправляете команды рисования, OpenGL рисует каждую линию, точку или треугольник по отдельности и забывает об этом. Если вы хотите что-то изменить, вы должны перерисовать сцену. - person datenwolf; 24.05.2012
comment
для перемещения и объекта я использую glTranslatef (x, y, z), но он перемещает все объекты на сцене, мой вопрос: возможно ли, чтобы пользователь glTranslatef () перемещал только один конкретный объект? - person Hugo Gonçalves; 24.05.2012
comment
@user1343820 user1343820 Посмотрите, что такое stack и как механизм OpenGL использует его, чтобы отслеживать, какие преобразования выполнять для текущего рендеринга. Если вам нужны разные переводы для разных частей, вам нужно отправить текущую матрицу, внести необходимые изменения, отрендерить, а затем вытолкнуть стек, чтобы получить старую матрицу и отрендерить остальное. - person HonkyTonk; 24.05.2012
comment
Просто сохраните расположение объекта внутри объекта и вызовите glTranslate(), где вы вызываете 'glRotatef(0,PacX,PacY,0);'. Вот как это делается. - person Stephan van den Heuvel; 24.05.2012

Прочтите о списках отображения 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(...) и другие вызовы масштабирования и преобразования.

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

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

person Edwin Buck    schedule 24.05.2012
comment
@HugoGonçalves Я рад это слышать. - person Edwin Buck; 20.03.2016