2016-12-21 115 views
1

我有一個對象,我想要使用下面的機制來移動:左右箭頭更改其旋轉,上箭頭增加其位置。 我的問題是,我無法繞着自身旋轉物體,或者我無法將其移向被查看的方向。圍繞自身旋轉對象

繪製函數如下:

glMatrixMode(GL_MODELVIEW); 
glPushMatrix(); 
glScalef(SCALE, SCALE, SCALE); 
glTranslatef(x, 0, 0); 
glRotatef(rotationZ, 0, 0, 1); 
glTranslatef(-x, 0, 0); 

// Draw the object... 

glPopMatrix(); 

按鍵檢測代碼:

case GLUT_KEY_UP: 
     teclas.up = GL_TRUE; 
     glutPostRedisplay(); 
     break; 
case GLUT_KEY_LEFT: 
     teclas.left = GL_TRUE; 
     glutPostRedisplay(); 
     break; 
case GLUT_KEY_RIGHT: 
     teclas.right = GL_TRUE; 
     glutPostRedisplay(); 
     break; 

定時器功能:

if (teclas.up) { 
    x++; 
} 

if (teclas.left) { 
    rotationZ++; 
} 
if (teclas.right) { 
    rotationZ--; 
} 

glutPostRedisplay(); 

我已經看到了這個多線程,和我試過改變x變量的信號,但似乎沒有任何工作。

編輯(解決):

我只是改變了定時器功能的一部分,負責向前運動到這一點:

if (estado.teclas.up) { 

    homer.x+= (float)cos(homer.rotationZ * M_PI/180); 
    homer.y+= (float)sin(homer.rotationZ * M_PI/180); 
} 

而且也,我的繪圖功能:

glMatrixMode(GL_MODELVIEW); 
glPushMatrix(); 
glScalef(SCALE, SCALE, SCALE); 
glTranslatef(x, 0, 0); 
glRotatef(rotationZ, 0, 0, 1); 

// Draw the object... 
glPopMatrix(); 

這樣,物體總是朝着它所面對的方向移動

+0

從概念上講,你是想旋轉空間中的單個物體,還是試圖圍繞具有多個物體的場景旋轉相機? –

+0

此外,順便說一句,注意gl矩陣操作後倍增,這意味着您的翻譯旋轉秤「發生」以相反的順序,你可以稱之爲這些功能。所以你要按順序翻譯-x,旋轉,翻譯+ x,然後縮放。這是你的意圖嗎? –

+0

@JasonC我試圖在空間中移動我的個人物體,相機是靜態的。 關於第二條評論,我不知道。如果他面向正X軸,我希望他按照向上箭頭的方向移動。如果我將他旋轉90度,我希望他朝着Y軸移動。那有意義嗎? –

回答

1

This是移動參考幀的問題,這些都是關鍵字。除非你模擬過程的物理過程,對於OpenGL渲染,我們不得不擔心的是座標。這裏我們有固定的參照系,有時也稱爲世界框(尤其是觀察者也相對於它移動時),以及連接到物體的移動參考系(MRF)。 MRF可以相對於世界框架進行任意的旋轉和平移,傳統的方式是如何定義的。

例如,對於地球地球MRF定義爲原點在地球的中心,X軸正方向相交的赤道和0子午線,正Z - 北極和Y是將它們的互補性。對於地球表面(局部地理座標)上的靜態點,它通常指向天頂和正Z - 朝向地平面中的北方和朝向東方的正X.在移動車輛的情況下,正Y軸或俯仰軸始終指向其左側,而正Z軸或偏航軸始終指向正前方,X--滾動軸指向前方。這一個似乎符合你的情況。不管軸說明書的

,車輛的旋轉相當於改變對應於它基質。讓我們稱之爲轉換矩陣。在局部座標系中,車速v = {vx,0,0}是一個與正X軸共線的向量。但是,在世界座標它等於

V」 = M * V

其中M是MRF的變換矩陣。由於v是每單位時間的座標變化,因此任何翻譯都應該遵循這個公式。有兩種方法來解決這個問題,如果你使用的是舊版的OpenGL,你有兩個選擇:

第一:你會開始與單位矩陣,重新按照正確的順序所有變換。

  1. 設置單位矩陣。
  2. 由需要的值(在本地簾線)翻譯
  3. 應用車輛
  4. 的轉速由車輛的最後已知位置的值翻譯。
  5. 通過從OpenGL獲取矩陣(通過glGetFloatv(GL_MODELVIEW_MATRIX, ptr))並從中提取偏移量,計算車輛的新位置,知道變換或讀取該值。

下行這種方法的是,你必須使用OpenGL,其中glTranslate或glRotate的每個呼叫被建立,這是獲得與其他相乘的另一矩陣(在相反的順序)的功能。這是過度的數學運算,它們的精度也不是很好。如果你有幾個參照系,特別是嵌套,它可以用中文的方式變得非常有趣。

第二種方法是自己做所有的矩陣運算,例如使用像GLM(glm.h)這樣的數學庫和每個參照系存儲矩陣,在需要時修改或重新生成它們。您可以通過glLoadMatrix將矩陣直接提供給OpenGL,即使在傳統模式下也是如此。如果您擔心性能,您應該知道所有現代實現都是在CPU上進行數學運算,但GPU已經不再適用於矩陣堆棧,長期以來都是如此。通過檢查開源實現可以快速找到它。

在現代的,靈活的管道的情況下,你根本沒有glScale,glTranslate,glRotate。整個矩陣堆棧在OpenGL 3中不推薦使用。您只能以第二種方式來完成,但在這種情況下,您可以通過制服將矩陣提供給着色器程序。