Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 围绕自身旋转的物体_C++_Opengl - Fatal编程技术网

C++ 围绕自身旋转的物体

C++ 围绕自身旋转的物体,c++,opengl,C++,Opengl,我有一个对象,我想使用以下机制移动:左箭头和右箭头改变其旋转,向上箭头增加其位置。 我的问题是,我要么不能绕着物体本身旋转,要么不能朝着被观察的方向移动 绘图功能如下所示: glMatrixMode(GL_MODELVIEW); glPushMatrix(); glScalef(SCALE, SCALE, SCALE); glTranslatef(x, 0, 0); glRotatef(rotationZ, 0, 0, 1); glTranslatef(-x, 0, 0); // Draw t

我有一个对象,我想使用以下机制移动:左箭头和右箭头改变其旋转,向上箭头增加其位置。 我的问题是,我要么不能绕着物体本身旋转,要么不能朝着被观察的方向移动

绘图功能如下所示:

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();
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glScalef(SCALE, SCALE, SCALE);
glTranslatef(x, 0, 0);
glRotatef(rotationZ, 0, 0, 1);

// Draw the object...
glPopMatrix();
关于这一点,我已经看到了多个线程,并且我尝试过更改
x
变量的信号,但似乎没有任何效果

编辑(已解决):

我刚刚将计时器功能中负责向前移动的部分更改为:

if (estado.teclas.up) {

    homer.x+= (float)cos(homer.rotationZ * M_PI / 180);
    homer.y+= (float)sin(homer.rotationZ * M_PI / 180);
}
还有,我的绘图功能:

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

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

glutPostRedisplay();
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轴共线的向量。但在世界坐标中,它等于

v'=M*v

其中M是MRF的变换矩阵。因为v是单位时间内坐标的变化,所以任何平移也应该遵循这个公式。有两种方法可以解决此问题,如果您使用的是传统OpenGL,则有两种选择:

首先:从单位矩阵开始,按正确的顺序重新创建所有变换

  • 设置单位矩阵
  • 按所需值转换(在本地跳线中)
  • 应用车辆的旋转
  • 通过车辆最后已知位置的值进行转换
  • 通过从OpenGL获取矩阵(通过
    glGetFloatv(GL\u MODELVIEW\u matrix,ptr)
    )并从中提取偏移量,计算车辆的新位置,了解变换,或读取该值
  • 这种方法的缺点是您必须使用OpenGL函数,其中每次调用glTranslate或glRotate都会创建另一个矩阵,该矩阵将与其他矩阵相乘(顺序相反)。这是多余的数学运算,它们的精度也不高。如果你有几个参照系,特别是嵌套参照系,用中国的方式它会变得非常有趣

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


    对于现代、灵活的管道,您根本没有glScale、glTranslate和glRotate可用。OpenGL3中不推荐使用整个矩阵堆栈。你只能用第二种方法,但在这种情况下,你可以通过制服向着色器程序提供矩阵。

    从概念上讲,你是想在空间中旋转单个对象,还是想在有多个对象的场景中旋转你的相机?另外,顺便说一句,请注意gl矩阵运算是后乘的,也就是说,你的函数“发生”的顺序与你调用这些函数的顺序相反。所以你要做的是平移-x,旋转,平移+x,然后按顺序缩放。这是你的意图吗?我明白了。因此,当你向上按时,你希望你的物体总是朝着它所面对的方向移动。因此,实际上,你要做的是以增量的方式应用所有内容,你不能简单地将其封装在一个旋转和平移中,因为你的对象可以遵循任意复杂的路径。不幸的是,我正在打电话,无法更好地解释。我也在出门的路上。但是如果你今天晚些时候还没有得到帮助,我就抓住你了。顺便说一句,你是在2d还是3d中工作?@JasonC嘿,你最后说的帮助我理解了下一步该做什么,我用简单的三角法得到了它,它工作得非常完美。非常感谢,你真的帮了很多忙@PedroGonçalves如果你解决了这个问题,你应该把它作为一个答案贴出来,这样未来的人也可以解决和你同样的问题。