作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有没有简单的使用方法QMatrix4x4
使用 OpenGL 函数,特别是 glMultMatrixf
?
如果我理解正确,我必须转置矩阵,并确保转换 qreal
(可以是 float
或 double
,具体取决于底层系统)到 GLfloat
.
没有一个功能可以为我做这个吗?
我也有同样的问题 QVector3D
,这又是我需要的 GLfloat
函数中的数组 glVertex3fv
.
最佳答案
首先我想提一下QMatrix4x4
具有矩阵乘法的内置运算符(带有第二个矩阵、向量或标量)。但是,您的问题仍然需要答案,因为您迟早希望将矩阵传递给 OpenGL。QMatrix4x4
用途 qreals
为内部代表。虽然该类旨在直接与 OpenGL 一起使用(使用 Bart 在他的回答中建议的 constData()
),但您可以确保根据类型将其传递给相应的 OpenGL 函数,如果您想保持平台兼容性(在嵌入式设备上,qreal
是 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*
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)); }
QVector*
的表示/QMatrix
分别使用 float / double ,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/
我是一名优秀的程序员,十分优秀!