13

キャリブレーションされたカメラを使用して 3D モデルをレンダリングする必要があるコンピューター ビジョンの問題に取り組んでいます。キャリブレーションされたカメラ マトリックスをモデルビュー マトリックスと射影マトリックスに分割する関数を作成していますが、opengl で説明に反する興味深い現象に遭遇しました (少なくとも私は)。

簡単な説明は、射影行列を否定すると、何もレンダリングされないということです(少なくとも私の経験では)。スケーリングの影響を受けない同次座標を変換するため、射影行列にスカラーを掛けても効果はないと思います。

以下は、これが予想外であると私が考える理由です。誰かが私の推論のどこに欠陥があるかを指摘できるかもしれません。

正しい結果が得られる次の透視投影行列を想像してください。

    [ a b c 0 ]
P = [ 0 d e 0 ]
    [ 0 0 f g ]
    [ 0 0 h 0 ]

これにカメラ座標を掛けると、均一なクリップ座標が得られます。

[x_c]   [ a b c 0 ]   [X_e]
[y_c] = [ 0 d e 0 ] * [Y_e]
[z_c]   [ 0 0 f g ]   [Z_e]
[w_c]   [ 0 0 h 0 ]   [W_e]

最後に、正規化されたデバイス座標を取得するために、x_c、y_c、および z_c を w_c で除算します。

[x_n]   [x_c/w_c]
[y_n] = [y_c/w_c]
[z_n]   [z_c/w_c]

ここで、P を否定すると、結果のクリップ座標は否定されますが、それらは同次座標であるため、任意のスカラー (-1 など) を掛けても、結果の正規化されたデバイス座標には影響しません。ただし、openGl では、P を否定すると何もレンダリングされません。P に非負のスカラーを掛けて、まったく同じレンダリング結果を得ることができますが、負のスカラーを掛けるとすぐに、何もレンダリングされません。ここで何が起こっているのですか??

ありがとう!

4

3 に答える 3

10

要するに、クリッピング テストは次の方法で行われるということです。

-w_c < x_c < w_c
-w_c < y_c < w_c
-w_c < z_c < w_c

負の値を掛けると、このテストに違反します。

于 2010-02-18T08:19:11.673 に答える
2

私はこのちょっとしたことを見つけました。これは答えに向かって進んでいます:

レッドブック、付録Gから:

負の w 頂点座標と負の q テクスチャ座標を使用しないでください。OpenGL はそのような座標を正しくクリップしない可能性があり、そのような座標によって定義されたプリミティブをシェーディングするときに補間エラーが発生する可能性があります。

射影行列を反転すると、負の W クリッピング座標が発生し、opengl はこれを好まないようです。しかし、なぜopenglがこのケースを処理しないのか、誰でも説明できますか?

参照: http://glprogramming.com/red/appendixg.html

于 2010-02-18T05:41:26.737 に答える
0

私が考えることができる理由:

  • 射影行列を逆にすることで、座標は視錐台の zNear 平面と zFar 平面内になくなります (必然的に 0 より大きくなります)。
  • ウィンドウ座標を作成するために、正規化されたデバイス座標がビューポートによって変換/スケーリングされます。したがって、クリップ座標に負のスカラーを使用した場合、正規化されたデバイス座標 (現在は反転されています) は、ビューポートをウィンドウから離れたウィンドウ座標に変換します (必要に応じて、左と下に)

また、カメラ行列を使用し、射影行列を反転したと述べたので、カメラ行列から何をどの行列に適用しているのかを尋ねなければなりませんか? 射影行列を操作すると、near/far/fovy/aspect を保存すると、z を使用するもの (深度テスト、面カリングなど) を含む深度バッファーにあらゆる種類の問題が発生します。

変換に関する OpenGL FAQ セクションには、さらに詳細が記載されています。

于 2010-02-18T09:58:10.493 に答える