为什么GLfloat需要全球范围?

时间:2011-03-10 07:31:02

标签: c opengl glut

当声明为局部变量时,不会发生旋转GLfloat对象。当它被声明为全局时,它会相应地旋转,它需要全局的原因是什么? OpenGL程序的display()函数是否会调用其他东西?

2 个答案:

答案 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 ...读取顶点数组甚至顶点缓冲区对象。但是将模型与渲染函数分离的一般想法也适用于那些。