1

現在、オブジェクトのバウンディング ボックスの各コーナーを取り、それを正規化されたデバイス座標 (NDC) に変換しており、最大および最小の NDC を追跡しています。次に、NDC の中央を計算し、世界でそれを見つけて、カメラにそれを見てもらいます。

<Determine max and minimum NDCs>

centerX = (maxX + minX) / 2;
centerY = (maxY + minY) / 2;

point.set(centerX, centerY, 0);
projector.unprojectVector(point, camera);
direction = point.sub(camera.position).normalize();
point = camera.position.clone().add(direction.multiplyScalar(distance));

camera.lookAt(point);
camera.updateMatrixWorld();

これはおおよその方法ですよね?私はそれがいくつかの場所で提案されているのを見ました。オブジェクトを中央に配置するたびに、(他の変更が行われる前に) 再計算されるときに最小 NDC と最大 NDC が等しくなるはずですが、そうではないためです。私は近づくが等しい数ではなく(負の符号を無視して)、近づくにつれて数字の間の「誤差」がますます大きくなります。つまり、最初のいくつかの中心のエラーは次のとおりです。

これを引き起こす可能性のある行方不明のステップはありますか?

このコードを while ループの一部として使用して、オブジェクトを最大化して画面の中央に配置しています。(私は、ユーザーが方位と標高を入力できるようにプログラムしています。カメラは、その方位と標高でオブジェクトを表示するように配置されます。数週間後、(今のところ)より簡単であると判断しましたこのようにします。)

ただし、カメラをオブジェクトに近づけるほど、これはバラバラになり始めるようです。たとえば、数回繰り返した後、最大 X NDC は 0.9989318709122867 になり、最小 X NDC は -0.9552042384799428 になります。ただし、計算されたポイントを見ると、あまりにも右に見えます。次の反復では、最大 X NDC は 0.9420058636660581 であり、最小 X NDC は 1.0128126740876888 です。

4

2 に答える 2

1

この問題に対するあなたのアプローチは正しくありません。画面座標で考えるのではなく、シーンで考えてみてください。

カメラからの光線がオブジェクトの中心に当たるように、カメラをどれだけ移動する必要があるかを計算する必要があります。あなたが野原に立っていると想像してください。あなたの反対側に 2 人の Alex と Burt がいます。Burt は Alex の 2 メートル右に立っています。あなたは現在アレックスを直接見ていますが、向きを変えずにバートを見たいと思っています。それらの間の距離と方向がわかっている場合は、右に 2 メートルです。その距離と方向、つまり右に 2 メートル移動するだけです。

数学的コンテキストでは、次のことを行う必要があります。

3D 空間で焦点を合わせているオブジェクトの中心を取得し、カメラに平行な平面、つまりカメラが向いている方向への接線を投影し、その点に位置します。

次に、カメラが向いている方向にカメラから平面にレイキャストします。オブジェクトの中心点と、カメラから平面に当たる点との差が、カメラを動かすのに必要な量になります。これは、カメラとオブジェクトの方向や位置に関係なく機能するはずです。

于 2013-08-09T08:04:45.303 に答える
0

あなたは最初に起こった問題を演じています。鶏が先か卵が先か。カメラ属性を変更するたびに、オブジェクトがNDC空間で投影される場所が効果的に変更されます。ですから、近づいていると思っていても、そこにたどり着くことはありません。

別の角度から問題を見てください。カメラをどこかに配置し、可能な限り標準的にして(つまり、アスペクト比を1にする)、カメラのz軸の周りにオブジェクトを配置します。これは不可能ですか?

于 2013-03-06T21:33:52.223 に答える