2017-12-03 240 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();