OpenGL:在 3D 场景中移动
OpenGL: Moving around 3D Scene
我正在尝试使用箭头键在场景中移动车辆。我可以使用 left/right 键使车辆围绕自身旋转,但是当我尝试移动 forward/backward 时,无论车辆的正面朝向哪个方向,它都只会沿着一个轴移动。
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();
目前,我只在 up/down 键上递增或递减 movement
。据我了解,我的对象在单个轴上移动的原因是因为我只在 x 轴上平移 movement
。如何跟踪转弯时我的车辆前部朝向的位置并朝那个方向移动 'forward'?
首先,您应该知道您在 OpenGL 中使用一种旧的、已弃用的方式来做事。
参见 Khronos wiki - Fixed Function Pipeline and See Khronos wiki - Legacy OpenGL。
在渲染中,场景的每个网格通常由模型矩阵、视图矩阵和投影矩阵进行变换。投影矩阵描述了从场景的 3D 点到视口的 2D 点的映射。视图矩阵描述了观察场景的方向和位置。模型矩阵定义场景中网格的位置、方向和相对大小。
(参见 )
为了控制对象在场景中的移动,必须逐步更改模型矩阵。这意味着您必须计算当前移动和当前旋转矩阵。将移动和旋转应用于模型,并为循环的下一个循环保留模型。在循环的下一个循环中,您必须使用上一个循环中的操纵模型矩阵,并且必须应用新的移动和旋转。这导致模型增量变化,始终基于其当前位置和方向。
要逐步更改模型矩阵,您必须执行以下操作:
- 用物体的初始位置初始化模型矩阵
- 加载当前模型矩阵
glLoadMatrixf
- 通过
glTranslatef
and 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();
我正在尝试使用箭头键在场景中移动车辆。我可以使用 left/right 键使车辆围绕自身旋转,但是当我尝试移动 forward/backward 时,无论车辆的正面朝向哪个方向,它都只会沿着一个轴移动。
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();
目前,我只在 up/down 键上递增或递减 movement
。据我了解,我的对象在单个轴上移动的原因是因为我只在 x 轴上平移 movement
。如何跟踪转弯时我的车辆前部朝向的位置并朝那个方向移动 'forward'?
首先,您应该知道您在 OpenGL 中使用一种旧的、已弃用的方式来做事。 参见 Khronos wiki - Fixed Function Pipeline and See Khronos wiki - Legacy OpenGL。
在渲染中,场景的每个网格通常由模型矩阵、视图矩阵和投影矩阵进行变换。投影矩阵描述了从场景的 3D 点到视口的 2D 点的映射。视图矩阵描述了观察场景的方向和位置。模型矩阵定义场景中网格的位置、方向和相对大小。
(参见
为了控制对象在场景中的移动,必须逐步更改模型矩阵。这意味着您必须计算当前移动和当前旋转矩阵。将移动和旋转应用于模型,并为循环的下一个循环保留模型。在循环的下一个循环中,您必须使用上一个循环中的操纵模型矩阵,并且必须应用新的移动和旋转。这导致模型增量变化,始终基于其当前位置和方向。
要逐步更改模型矩阵,您必须执行以下操作:
- 用物体的初始位置初始化模型矩阵
- 加载当前模型矩阵
glLoadMatrixf
- 通过
glTranslatef
andglRotatef
应用新的平移和旋转
- 存储下一个循环的模型矩阵
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();