2011-03-10 181 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

相關問題