У меня проблема с перемещением определенного объекта в 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(), он перемещает все объекты, есть ли способ или переменная, где я могу сохранить указатель или идентификатор для квадрат, так что я могу двигаться только квадрат?
Ответ 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(...) и другие вызовы масштабирования и преобразования.
Весь пример, ссылки на который я брал из , доступен здесь.
С помощью нескольких дополнительных структур данных вы можете хранить ориентацию объекта в структуре, применять преобразования к среде, а затем рисовать конкретный список отображения. Не забудьте отменить преобразование среды после этого, и тогда вы эффективно повернете, переместите или сделаете что-то еще с одним объектом, представленным в списке отображения.