首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL:在3D场景中移动

OpenGL:在3D场景中移动
EN

Stack Overflow用户
提问于 2017-12-03 00:55:41
回答 1查看 606关注 0票数 1

我正试图用箭头键在现场移动一辆车。我可以用左/右键旋转车辆本身,但当我试图向前/向后移动时,无论车辆面对哪个方向,它都只跟随一个轴。

代码语言:javascript
复制
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进行翻译。当我的车转向并朝那个方向“向前”移动时,我该如何跟踪我的车的前部面对的位置?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-03 09:31:49

首先,您应该知道在OpenGL中使用了一种旧的、不推荐的方法。见Khronos wiki固定功能管道Khronos wiki - Legacy OpenGL

在渲染中,场景的每个网格通常由模型矩阵、视图矩阵和投影矩阵进行转换。投影矩阵描述从场景的三维点到视口的2D点的映射。视图矩阵描述观看场景的方向和位置。模型矩阵定义了场景中网格的位置、方向和相对尺寸。

(见转换modelMatrix)

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

要增量地更改模型矩阵,您必须执行以下操作:

在OpenGL中,每个矩阵模式都有一个矩阵堆栈(参见glMatrixMode)。矩阵模式为GL_MODELVIEWGL_PROJECTIONGL_TEXTURE

对于模型矩阵,您需要一个可以存储它的变量。model_mat应该用初始位置初始化,glGetFloatv(GL_MODELVIEW_MATRIX, model_mat)可以得到矩阵堆栈的当前矩阵。

代码语言:javascript
复制
float model_mat[16];

glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glTranslatef(base, 0.0, 0.0);
glGetFloatv(GL_MODELVIEW_MATRIX, model_mat);
glPopMatrix();

要逐步更改模型矩阵,可以按以下方式处理:

代码语言:javascript
复制
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();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47614202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档