在 OpenGL 场景中绕物体旋转的困难

Posted

技术标签:

【中文标题】在 OpenGL 场景中绕物体旋转的困难【英文标题】:Difficulty with orbiting around any object on OpenGL sceen 【发布时间】:2015-11-18 18:07:03 【问题描述】:

在阅读了很多关于围绕相机旋转的指南并询问了一些关于 SO 的其他问题后,我想出了SSCCE 我目前所拥有的。也许这样其他人会更容易理解我需要什么,对我来说答案是什么。

到目前为止,它看起来像这样:

绘制对象的代码:

glPushMatrix();
glTranslatef(translate[0], translate[1], translate[2]);
glRotatef(rot, 0.0, 1.0, 0.0);
glTranslatef(0,0,0);
glColor3f(1.0,0.0,0.0);
fig.DrawBox(5.0f,5.0f,-5.0f,-5.0f,5.0f,-5.0f);
glPopMatrix();

glPushMatrix();
glTranslatef(translate[0], translate[1], translate[2]);

glTranslatef(2,0,0);
glRotatef(rot, 0.0, 1.0, 0.0);
glTranslatef(0,0,0);
glColor3f(0.0,1.0,1.0);
fig.DrawBox(1.5f,1.5f,-1.5f,-1.5f,1.5f,-1.5f);

glTranslatef(-4, 1.5, 0);
glColor3f(1.0,0.0,1.0);
fig.DrawBox(0.5f,0.5f,-0.5f,-0.5f,0.5f,-0.5f);

glTranslatef(4-1, 1.5-0.5, 0);
glColor3f(0.0,0.0,1.0);
fig.DrawBox(0.5f,0.5f,-0.5f,-0.5f,0.5f,-0.5f);
glPopMatrix();

translate 是导航期间更新的位置,rot 是旋转。

红色的盒子是一个主要的容器,所有的东西都在里面。 “相机”可以超出它,但在旋转过程中它也应该旋转。至于小盒子,我希望能够围绕它们中的每一个旋转。到目前为止,我可以围绕这个绿色的轨道运行,但是当我移动到紫色时,它就不起作用了。

在我的最终应用程序中,我将拥有数百个对象,因此我不确定当前仅使用一个 glPushMatrix() glPopMatrix() 的方法是否是最好的主意(我担心正确放置它们),但是当我使用为每个对象推送 pop,然后每个对象都按自己的轴心点旋转。

编辑:

我一直在编写我的代码,并且我设法取得了比以前更多的成就。虽然它仍然不是我想要的。

我的代码:

glPushMatrix();
glTranslatef(translate[0], translate[1], translate[2]);
glRotatef(rot, 0.0, 1.0, 0.0);
glTranslatef(0,0,0);
glColor3f(1.0,0.0,0.0);
fig.DrawBox(5.0f,5.0f,-5.0f,-5.0f,5.0f,-5.0f);
glPopMatrix();

glPushMatrix();
glTranslatef(translate[0], translate[1], translate[2]);
    glRotatef(-rot, 0.0, 1.0, 0.0);
    glTranslatef(4,0,0);
    glPushMatrix();

        glPushMatrix();
        glTranslatef(2,0,0);
        glColor3f(0.0,1.0,1.0);
        fig.DrawBox(1.5f,1.5f,-1.5f,-1.5f,1.5f,-1.5f);
        glPopMatrix();

        glPushMatrix();
        glTranslatef(-4, 1.5, 0);
        glColor3f(1.0,0.0,1.0);
        fig.DrawBox(0.5f,0.5f,-0.5f,-0.5f,0.5f,-0.5f);
        glPopMatrix();

        glPushMatrix();
        glTranslatef(-1, -0.5, 0);
        glColor3f(0.0,0.0,1.0);
        fig.DrawBox(0.5f,0.5f,-0.5f,-0.5f,0.5f,-0.5f);
        glPopMatrix();

    glPopMatrix();
glPopMatrix();

现在的样子:

如您所见,我能够移动旋转点,但同时我已经将整个组移动到了盒子内。我不想那样做。

【问题讨论】:

【参考方案1】:

经过多次更改和想法,我终于找到了实现我所寻找的正确方法。原来我需要切换翻译顺序:

glPushMatrix();
glTranslatef(0, translate[1], translate[2]);
glRotatef(rot, 0.0, 1.0, 0.0);
glTranslatef(translate[0], 0,0);
glColor3f(1.0,0.0,0.0);
fig.DrawBox(5.0f,5.0f,-5.0f,-5.0f,5.0f,-5.0f);
glPopMatrix();

glPushMatrix();
glTranslatef(0, translate[1], translate[2]);
glRotatef(rot, 0.0, 1.0, 0.0);
glTranslatef(translate[0],0,0);

    glPushMatrix();
        glPushMatrix();
        glTranslatef(2,0,0);
        glColor3f(0.0,1.0,1.0);
        fig.DrawBox(1.5f,1.5f,-1.5f,-1.5f,1.5f,-1.5f);
        glPopMatrix();

        glPushMatrix();
        glTranslatef(-4, 1.5, 0);
        glColor3f(1.0,0.0,1.0);
        fig.DrawBox(0.5f,0.5f,-0.5f,-0.5f,0.5f,-0.5f);
        glPopMatrix();

        glPushMatrix();
        glTranslatef(-1, -0.5, 0);
        glColor3f(0.0,0.0,1.0);
        fig.DrawBox(0.5f,0.5f,-0.5f,-0.5f,0.5f,-0.5f);
        glPopMatrix();
    glPopMatrix();
glPopMatrix();

现在,无论摄像机在哪里,旋转点都在我面前。

【讨论】:

【参考方案2】:

OpenGL rotating a camera around a point也许这个答案可以帮助你。我认为你必须:翻译-旋转-翻译。

【讨论】:

是的,我也考虑过,但是如果我只有一对推送弹出对,我应该在哪里添加旋转和翻译。

以上是关于在 OpenGL 场景中绕物体旋转的困难的主要内容,如果未能解决你的问题,请参考以下文章

使用OpenGL如何实现物体绕体外任意轴旋转?

OpenGL的视图变换模型变换投影变换视口变换

opengl旋转曲面画立体图

使用OpenGL在圆圈中移动对象?

在 iPhone 上使用 CADisplayLink 在 OpenGL ES 视图中进行等速旋转

Unity3d C# 鼠标点击下物体,物体匀速旋转180°,要看到旋转过程,这个代码怎么写?