我正在尝试使用箭头键在车辆周围移动车辆。我可以使用左/右键自动旋转车辆,但是当我尝试向前/向后移动时,无论车辆的车辆面朝哪个方向,它都只跟随一个轴。
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 :(得分:1)
首先,您应该知道在OpenGL中使用旧的不赞成的方式。 请参阅Khronos wiki - Fixed Function Pipeline并参阅Khronos wiki - Legacy OpenGL。
在渲染中,场景的每个网格通常由模型矩阵,视图矩阵和投影矩阵变换。投影矩阵描述了从场景的3D点到视口的2D点的映射。视图矩阵描述了查看场景的方向和位置。模型矩阵定义场景中网格的位置,方向和相对大小
(见Transform the modelMatrix))
对于物体在场景中的受控移动,必须逐渐改变模型矩阵。这意味着您必须计算当前运动和当前旋转矩阵。将运动和旋转应用于模型,并将模型保留在循环的下一个循环中。在循环的下一个循环中,您必须使用上一个循环中的操纵模型矩阵,并且必须应用新的移动和旋转。这会导致模型增量变化,始终基于其当前位置和方向。
要逐步更改模型矩阵,您必须执行以下操作:
glLoadMatrixf
glTranslatef
和glRotatef
glGetFloatv(GL_MODELVIEW_MATRIX, view_mat)
在OpenGL中,每种矩阵模式都有一个矩阵堆栈(参见glMatrixMode
)。矩阵模式为GL_MODELVIEW
,GL_PROJECTION
和GL_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();