QMatrix4x4
特に、OpenGL関数で使用する簡単な方法はありglMultMatrixf
ますか?
この権利を理解している場合は、行列を転置する必要があります。必ず(基礎となるシステムのいずれかまたは依存するqreal
可能性があります)をに変換する必要があります。これをやってくれる機能はありませんか?float
double
GLfloat
、にも同じ問題があります。これも関数の配列QVector3D
として必要です。GLfloat
glVertex3fv
QMatrix4x4
最初に、行列乗算 (2 番目の行列、ベクトル、またはスカラー) 用の組み込み演算子があることに言及したいと思います。ただし、遅かれ早かれ行列を OpenGL に渡したいため、質問にはまだ回答が必要です。
QMatrix4x4
qreals
内部表現に使用します。このクラスは OpenGL で直接使用することを意図していますが ( constData()
Bart の回答で提案されているように使用)、プラットフォームの互換性を維持したい場合 (組み込みデバイス上) は、タイプに応じて対応する 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*
ファミリー) にも使用できます。「生のポインター」のオーバーロードが考慮する必要があるコンポーネントの数のためにさらに理にかなっていますが、オブジェクト指向のオーバーロードは自動的に行うことができます。
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
、...特に2番目は、のような生のOpenGLコマンドを使用する場合には当てはまりませんglVertex3f
。
上記Q_STATIC_ASSERT
のコードのイオンは、Qt 5.0 以降でのみ定義されています。Qt4 (または Qt4 と互換性のあるコード) を使用している場合は、これをいくつかのグローバル ヘッダー ファイルに / 定義の前に追加します: http://ideone.com/VDPUSg [source: Qt5 / qglobal.h]
qreal
ARM アーキテクチャを除くすべてのプラットフォームで double と定義されています。したがって、あなたの場合、それらはダブルである可能性が最も高いです。
そうは言っても、メソッドを使用して、QMatrix4x4をOpenGLで完全に問題なく使用できますconstData()
。もちろん、 double 型の場合は、 を使用するかglMultMatrixd
、 float 行列を作成する必要があります。これはあなたがやりたいことではないかもしれません。OpenGL デモでマトリックス型を使用する Qt によるさまざまな例があります。
個人的には、OpenGL コードに Qt の行列型とベクトル型を使用することはありませんが (Qt を広く使用していますが)、Eigen、GLM、またはその他の適切なライブラリを使用します。