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
  • 应用新的翻译和旋转glTranslatefglRotatef
  • 存储模型矩阵为下一个周期glGetFloatv(GL_MODELVIEW_MATRIX, view_mat)

在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();

以上是 OpenGL:在3D场景中移动 的全部内容, 来源链接: utcz.com/qa/259047.html

回到顶部