OpenGL:在3D场景中移动

时间:2017-12-03 00:55:42

标签: opengl coordinate-transformation

我正在尝试使用箭头键在车辆周围移动车辆。我可以使用左/右键自动旋转车辆,但是当我尝试向前/向后移动时,无论车辆的车辆面朝哪个方向,它都只跟随一个轴。

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。如何在转动时跟踪车辆前部的位置并向前移动'在那个方向?

1 个答案:

答案 0 :(得分:1)

首先,您应该知道在OpenGL中使用旧的不赞成的方式。 请参阅Khronos wiki - Fixed Function Pipeline并参阅Khronos wiki - Legacy OpenGL


在渲染中,场景的每个网格通常由模型矩阵,视图矩阵和投影矩阵变换。投影矩阵描述了从场景的3D点到视口的2D点的映射。视图矩阵描述了查看场景的方向和位置。模型矩阵定义场景中网格的位置,方向和相对大小 (见Transform the modelMatrix))

对于物体在场景中的受控移动,必须逐渐改变模型矩阵。这意味着您必须计算当前运动和当前旋转矩阵。将运动和旋转应用于模型,并将模型保留在循环的下一个循环中。在循环的下一个循环中,您必须使用上一个循环中的操纵模型矩阵,并且必须应用新的移动和旋转。这会导致模型增量变化,始终基于其当前位置和方向。

enter image description here

要逐步更改模型矩阵,您必须执行以下操作:

在OpenGL中,每种矩阵模式都有一个矩阵堆栈(参见glMatrixMode)。矩阵模式为GL_MODELVIEWGL_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();