【问题标题】:OpenGL Translate Rotate Scale TransformationOpenGL 平移 旋转 缩放 变换
【发布时间】:2013-08-18 10:57:35
【问题描述】:

我正在尝试创建仅包含(或仅对用户可见)位置、旋转和平移向量的用户友好转换类(以 Unity 为例)。

使用 glTranslate、glRotate 和 glScale 函数对 OpenGL 应用转换很容易。我在每个对象即将被绘制之前为它调用 Transform 方法。但是我在改变与旋转相关的位置时遇到了麻烦。这是我的代码。

// 对象的示例渲染方法

    void Render()
    {
        glPushMatrix();
        glMatrixMode(GL_MODELVIEW);

        transform->Transform();

        glEnable(GL_COLOR_MATERIAL);
        glEnableClientState(GL_VERTEX_ARRAY);
        glEnableClientState(GL_COLOR_ARRAY);

        glColorPointer(3, GL_FLOAT, 0, m_colors->constData());
        glVertexPointer(3, GL_FLOAT, 0, m_positions->constData());
        glDrawArrays(GL_LINES, 0, 6);

        glDisable(GL_COLOR_MATERIAL);
        glDisableClientState(GL_VERTEX_ARRAY);
        glDisableClientState(GL_COLOR_ARRAY);

        glPopMatrix();
    }

// 转换类

    class Transformation
    {

    public:

        QVector3D Position;
        QVector3D Rotation;
        QVector3D Scale;

        Transformation()
        {
            Position = QVector3D(0.0f, 0.0f, 0.0f);
            Rotation = QVector3D(0.0f, 0.0f, 0.0f);
            Scale    = QVector3D(1.0f, 1.0f, 1.0f);
        }

        ~Transformation()
        {

        }

        void Translate(const QVector3D& amount)
        {

        }

        void Rotate(const QVector3D& amount)
        {
            Rotation += amount;

            Rotation.setX(AdjustDegree(Rotation.x()));
            Rotation.setY(AdjustDegree(Rotation.y()));
            Rotation.setZ(AdjustDegree(Rotation.z()));
        }

        void Transform()
        {
            // Rotation
            glRotatef(Rotation.x(), 1.0f, 0.0f, 0.0f);
            glRotatef(Rotation.y(), 0.0f, 1.0f, 0.0f);
            glRotatef(Rotation.z(), 0.0f, 0.0f, 1.0f);

            // Translation
            glTranslatef(Position.x(), Position.y(), Position.z());

            // Scale
            glScalef(Scale.x(), Scale.y(), Scale.z());
        }

    };

我该如何翻译?

【问题讨论】:

  • 我的建议:不要使用 OpenGL 内置的变换矩阵操纵器。一方面,他们使用起来很麻烦。更重要的是,它们已完全从更高版本中删除。使用真正的矩阵数学库,如 GLM、Eigen 或 linmath.h
  • 感谢您的提示,但没有人回答我的问题。我在问如何按旋转度数进行翻译。
  • 这就是我写这篇文章作为评论的原因。

标签: opengl rotation translation transformation


【解决方案1】:

openGL 中的转换存储在堆栈中,然后反向应用于模型。在您的代码中,您首先应用比例,然后是平移,最后是旋转。由于旋转是从 (0, 0, 0) 进行的,因此如果您移动(平移)了对象,您将更改其位置。要旋转一个对象,它的中心应该在 (0, 0, 0)。

正确的变换顺序是:缩放/旋转,然后平移

因此,在您的代码中,翻译应该是您进行的第一个转换。

【讨论】:

  • 好的提示我还没有使用规模。我只知道在翻译之前必须应用旋转。谢谢。
  • @CahitBurakKüçüksütcü 但请注意,转换存储在堆栈中,因此反向应用。你必须先应用旋转,所以你必须编码旋转最新
  • @Stratford:实际上 OpenGL 转换存储在堆栈中。矩阵堆栈用于完全不同的目的,即能够创建可逆的转换层次结构。但是,当您连续调用 OpenGL 转换函数时,它们只会在一个 4×4 矩阵上相乘。
  • @datenwolf 我知道,但我使用了 store 这个词来让他更容易理解 :)
猜你喜欢
  • 2016-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-09
  • 2013-02-14
相关资源
最近更新 更多