0

我在使用 C 移动 OpenGL 中的特定对象时遇到问题。

对象代码

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() 仅移动正方形时,它会移动所有对象,是否有一种方法或变量可以存储指针或 ID 到广场所以我只能移动广场?

4

2 回答 2

1

您需要保存和恢复每个对象的变换矩阵,以便每个对象都有自己的矩阵。

glPushMatrix()功能。

于 2012-05-24T10:31:59.687 回答
0

阅读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);
}

where调用一个函数,该函数绘制由环境和函数torus(8, 25)捕获的元素。然后你的画看起来更像theTorusglNewList(...)glEndList()

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

这意味着您可以在绘制圆环之前通过调用各种glRotatef(...)缩放和转换调用来改变环境。

可以在此处访问我从中提取引用的整个示例。

使用一些额外的数据结构,您可以将对象的方向保存在结构中,将变换应用于环境,然后绘制特定的显示列表。之后不要记得取消应用环境的转换,然后您将有效地旋转、移动或对显示列表中表示的单个对象执行任何操作。

于 2012-05-24T14:14:39.533 回答