0

位置、回転、および平行移動ベクトルのみを保持する (またはユーザーにのみ表示される) ユーザー Firendly 変換クラス (例として 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());
        }

    };

どうすれば翻訳できますか?

4

1 に答える 1