2017-12-03 243 views
1

我正在嘗試使用箭頭鍵在場景周圍移動車輛。我可以使用左/右鍵旋轉車輛,但是當我嘗試向前/向後移動時,無論車輛面部朝向哪個方向,它都只能沿着單個軸線旋轉。OpenGL:在3D場景中移動

glPushMatrix(); 

    // movement 
    glTranslatef(movement, 0.0, 0.0); 

    // turning 
    glTranslatef(base, 0.0, 0.0); 
    glRotatef(turnAngle, 0.0, 1.0, 0.0); 
    glTranslatef(-base, 0.0, 0.0); 

    drawCar(); 

glPopMatrix(); 

目前,我只遞增或遞減movement上/下鍵。據我所知,我的對象在單一軸上移動的原因是因爲我只在x軸上翻譯了movement。如何在轉彎時跟蹤我的車輛前方所朝向的位置,並朝這個方向向前移動?

+0

可能重複[OpenGL - 旋轉不工作](https://stackoverflow.com/questions/40094742/opengl-rotation-not-working) – Spektre

回答

1

首先你應該知道你使用的是一種舊的棄用方式在OpenGL中做事情。 見Khronos wiki - Fixed Function Pipeline和見Khronos wiki - Legacy OpenGL


在一個渲染中,場景的每個網格通常會被模型矩陣,視圖矩陣和投影矩陣轉換。投影矩陣描述了從場景的3D點到視口的2D點的映射。視圖矩陣描述了場景的方向和位置。模型矩陣定義場景中網格的位置,oriantation和相對大小。
(請參閱Transform the modelMatrix

對於通過場景控制物體的移動,模型矩陣必須進行增量式更改。這意味着你必須計算當前的運動和當前的旋轉矩陣。將運動和旋轉應用於模型,並保留下一個循環循環的模型。在循環的下一個循環中,必須使用上一個循環中的操縱模型矩陣,並且必須應用新的運動和旋轉。這會導致模型增量更改,始終基於其當前位置和方向。

enter image description here

逐步改變模型矩陣,你必須做到以下幾點:

在OpenGL中存在用於每個矩陣模式的一個矩陣堆棧(參見glMatrixMode)。矩陣模式爲GL_MODELVIEW,GL_PROJECTIONGL_TEXTURE
對於模型矩陣,您需要一個可以存儲它的變量。所述model_mat應與初始位置進行初始化,矩陣堆棧的當前矩陣可以是由glGetFloatv(GL_MODELVIEW_MATRIX, model_mat)得到:

float model_mat[16]; 

glMatrixMode(GL_MODELVIEW); 
glPushMatrix(); 
glLoadIdentity(); 
glTranslatef(base, 0.0, 0.0); 
glGetFloatv(GL_MODELVIEW_MATRIX, model_mat); 
glPopMatrix(); 

逐步改變模型矩陣可以如下進行處理:

float add_movment = ....; 
flaot add_turnangle = ....; 

glMatrixMode(GL_MODELVIEW); 
glPushMatrix(); 

// load the current position and orientation of the object 
glLoadMatrixf(model_mat); 

// add movment 
glTranslatef(add_movment, 0.0, 0.0); 

// add trun angle 
glRotatef(add_turnangle, 0.0, 1.0, 0.0); 

// get the new model matrix 
glGetFloatv(GL_MODELVIEW_MATRIX, model_mat); 

// draw the object 
drawCar(); 

glPopMatrix();