ここで奇妙な問題があります。現在のプロジェクトを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バージョンのみが機能します!