當聲明爲局部變量時,不會發生旋轉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. 寶石管理員,爲什麼我需要範圍:在login_as helper?
- 8. 爲什麼我需要範圍(Len))嵌套的if?
- 9. 爲什麼範圍-V3產量需要默認構造函數
- 10. 爲什麼在全局範圍中聲明的枚舉不需要終止分號?
- 11. Python全局變量範圍
- 12. Server.ScriptTimeout設置全局範圍?
- 13. 組變量全局範圍
- 14. PHP:全局變量範圍
- 15. 爲什麼有些變量需要全局性而其他變量不需要?
- 16. 爲什麼System.Windows.Forms.HtmlDocument需要完全信任?
- 17. 爲什麼超出範圍?
- 18. 爲什麼我無法在全局範圍內訪問我的數組下標
- 19. 爲什麼在全局範圍和命名空間std中定義了size_t?
- 20. 爲什麼我可以從全局範圍調用私有構造函數?
- 21. MSBuild ItemGroup爲什麼不在全局範圍內有條件工作
- 22. NodeJS需要範圍變量
- 23. UserInfo Endpoint需要什麼範圍 - 除了'openid'?
- 24. Webpack + Babel需要在全局範圍內失敗,但在函數內部工作
- 25. 爲什麼需要
- 26. 鎖是否需要聲明爲全局?
- 27. 如果可以從局部範圍讀取globlal variabales,那麼爲什麼不能打印全局變量?
- 28. 在本地範圍內定義全局範圍的變量
- 29. 如何從全局範圍調用jQuery範圍內的函數?
- 30. 什麼時候需要在python中使用全局關鍵字
'GLfloat'是一個數字。 「旋轉」它意味着什麼?從9變爲6 ;-)? – 6502 2011-03-10 07:34:01