c++ - 如何让整个场景围绕自己旋转? (我的代码有一个小错误,就是让对象绕着自己旋转)

标签 c++ opengl

必须改变什么才能让我看到在整个固定场景中飞来飞去的印象?我当前的代码只是让我从一个固定的视角观察每个围绕自身旋转的物体。启用 glLoadIdentity() 只是停止它们的旋转。请注意,3dWidget::paintGL() 每 20 毫秒由计时器永久调用一次。

void 3dWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glTranslatef(0.5f, 0.5f, 0.5f);
    glRotatef(3.0f, 1.0f, 1.0f, 1.0f);
    glTranslatef(-0.5f, -0.5f, -0.5f);

    glPushMatrix();
    //glLoadIdentity();

    for (int i = 0; i < m_cubes.count(); i++) {
        m_cubes[i]->render();
    }

    glPopMatrix();
}

void Cube::render() {
    glTranslatef(m_x, m_y, m_z); // local position of this object
    glCallList(m_cubeId); // render code is in createRenderCode()
    glTranslatef(-m_x, -m_y, -m_z);
}

void Cube::createRenderCode(int cubeId) {
    m_cubeId = cubeId;

    glVertexPointer(3, GL_FLOAT, 0, m_pCubePoints);
    glColorPointer(4, GL_UNSIGNED_BYTE, 0, m_pCubeColors);

    glNewList(m_cubeId, GL_COMPILE);
    {
        glEnableClientState(GL_COLOR_ARRAY);
        glDrawArrays(GL_TRIANGLE_STRIP, 0, m_numPoints);
        glDisableClientState(GL_COLOR_ARRAY);
    }
    glEndList();
}

void 3dWidget::init(int w, int h)
{
    ...

    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    float aspect = w/(float)(h ? h : 1);
    glFrustum(-aspect, aspect, -1, 1, 10, 100);
    glTranslatef(0., 0., -12);

    glMatrixMode(GL_MODELVIEW);
}

编辑:知道使用以下 3D 位置坐标(m_x、m_y、m_z)创建 2 个立方体似乎很重要:

void 3dWidget::createScene()
{
    Cube* pCube = new Cube;
    pCube->create(0.5 /*size*/, -0.5 /*m_x*/, -0.5 /*m_y*/, -0.5 /*m_z*/);
    pCube = new Cube;
    pCube->create(0.5 /*size*/, +0.5 /*m_x*/, +0.5 /*m_y*/, +0.5 /*m_z*/);
}

最佳答案

使用gluLookAt定位相机。在任何对象转换之前将它应用于模型 View 矩阵。

显然,您必须找出相机要遵循的路径。这取决于您以及您希望“飞行”如何进行。

编辑: 需要说明的是,在 OpenGL 中没有相机概念本身。 gluLookAt 只是另一种变换(当应用于模型 View 矩阵时)具有将相机放置在指定位置的效果。

如果您真的只是想旋转世界,您的代码似乎会以合理的顺序执行变换。我不明白为什么你的物体绕着自己旋转而不是作为一个整体旋转。提供 SSCCE 可能会有所帮助使用过剩。

关于c++ - 如何让整个场景围绕自己旋转? (我的代码有一个小错误,就是让对象绕着自己旋转),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22248712/

相关文章:

c++ - 合并排序的合并函数

c++ - 前向申报的目的是什么?

c++ - 检测 QlistWidget 中某行是否单击了某个项目

c++ - COpenGLControl 类的两个实例之间的动态数据交换

c++ - 如果无法加载纹理,则回退到纯色

c++ - 警告#411 : class foo defines no constructor to initialize the following:

c++ - 派生类的 protected 成员未知

c++ - 如何在 C++ 中访问 3D 对象的最小和最大坐标?

c++ - glDrawArrays(...) 处的 OpenGL 访问冲突

python - 在 OpenGL 中的 3D 模型后面绘制背景视频