gpt4 book ai didi

c++ - 围绕自身旋转物体

转载 作者:行者123 更新时间:2023-11-30 05:19:12 24 4
gpt4 key购买 nike

我有一个对象,我想使用以下机制四处移动:向左和向右箭头改变它的旋转,向上箭头增加它的位置。我的问题是我要么无法围绕自身旋转对象,要么无法将其移动到被注视的方向。

绘制函数如下:

glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glScalef(SCALE, SCALE, SCALE);
glTranslatef(x, 0, 0);
glRotatef(rotationZ, 0, 0, 1);
glTranslatef(-x, 0, 0);

// Draw the object...

glPopMatrix();

按键检测代码:

 case GLUT_KEY_UP:
teclas.up = GL_TRUE;
glutPostRedisplay();
break;
case GLUT_KEY_LEFT:
teclas.left = GL_TRUE;
glutPostRedisplay();
break;
case GLUT_KEY_RIGHT:
teclas.right = GL_TRUE;
glutPostRedisplay();
break;

定时器功能:

if (teclas.up) {
x++;
}

if (teclas.left) {
rotationZ++;
}
if (teclas.right) {
rotationZ--;
}

glutPostRedisplay();

我已经看到了关于此的多个线程,并且我尝试更改 x 变量的信号,但似乎没有任何效果。

编辑(已解决):

我只是将 Timer 函数中负责向前移动的部分更改为:

if (estado.teclas.up) {

homer.x+= (float)cos(homer.rotationZ * M_PI / 180);
homer.y+= (float)sin(homer.rotationZ * M_PI / 180);
}

还有,我的 Draw 函数:

glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glScalef(SCALE, SCALE, SCALE);
glTranslatef(x, 0, 0);
glRotatef(rotationZ, 0, 0, 1);

// Draw the object...
glPopMatrix();

这样,物体总是朝着它所面对的方向移动

最佳答案

这是移动引用系问题的案例,这些是关键字。除非你也模拟物理过程,否则对于 OpenGL 渲染,我们只需要担心坐标。这里我们有静止引用系,有时称为世界坐标系(特别是如果观察者也相对于它移动)和连接到对象的移动引用系(MRF)。 MRF 可以相对于世界框架进行任意旋转和平移,它有传统的定义方式。

例如,地球 MRF 定义为原点在地球中心,正 X 轴与赤道和 0 子午线相交,正 Z - 北极,Y 与它们互补。对于地球表面的静态点(本地地理坐标),通常 Y 指向天顶,Z 正向 - 地平线上的北方,X 正向 - 东方。在移动车辆的情况下,正 Y 轴或俯仰轴始终指向其左侧,正 Z 轴或偏航轴始终指向上方,X - 横滚轴指向正前方。这个似乎符合你的情况。

无论轴的规范如何,车辆的旋转相当于改变其对应的矩阵。让我们称之为转换矩阵。在局部坐标中,车辆速度 v = {vx,0,0} 是与正 X 轴共线的 vector 。但在世界坐标中它等于

v' = M*v

其中 M 是 MRF 的变换矩阵。由于 v 是每单位时间坐标的变化,因此任何翻译也应遵循此公式。有两种方法可以解决这个问题,如果您使用的是旧版 OpenGL,则有两种选择:

首先:您将从单位矩阵开始,并以正确的顺序重新创建所有转换。

  1. 设置单位矩阵。
  2. 按所需值翻译(本地代码)
  3. 应用车辆旋转
  4. 根据车辆最后已知位置的值进行翻译。
  5. 通过从 OpenGL 获取矩阵(通过 glGetFloatv(GL_MODELVIEW_MATRIX, ptr))并从中提取偏移量,计算车辆的新位置、了解变换或读取该值。

此方法的缺点是您必须使用 OpenGL 的函数,其中每次调用 glTranslate 或 glRotate 都会创建另一个矩阵,该矩阵与其他矩阵相乘(以相反的顺序)。那是多余的数学运算,它们的精度也不是很好。如果您有多个引用框架,尤其是嵌套引用框架,它会以中文方式变得非常有趣。

第二种方法是自己完成所有矩阵数学运算,例如使用像 GLM (glm.h) 这样的数学库并为每个引用系存储矩阵,在需要时修改或重新生成它们。即使在传统模式下,您也可以通过 glLoadMatrix 直接向 OpenGL 提供矩阵。如果你担心性能,你应该知道所有现代实现都是在 CPU 上完成数学运算,GPU 不再使用矩阵堆栈,很长一段时间。通过检查开源实现可以快速找到它。

对于现代的、灵活的管道,您根本没有可用的 glScale、glTranslate 和 glRotate。整个矩阵堆栈在 OpenGL 3 中已弃用。您只能通过第二种方式进行,但在这种情况下,您将通过制服向着色器程序提供矩阵。

关于c++ - 围绕自身旋转物体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41265211/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com