1

ここで奇妙な問題があります。現在のプロジェクトをQtのネイティブ行列/ベクトルクラスからEigenに変換していますが、解決できない問題が発生しました。

したがって、シェーダーのMVPを計算します。

DiagonalMatrix< double, 4 > diag( Vector4d( 1.0, 1.0, -1.0, 1.0 ) );
scrMatrix_.noalias() = projMatrix_ * diag * camMatrix_.inverse();

私のdiagすべての計算ではカメラの照準ベクトルが画面を指しいることがわかるため、マトリックスはZ軸を反転しますが、OpenGLはその逆を行います。とにかく、ビューポートのOpenGL側が表示され、正常に動作するため、これは機能します。

ビューポート出力の反対側は、QtのpaintEvent()システムを介した2Dオーバーレイペイントです。たとえば、グリッドラベリングです。したがって、同じマトリックスを使用して、カメラのクリップスペース内の3D位置を見つけます。

Vector4d outVec( scrMatrix_ * ( Vector4d() << inVec, 1.0 ).finished() );

私が完全に間違った結果を得る以外は:

inVec: 0 0 10
outVec: 11.9406 -7.20796

この例では、のようなものを期待していましoutVec: 0.55 -0.15た。私のGLSL頂点シェーダーは次のような計算を実行します。

gl_Position = scrMatrix_ * transform * vec4( inVec, 1.0 );

上記の例transformではアイデンティティであるため、2つの予測の違いはわかりませんが、結果はまったく異なります。私はこれがロングショットであることを知っていますが、誰かが私がどこで間違っているのかを見ることができますか?

アップデート:

比較のために、古い(動作している)Qtコードを再実装しました。

QVector3D qvec( vector( 0 ), vector( 1 ), vector( 2 ) );
QMatrix4x4 qmat( Affine3d( scrMatrix_ ).data() );
QPointF pnt = ( qvec * qmat ).toPointF() / 2.0;

対:

Vector4d vec( scrMatrix_ * ( Vector4d() << vector, 1.0 ).finished() );
QPointF pnt = QPointF( vec( 0 ), vec( 1 ) ) / 2.0;

私にとっては同じですが、Qtバージョンのみが機能します!

4

1 に答える 1

0

よく説明しましたが、結果のベクトルのXYZ軸をW軸のスケール係数(名前の手がかり...)でスケーリングする必要があります。

QtとOpenGLがバックグラウンドでどれだけ機能するかは驚くべきことです。

于 2011-07-18T21:44:43.080 に答える