当声明为局部变量时,不会发生旋转GLfloat对象。当它被宣布为全球性的时候,它会相应地旋转,它背后的原因是什么,它需要全球性的? OpenGL程序的display()函数是否调用别的东西?为什么GLfloat需要全局范围?
回答
什么,我的想法是,你可能会试图做这样的事情(与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时才评估。
在回答您的评论
但如何创建我的对象的模型?我只是用简单的功能,如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 ...阅读关于顶点数组甚至顶点缓冲区对象。但是将模型与渲染函数分离的一般想法也适用于这些。
链接列表?!非常,非常奇怪的想法...但是,它的工作原理。 @malfy:1)通常,您不仅仅将rotationX存储在“Model”类中,而是根据您的应用程序存储完整的转换矩阵或[position + rotation]。 2)在glEnd()之后调用glLoadIdentity(),或者为下一个模型考虑两次* glRotate。3)当你对这些东西感觉更舒适时,考虑使用VBOs。 – Calvin1602 2011-03-10 15:16:27
@ Calvin:OP是这个东西的新手,链表是这样,他不必处理更快但更难理解的东西(交错......),1)是的,我希望他会扩大他的模型最终*包含位置和旋转(当然是一个trafo矩阵)2)我通常在我的renderfunc 3)yep之前调用push + loadIdentity,也提到了VBOs,但它们之间的步骤是v-数组。 Thx为您的输入。 – 2011-03-10 15:46:38
我只是想好醇'_model [1000];) – Calvin1602 2011-03-10 16:15:41
- 1. PHP需要全局范围
- 2. 为什么coffeescript需要全局安装?
- 3. `var`在全局范围内做什么?
- 4. AngularJS指令操作需要范围摘要,为什么?
- 5. 为什么在Swift中全局范围内重载==?
- 6. 为什么不能在全局范围内使用var?
- 7. 为什么GLint和GLfloat?
- 8. 为什么在全局范围和局部范围内使用指令的行为有所不同?
- 9. JavaScript全局对象和全局范围
- 10. 宝石管理员,为什么我需要范围:在login_as helper?
- 11. 为什么范围-V3产量需要默认构造函数
- 12. 为什么我需要范围(Len))嵌套的if?
- 13. 为什么我们需要struts中的全局转发和全局异常?
- 14. 为什么在全局范围中声明的枚举不需要终止分号?
- 15. 为什么有些变量需要全局性而其他变量不需要?
- 16. 为什么在这些PHP函数中不需要全局$ var?
- 17. javascript全局变量范围
- 18. 组变量全局范围
- 19. VBA - 全局变量范围?
- 20. PHP:全局变量范围
- 21. eval()和全局范围
- 22. Server.ScriptTimeout设置全局范围?
- 23. Python全局变量范围
- 24. javascript中的全局范围和局部范围
- 25. 全局变量的“static”关键字 - 限制范围是什么?
- 26. “var”全局定义变量的范围是什么?
- 27. Drupal页面中全局PHP变量的范围是什么?
- 28. 为什么System.Windows.Forms.HtmlDocument需要完全信任?
- 29. 合并全局和局部范围
- 30. 为什么不串范围
'GLfloat'是一个数字。 “旋转”它意味着什么?从9变为6 ;-)? – 6502 2011-03-10 07:34:01