有没有简单的使用方法QMatrix4x4
与 OpenGL 功能,特别是glMultMatrixf
?
如果我理解正确的话,我必须转置矩阵,并确保转换qreal
(可以是float
or double
取决于底层系统)GLfloat
。
没有一个函数可以为我做这个吗?
我也有同样的问题QVector3D
,我再次需要作为GLfloat
函数中的数组glVertex3fv
.
首先我想提一下QMatrix4x4
具有用于矩阵乘法的内置运算符(与第二个矩阵、向量或标量)。但是,您的问题仍然需要答案,因为您迟早想将矩阵传递给 OpenGL。
QMatrix4x4
uses qreals
用于内部代表。虽然该类旨在直接与 OpenGL 一起使用(使用constData()
正如 Bart 在他的回答中所建议的那样),如果您想保持平台兼容性(在嵌入式设备上,qreal
is float
!):
// 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*
系列,它更有意义,因为“原始指针”重载需要考虑组件的数量,但面向对象的重载可以自动为您完成:
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
分别使用浮点数/双精度数,
- 您的代码更改了向量的分量数量
...而特别是当使用原始 OpenGL 命令时,第二种情况并非如此glVertex3f
.
The Q_STATIC_ASSERT
上面代码中的 ion 是从 Qt 5.0 开始才定义的。如果您使用的是 Qt4(或与 Qt4 兼容的代码),请在某个全局头文件中/定义之前添加以下内容:http://ideone.com/VDPUSg http://ideone.com/VDPUSg[来源:Qt5/qglobal.h]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)