1

私は現在、サイズとカメラまでの距離を決定するために画面に投影したい数千のボックスを扱っています。

私の現在のアプローチは、ビューと投影行列とビューポート値を使用して、ボックスとプロジェクトを表す球体を取得することです。

// PSEUDOCODE

// project box center from world into viewspace
boxCenterInViewSpace = viewMatrix * boxCenter;

// get two points left and right of center
leftPoint = boxCenter - radius;
right = boxCenter + radius;

// project points from view into eye space
leftPoint = projectionMatrix * leftPoint;
rightPoint = projectionMatrix * rightPoint;

// normalize points
leftPoint /= leftPoint.w;
rightPoint /= rightPoint.w;

// move to 0..1 range
leftPoint = leftPoint * 0.5 + 0.5;
rightPoint = rightPoint * 0.5 + 0.5;

// scale to viewport
leftPoint.x = leftPoint.x * viewPort.right + viewPort.left;
leftPoint.y = leftPoint.y * viewPort.bottom + viewPort.top;

rightPoint.x = rightPoint.x * viewPort.right + viewPort.left;
rightPoint.y = rightPoint.y * viewPort.bottom + viewPort.top;

// at this point i check if the node is visible on screen by comparing the points to the viewport

// calculate size
length(rightPoint - leftPoint)

別の時点で、ボックスからカメラまでの距離を計算します。

最初の問題は、水平方向を計算するだけなので、ボックスがビューポートのすぐ下にあるかどうかわからないことです。どうにかして実際の球体をスクリーンに投影する方法はありますか? 次のようなメソッド:

float getSizeOfSphereProjectedOnScreen(vec3 midpoint, float radius)

他の質問はもっと簡単です: 座標空間では、z 座標はカメラまでの距離に対応していますか?

要約すると、私は計算したい:

  1. 視錐台のボックスはありますか?
  2. 画面上のボックスのサイズは?
  3. ボックスからカメラまでの距離は?

計算を簡単にするために、これに球体表現を使用したいのですが、球体を投影する方法がわかりません。

4

1 に答える 1

0

[更新しました]

ボックスからカメラまでの距離は?

カメラまでの距離に対応する z 座標は、[どの] 座標空間にありますか?

答えは、通常のスペースではありません。最も近いものは、ビュー スペースにあります (つまり、ビュー マトリックスを適用し、投影マトリックスを適用した後)。ビュー スペースでは、カメラまでの距離は になりますsqrt(x*x + y*y + z*z)。これは、カメラが原点にあるためです。(z は、|x| と |y| が |z| に比べて非常に小さい場合にのみ妥当な近似値となります。) これは、カメラからボックスの中心までの距離が分かれば十分であると想定しています。

z座標がカメラまでの距離に対応する空間が本当に必要な場合は、点の球状軌跡をsqrt(x*x + y*y + z*z) = d平面にマッピングする必要があると思いますz = d。マトリックスでそれができるかどうかはわかりません。

  • 視錐台のボックスはありますか?
  • 画面上のボックスのサイズは?

これで正しい軌道に乗っていると思いますが、カメラが向いている方向によっては、左と右の点がボックスの幅や、ボックスが視錐台と交差するかどうかを決定しない場合があります。これを行うための長い道のりについては、他の質問に対する私の回答を参照してください。

于 2010-09-15T16:06:11.290 に答える