gpt4 book ai didi

qt - 将 QMatrix4x4 与 OpenGL 函数一起使用

转载 作者:行者123 更新时间:2023-12-04 13:33:03 32 4
gpt4 key购买 nike

有没有简单的使用方法QMatrix4x4使用 OpenGL 函数,特别是 glMultMatrixf ?

如果我理解正确,我必须转置矩阵,并确保转换 qreal (可以是 floatdouble,具体取决于底层系统)到 GLfloat .
没有一个功能可以为我做这个吗?

我也有同样的问题 QVector3D ,这又是我需要的 GLfloat函数中的数组 glVertex3fv .

最佳答案

首先我想提一下QMatrix4x4具有矩阵乘法的内置运算符(带有第二个矩阵、向量或标量)。但是,您的问题仍然需要答案,因为您迟早希望将矩阵传递给 OpenGL。
QMatrix4x4用途 qreals为内部代表。虽然该类旨在直接与 OpenGL 一起使用(使用 Bart 在他的回答中建议的 constData()),但您可以确保根据类型将其传递给相应的 OpenGL 函数,如果您想保持平台兼容性(在嵌入式设备上,qrealfloat !):

// these are defined in the OpenGL headers:
void glMultMatrixf(const GLfloat *m);
void glMultMatrixd(const GLdouble *m);

// add overloaded functions which call the underlying OpenGL function
inline void glMultMatrix(const GLfloat *m) { glMultMatrixf(m); }
inline void glMultMatrix(const GLdouble *m) { glMultMatrixd(m); }

// add an overload for QMatrix4x4 for convenience
inline void glMultMatrix(const QMatrix4x4 &m) { glMultMatrix(m.constData()); }

您也可以将这种机制用于向量,这里是 glVertex* family,因为“原始指针”重载需要考虑的组件数量更多,所以它更有意义,但是面向对象的重载可以自动为您完成:
inline void glVertex2v(const GLfloat  *v) { glVertex2fv(v); }
inline void glVertex2v(const GLdouble *v) { glVertex2dv(v); }
inline void glVertex3v(const GLfloat *v) { glVertex3fv(v); }
inline void glVertex3v(const GLdouble *v) { glVertex3dv(v); }
inline void glVertex4v(const GLfloat *v) { glVertex4fv(v); }
inline void glVertex4v(const GLdouble *v) { glVertex4dv(v); }

// Note that QVectorND use floats, but we check this during compile time...
Q_STATIC_ASSERT(sizeof(QVector2D) == 2*sizeof(float));
Q_STATIC_ASSERT(sizeof(QVector3D) == 3*sizeof(float));
Q_STATIC_ASSERT(sizeof(QVector4D) == 4*sizeof(float));
inline void glVertex(const QVector2D &v) { glVertex2v(reinterpret_cast<const float*>(&v)); }
inline void glVertex(const QVector3D &v) { glVertex3v(reinterpret_cast<const float*>(&v)); }
inline void glVertex(const QVector4D &v) { glVertex4v(reinterpret_cast<const float*>(&v)); }

// Even for QPointF we can do it!
Q_STATIC_ASSERT(sizeof(QPointF) == 2*sizeof(qreal));
inline void glVertex(const QPointF &v) { glVertex4v(reinterpret_cast<const qreal*>(&v)); }

因此,如果进行以下更改,您的代码将保持有效:
  • Qt 更改 QVector* 的表示/QMatrix分别使用 float / double ,
  • 您的代码更改了向量的分量数

  • ...而尤其是当使用原始 OpenGL 命令(如 glVertex3f)时,情况并非如此。 .
    Q_STATIC_ASSERT上面代码中的 ionic 仅从 Qt 5.0 开始定义。如果您使用的是 Qt4(或与 Qt4 兼容的代码),请将其添加到某个全局头文件中/在您的定义之前: http://ideone.com/VDPUSg [来源:Qt5/qglobal.h]

    关于qt - 将 QMatrix4x4 与 OpenGL 函数一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14303126/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com