【发布时间】:2011-03-10 07:31:01
【问题描述】:
当声明为局部变量时,不会发生旋转 GLfloat 对象。当它被声明为全局时,它会相应地旋转,它需要全局的原因是什么? OpenGL程序的display()函数是否调用了别的东西?
【问题讨论】:
-
A
GLfloat是一个数字。 “旋转”它是什么意思?从 9 变为 6 ;-)?
当声明为局部变量时,不会发生旋转 GLfloat 对象。当它被声明为全局时,它会相应地旋转,它需要全局的原因是什么? OpenGL程序的display()函数是否调用了别的东西?
【问题讨论】:
GLfloat 是一个数字。 “旋转”它是什么意思?从 9 变为 6 ;-)?
我在想的是,您可能正在尝试做这样的事情(函数中的 rot 不是全局的):
GLfloat rot = 0.1;
glRotatef(rot, 0.0f, 1.0f, 0.0f);
它不会旋转之后绘制的对象。
这是因为glRotatef 使用绝对旋转。您将 0.1 的恒定旋转应用于您绘制的每个图像,因此它们不会移动。
您不必全局存储rot,您可以将其与您旋转的对象的模型一起存储并像这样:
glRotatef(myObj->rotation, 0.0f, 1.0f, 0.0f);
... draw myObj->triangles ...
myObj->rotation += speed; // speed can be e.g. 0.1
请注意:请记住,如果您在渲染功能中执行myObj->rotation += speed;,您的旋转速度将与您的渲染速度成正比(在更快的计算机上更快),这通常是不希望的。为避免这种情况,您可以检查经过的时间,并且仅在该时间超过 50 毫秒时才对其进行评估。
【讨论】:
Answer。
回应您的评论
但是如何创建对象的模型?我只是使用 glVertex3f() 之类的简单函数
您可以通过多种方式将模型与渲染(调用 glVertex、glColor...)分开,而不是对 glVertex、glColor... 进行硬编码。先说通俗易懂(但效率低下)的版本:三角形链表:
#define triangleList struct _triangleList
struct _triangleList {
float ax, ay, az, bx, by, bz, cx, cy, cz;
triangleList* next; // this has to be a null-pointer if this is the last link
}
以及使用它们的模型结构:
#define model struct _model
struct _model {
float rotationX;
triangleList* firstTriangle;
}
然后你可以制作一个通用的 renderFunction:
void myRenderFunc(model* aModel) {
triangleList* current = aModel->firstTriangle;
glBegin(GL_TRIANGLES);
glRotate(aModel->rotationX,1.0,0.0,0.0);
while(current!=0) {
glVertex3f(current->ax,current->ay,current->az);
...
current = current -> next;
}
glEnd();
}
现在您有了一个通用(但速度较慢)的渲染函数:要渲染新模型,您不必编写 glBegins/glVertex/glColor...,只需创建一个新模型并将其提供给 renderFunc(您必须将其扩展为支持颜色...)。现在快速提及如何更快地做到这一点(如果需要的话):而不是调用 glVertex... 阅读有关顶点数组甚至顶点缓冲区对象的信息。但是,将模型与渲染功能分开的一般想法也适用于这些。
【讨论】: