当前位置: 首页 > 知识库问答 >
问题:

在OpenGL中沿对象自身的轴旋转对象

沃威
2023-03-14

所以我有一个立方体,我想绕着它的三个轴(立方体的轴,而不是窗口)旋转。正如许多其他类似的问题所指出的,只要我只朝一个方向旋转,我的旋转就会起作用,但当我开始混合它们时,我会得到奇怪的结果。特别是,无论立方体如何旋转,围绕y轴的旋转始终围绕窗口的y轴旋转。

我的绘图代码如下:

glMatrixMode(GL_MODELVIEW) ;
glLoadIdentity();
gluLookAt(0.0, 5.0, 15.0,  
          0.0, 0.0, 0.0,  
          0.0, 1.0, 0.0);
glPushMatrix();
glRotatef(theta_y,0,1,0); 
glRotatef(theta_x,1,0,0);
glRotatef(theta_z,0,0,1);
draw_cube();
glPopMatrix();

这个问题似乎非常准确地描述了我想做什么,公认的答案似乎是我想做什么,但是他提供的链接已经死了。

从我在链接问题中收集到的信息来看,我的z-旋转是首先执行的,这意味着在我的x-旋转(下一个)中,我需要,而不是围绕(1,0,0)旋转,我将围绕(-sin(theta_z),cos(theta_z),0)旋转。但是对于第三轮,他只给出了链接,说它变得“非常复杂”现在链环已经死了,我不知道如何进行第三次旋转。

编辑:根据回复,我添加了三个向量:cube_xcube_y、和cube_z来保存我的多维数据集的当前轴。它们初始化如下:

float cube_x[] = {1.0f,0.0f,0.0f,0.0f};
float cube_y[] = {0.0f,1.0f,0.0f,0.0f};
float cube_z[] = {0.0f,0.0f,1.0f,0.0f};

回到我的绘图函数,我已经改变了它,这样旋转是围绕这些轴而不是像我以前那样围绕全局轴进行的。执行三次旋转后,我调用glGetFloatv来获取当前矩阵,并使用一个新函数,update_vector来填充立方体向量的新值。这一切都包括在下面:

void update_vector(float vector[],float matrix[]) {
    vector[0] = matrix[0]*vector[0] + matrix[1]*vector[1] + matrix[2]*vector[2] + matrix[3]*vector[3];
    vector[1] = matrix[4]*vector[0] + matrix[5]*vector[1] + matrix[6]*vector[2] + matrix[7]*vector[3];
    vector[2] = matrix[8]*vector[0] + matrix[9]*vector[1] + matrix[10]*vector[2] + matrix[11]*vector[3];
    vector[3] = matrix[12]*vector[0] + matrix[13]*vector[1] + matrix[14]*vector[2] + matrix[15]*vector[3];

}

void my_display(void) {
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) ;

    glMatrixMode(GL_MODELVIEW) ;
    glLoadIdentity();
    gluLookAt(0.0, 5.0, 15.0,  
          0.0, 0.0, 0.0,  
          0.0, 1.0, 0.0); 
    glPushMatrix();
    glRotatef(theta_y,cube_y[0],cube_y[1],cube_y[2]); 
    glRotatef(theta_x,cube_x[0],cube_x[1],cube_x[2]);
    glRotatef(theta_z,cube_z[0],cube_z[1],cube_z[2]);

    //get the current matrix
    float my_matrix[16];
    glGetFloatv(GL_MODELVIEW_MATRIX, my_matrix);

    //Multiply the matrix by each of my vectors
    update_vector(cube_x,my_matrix);
    update_vector(cube_y,my_matrix);
    update_vector(cube_z, my_matrix);

    make_cube();
    glPopMatrix();

    /* buffer is ready */
    glutSwapBuffers();

    return ;
}

现在,当我试着绕y轴旋转时,立方体似乎在绕x轴旋转之前,沿着几个轴摆动了一点。围绕Z旋转也会做同样的事情。似乎只有绕x轴旋转才有效。

编辑:解决方案:

