1

ああ、偉大で知識豊富なスタック オーバーフローです。

私は 3 つの js ライブラリを使用しており、「範囲を表示」ボタンを実装する必要があります。ワールド内のすべてのオブジェクトがカメラ ビューに表示される位置にカメラを移動します (もちろんブロックされていない場合)。

世界中のすべてのオブジェクトのバウンディング ボックスを見つけることができます。たとえば、w0x、w0y、w0z および w1x、w1y、w1z とします。

これらの境界を考慮して、ボックスの端がはっきりと見えるようにカメラを配置するにはどうすればよいですか?

明らかに、表示する側を選択する必要があります...アルゴリズムをグーグル検索しましたが、役に立ちませんでした! ありがとう!

4

1 に答える 1

1

顔を選んだとしましょう。また、カメラの視線が軸の 1 つと平行になるようにカメラの位置を選択していること。

顔に一定の幅「w」があり、カメラの水平視野が「a」であるとします。把握したいのは、顔の中心からの距離 "d" で、カメラが全幅を表示する必要があります。

それを描くと、基本的に、底辺の長さが w で、頂点の角度が a である二等辺三角形があることがわかります。

二等辺三角形

それだけでなく、頂角の角度の二等分線は 2 つの同一の直角三角形を形成し、その長さ (底辺まで) は、把握する必要がある距離です。

Trig は、角度の正接は、三角形の反対側と隣接する側の比率であることを示しています。そう

tan(a/2) = (w/2) / d

単純化すると:

d = w / 2*tan(a/2)

そのため、バウンディング ボックスの面の 1 つから軸に沿った距離にカメラを配置する場合は、選択した軸に沿って d 距離だけ移動する必要があります。

いくつかの注意点があります。JavaScript 三角関数の入力にラジアンを使用していることを確認してください。また、顔の高さとカメラの垂直視野についてこれを再度計算し、顔が正方形でない場合はより遠い距離を選択する必要がある場合があります。

任意の角度からバウンディング ボックスを合わせたい場合は、同じアイデアを使用できますが、最初に、カメラの視線に垂直な平面に投影されたシーンの (整列した) バウンディング ボックスを見つける必要があります。

于 2013-02-14T21:58:04.440 に答える