2014-11-14 139 views
0

我試圖用旋轉矩陣旋轉立方體的頂點,但每當我運行程序時立方體就會消失。使用旋轉矩陣旋轉立方體的頂點

我正在使用一個旋轉矩陣,它是在旋轉立方體x座標的講座中給予我們的。

double moveCubeX = 0; 
float xRotationMatrix[9] = {1, 0, 0, 
          0, cos(moveCubeX), sin(moveCubeX), 
          0, -sin(moveCubeX), cos(moveCubeX) 
}; 

我在我的鍵盤

case 't': 
    moveCubeX += 5; 
    break; 

並做矩陣乘法上增加了moveCubeX變量與「T」鍵我使用

glMultMatrixf(); 

然而,當運行時,我將其添加到我的代碼中,但立方體剛剛消失。這是我在glMultMatrixf()函數中添加的位置。

void display(void) 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 

    gluLookAt(pan, 0, -g_fViewDistance, 
       pan, 0, -1, 
       0, 1, 0); 

    glRotatef(rotate_x, 1.0f, 0.0f, 0.0f); //Rotate the camera 
    glRotatef(rotate_y, 0.0f, 1.0f, 0.0f); //Rotate the camera 

    glMultMatrixf(xRotationMatrix); 

我很努力地看到它在哪裏,我出錯了。

回答

3

OpenGL使用大小爲4x4的矩陣。因此,你的旋轉矩陣需要擴大至4行4列,共計16個元素:

float xRotationMatrix[16] = {1.0f, 0.0f, 0.0f, 0.0f, 
          0.0f, cos(moveCubeX), sin(moveCubeX), 0.0f, 
          0.0f, -sin(moveCubeX), cos(moveCubeX), 0.0f, 
          0.0f, 0.0f, 0.0f, 1.0f}; 

您還需要小心有關單位的角度。由於每次用戶按下某個鍵時都會將5添加到您的角度,因此您看起來像是在度數。 C/C++庫中的標準函數cos()sin()預計角度爲弧度。

此外,它看起來像您的矩陣是在全球範圍內定義的。如果你這樣做,元素將只在程序啓動時評估一次。您必須使矩陣定義局部爲display(),以便每次繪製矩陣時都要重新評估,或者每當角度改變時更新矩陣。

對於第二個選項,只能更新每次角度改變時取決於角度的矩陣元素。在這種修改moveCubeX功能,添加:

xRotationMatrix[5] = cos(moveCubeX); 
xRotationMatrix[6] = sin(moveCubeX); 
xRotationMatrix[9] = -sin(moveCubeX); 
xRotationMatrix[10] = cos(moveCubeX); 
+0

我本來它通過讀取旋轉矩陣維基百科的一個4×4,改變它的一些原因。無論如何,好消息是當我運行它時,立方體實際上顯示出來,但是當我按下按鍵時它不會移動。關於度/弧度,我認爲OpenGL根據這個http://stackoverflow.com/questions/2146884/why-does-opengl-use-degrees-instead-of-radians使用度數。 – JaAnTr 2014-11-14 17:30:22

+0

我剛剛意識到你的意思是關於度和弧度,因爲它在C++而不是OpenGL中。我剛剛嘗試過,所以每增加0.175弧度。但是,它仍然不起作用,因爲它實際上並沒有對多維數據集做任何事情。 – JaAnTr 2014-11-14 17:37:51

+0

@JaAnTr - 每次更改角度時都需要重新計算矩陣的單元格,而不是僅定義一次。 – 2014-11-14 17:44:22