在下面的评论中,加文提到Y轴旋转总是首先发生。这就是问题的全部。通过添加一个标志ROT,并根据我尝试旋转的轴设置它,我可以对旋转进行排序,以便最后完成旋转的轴。

共有2个答案

梁丘俊人
2023-03-14

我不知道什么是复杂的。OpenGL为您计算矩阵。记住矩阵乘法是关联的,所以如果Rx等是围绕坐标轴的旋转,那么Rx。Ry的意思是先绕y再绕x旋转。它始终围绕坐标轴旋转,无论您的形状在同一时间结束于何处。顺便说一句,OpenGL ES是右手的,不像传统的OpenGL。

晁聪
2023-03-14

在你的LookAt之后,你必须通过立方体的负位置进行平移,进行旋转,然后平移回立方体的位置。

 类似资料:
  • 我的屏幕上有一个旋转和平移的对象,但是我有两个关于z轴旋转的问题。解释起来有点棘手,所以我上传了两个视频来描述每个问题。 1) 反向旋转:在绕x轴旋转对象后,z轴旋转将被反向,并且应该如此。 2)错误的Z轴旋转:同样,在围绕x轴旋转物体后,我试图围绕z轴旋转物体,旋转导致不同的轴旋转。 我相信视频很好地描述了这些问题。 编辑:更新#1 好的,我想我找到了解决方案,就是只绕Z轴旋转相机,然后对模型本

  • 我问了一个以前被问过一百万次的问题,但在浏览了这些问题并求助于其他网站之后,我仍然没有找到一个好的答案: 如何在全局轴上旋转图形,而不是本地轴? opengl中的旋转对象 如何像OpenGL中的glRotatef()一样旋转顶点? 在OpenGL中围绕3个轴旋转对象 在OpenGL中沿对象自身的轴旋转对象 有没有可能让一个物体绕着它自己的轴旋转,而不是绕着基坐标轴旋转? OpenGL旋转-局部轴与

  • 问题内容: 是否有一种相对简单的旋转SKSpriteNode的方法,使其始终面对其移动方向?我班的Gamecene有一个带有相对物理实体的对象系统,它们在碰撞时会相互施加脉冲。这使得很难准确地跟踪对象的移动方向。某些对象的形状也不规则,这会使事情更加混乱。我尝试使用三角函数(例如反正切),但是它仅在非常特殊的情况下可以正常使用。可能有一种方法可以找出SKSpriteNode轨迹的角度,以便可以将对

  • 问题内容: 我对Three.js的旋转有很大的疑问,我想在自己的一款游戏中旋转3D立方体。 并且(x,y,z)可以是(1、0、0) 则多维数据集可以旋转,但是问题在于多维数据集绕其自身的轴旋转,因此,旋转后,它无法按预期旋转。 并且我尝试使用 matrixRotationWorld 作为 但它不起作用,我不以错误的方式使用它,还是有其他方法。 因此,如何让3D立方体绕世界轴旋转??? 问题答案:

  • 我正在为我的游戏设计一个区块旋转组件,我遇到了一个我无法理解的小问题。基本上,我希望能够沿所有三个轴旋转网格组件。玩家一次只能旋转一个轴,旋转90度或-90度。我还希望玩家始终根据世界的X、Y和Z轴旋转网格,而不是块的相对轴,它将随着旋转而改变。我如何做到这一点? 无旋转的网格: 网格沿X轴逆时针旋转90度: 这里的问题是,如果我想沿着Y轴旋转块,相反,它将沿着Z轴旋转块,因为块现在被旋转。我如何

  • 我尝试绕全局y轴旋转对象(基本上,无论当前方向如何,都围绕0,1,0偏航)。我想给你看一张照片,但是声誉。。。我想绕全局轴而不是对象的局部轴旋转偏航。例如,如果我通过俯仰稍微倾斜一个长方体,然后尝试旋转偏航,它将以倾斜的角度而不是直线旋转长方体,就好像长方体根本没有倾斜一样。 每个对象将其位置和旋转存储在矩阵中,每个更新调用都会更新该矩阵。旋转的代码看起来是这样的: 其中,位置是每次更新都会平移和