2011-03-10 70 views
1

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

+5

'GLfloat'是一个数字。 “旋转”它意味着什么?从9变为6 ;-)? – 6502 2011-03-10 07:34:01

回答

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;在渲染功能你的旋转速度将与你的渲染速度成比例(在更快的计算机上更快),这通常是不希望的。为了避免这种情况,您可以检查经过的时间,并且只在该时间超过50ms时才评估。

+0

这是一个很好的答案,但是如何创建我的对象模型?我只是使用简单的函数,如glVertex3f()和glVertex2f()。 – atx 2011-03-10 07:45:01

+0

谢谢。必须发布代码来回答这个问题,所以我会做一个新的答案。 – 2011-03-10 07:49:52

+0

mayebe一个结构与顶点数组,规模,旋转,什么? – nkint 2011-03-10 07:55:17

2

在回答您的评论

但如何创建我的对象的模型?我只是用简单的功能,如glVertex3f()

而不是硬编码的glVertex,glColor ......你可以从你的渲染(在调用glVertex,glColor ...)在许多单独的模型方法。让我们先说说容易理解(但inefficent)版本:三角形的链表:

#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(); 
} 

现在你有一个通用的(但速度缓慢)renderfunction:为了使你不必写新车型glBegins/glVertex/glColor ...但只需要创建一个新的模式,并把它交给renderFunc (W你必须扩展以支持颜色......)。现在快速提及如何更快地完成它(如果需要的话):而不是调用glVertex ...阅读关于顶点数组甚至顶点缓冲区对象。但是将模型与渲染函数分离的一般想法也适用于这些。

+0

链接列表?!非常,非常奇怪的想法...但是,它的工作原理。 @malfy:1)通常,您不仅仅将rotationX存储在“Model”类中,而是根据您的应用程序存储完整的转换矩阵或[position + rotation]。 2)在glEnd()之后调用glLoadIdentity(),或者为下一个模型考虑两次* glRotate。3)当你对这些东西感觉更舒适时,考虑使用VBOs。 – Calvin1602 2011-03-10 15:16:27

+0

@ Calvin:OP是这个东西的新手,链表是这样,他不必处理更快但更难理解的东西(交错......),1)是的,我希望他会扩大他的模型最终*包含位置和旋转(当然是一个trafo矩阵)2)我通常在我的renderfunc 3)yep之前调用push + loadIdentity,也提到了VBOs,但它们之间的步骤是v-数组。 Thx为您的输入。 – 2011-03-10 15:46:38

+0

我只是想好醇'_model [1000];) – Calvin1602 2011-03-10 16:15:41

相关问题