ビューポート(私の場合はDirectXシーン)内にバウンディングボックスを収めるアルゴリズムを探しています。正投影カメラでバウンディング球を中心に配置するためのアルゴリズムについては知っていますが、バウンディングボックスと遠近法カメラでも同じことが必要になります。このアプリはユーザーが編集可能な変数としてFOVを持っているため、FOVを変更することはできません。そのため、カメラを移動する必要があります。
私はほとんどのデータを持っています:
- カメラのアップベクトルがあります
- バウンディングボックスの中心点があります
- カメラポイントからボックスの中心までのルックアットベクトル(方向と距離)があります
- カメラに垂直な平面にポイントを投影し、最大/最小のX座標とY座標が表示平面の内側または外側にあることを表す係数を取得しました。
私が抱えている問題:
- バウンディングボックスの中心は、必ずしもビューポートの中心にあるとは限りません(つまり、投影後のバウンディング長方形です)。
- 視野が投影を「歪める」ので(http://en.wikipedia.org/wiki/File:Perspective-foreshortening.svgを参照)、カメラを動かすためのスケールファクターとして係数を単純に使用することはできません。これは、オーバーシュートするためです。 /目的のカメラ位置をアンダーシュートします
ビューポートを可能な限り完全なピクセルで満たすようにカメラの位置を見つけるにはどうすればよいですか(アスペクト比が1.0から遠く離れている場合を除き、画面軸の1つを埋めるだけで済みます)。
私は他のいくつかのことを試しました:
- バウンディング球と接線を使用して、カメラを移動するための倍率を見つけます。これはうまく機能しません。なぜなら、透視投影が考慮されていないためです。次に、平面と長いジオメトリがたくさんあるため、球は私の使用には不適切なバウンディングボリュームです。
- 関数の呼び出しを繰り返して、カメラの位置のエラーをどんどん小さくしていきます。これはある程度機能しましたが、カメラの位置がオーバーシュートしすぎてエラー係数が増加するという奇妙なエッジケースに遭遇することがあります。また、これを行うとき、外接する長方形の位置に基づいてモデルを再センタリングしませんでした。それを確実に行うための確実で堅牢な方法を見つけることができませんでした。
助けてください!