我正试图用箭头键在现场移动一辆车。我可以用左/右键旋转车辆本身,但当我试图向前/向后移动时,无论车辆面对哪个方向,它都只跟随一个轴。
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进行翻译。当我的车转向并朝那个方向“向前”移动时,我该如何跟踪我的车的前部面对的位置?
发布于 2017-12-03 09:31:49
首先,您应该知道在OpenGL中使用了一种旧的、不推荐的方法。见Khronos wiki固定功能管道和Khronos wiki - Legacy OpenGL。
在渲染中,场景的每个网格通常由模型矩阵、视图矩阵和投影矩阵进行转换。投影矩阵描述从场景的三维点到视口的2D点的映射。视图矩阵描述观看场景的方向和位置。模型矩阵定义了场景中网格的位置、方向和相对尺寸。
对于被控对象在场景中的运动,必须逐步改变模型矩阵。这意味着你必须计算当前的运动和当前的旋转矩阵。将运动和旋转应用于模型,并为下一个循环周期保留模型。在下一个循环周期中,您必须使用前一个循环中的操纵模型矩阵,并且您必须应用新的运动和旋转。这导致模型增量的变化,始终基于其当前的位置和方向。

要增量地更改模型矩阵,您必须执行以下操作:
glLoadMatrixfglTranslatef和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();https://stackoverflow.com/questions/47614202
复制相似问题