当声明为局部变量时,不会发生旋转GLfloat对象。当它被声明为全局时,它会相应地旋转,它需要全局的原因是什么? OpenGL程序的display()函数是否会调用其他东西?
答案 0 :(得分:5)
我在想的是你可能会尝试做这样的事情(函数中的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毫秒时进行评估。
答案 1 :(得分:2)
回应你的评论
但是如何创建我的对象模型?我只是使用像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 ...读取顶点数组甚至顶点缓冲区对象。但是将模型与渲染函数分离的一般想法也适用于那些。