4

QMatrix4x4特に、OpenGL関数で使用する簡単な方法はありglMultMatrixfますか?

この権利を理解している場合は、行列を転置する必要があります。必ず(基礎となるシステムのいずれかまたは依存するqreal可能性があります)をに変換する必要があります。これをやってくれる機能はありませんか?floatdoubleGLfloat

、にも同じ問題があります。これも関数の配列QVector3Dとして必要です。GLfloatglVertex3fv

4

2 に答える 2

4

QMatrix4x4最初に、行列乗算 (2 番目の行列、ベクトル、またはスカラー) 用の組み込み演算子があることに言及したいと思います。ただし、遅かれ早かれ行列を OpenGL に渡したいため、質問にはまだ回答が必要です。

QMatrix4x4qreals内部表現に使用します。このクラスは 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)); }

したがって、次の変更が行われた場合、コードは有効なままになります。

  • Qt は / の表現をそれぞれ float / double を使用するように変更QVector*QMatrix
  • あなたのコードは、ベクトルの成分の数を変更します

...特に2番目は、のような生のOpenGLコマンドを使用する場合には当てはまりませんglVertex3f

上記Q_STATIC_ASSERTのコードのイオンは、Qt 5.0 以降でのみ定義されています。Qt4 (または Qt4 と互換性のあるコード) を使用している場合は、これをいくつかのグローバル ヘッダー ファイルに / 定義の前に追加します: http://ideone.com/VDPUSg [source: Qt5 / qglobal.h]

于 2013-01-14T18:19:55.873 に答える
2

qrealARM アーキテクチャを除くすべてのプラットフォームで double と定義されています。したがって、あなたの場合、それらはダブルである可能性が最も高いです。

そうは言っても、メソッドを使用して、QMatrix4x4をOpenGLで完全に問題なく使用できますconstData()。もちろん、 double 型の場合は、 を使用するかglMultMatrixd、 float 行列を作成する必要があります。これはあなたがやりたいことではないかもしれません。OpenGL デモでマトリックス型を使用する Qt によるさまざまな例があります。

個人的には、OpenGL コードに Qt の行列型とベクトル型を使用することはありませんが (Qt を広く使用していますが)、Eigen、GLM、またはその他の適切なライブラリを使用します。

于 2013-01-13T11:56:56.693 に答える