OpenGL:在3D场景中移动
我正在尝试使用箭头键在场景周围移动车辆。我可以使用左/右键旋转车辆,但是当我尝试向前/向后移动时,无论车辆面部向哪个方向,它都只能沿着单个轴线旋转。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
。如何在转弯时跟踪我的车辆前方所向的位置,并这个方向向前移动?
回答:
首先你应该知道你使用的是一种旧的弃用方式在OpenGL中做事情。 见Khronos wiki - Fixed Function Pipeline和见Khronos wiki - Legacy OpenGL。
在一个渲染中,场景的每个网格通常会被模型矩阵,视图矩阵和投影矩阵转换。投影矩阵描述了从场景的3D点到视口的2D点的映射。视图矩阵描述了场景的方向和位置。模型矩阵定义场景中网格的位置,oriantation和相对大小。
(请参阅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();
以上是 OpenGL:在3D场景中移动 的全部内容, 来源链接: utcz.com/qa/259047.html