私は現在、サイズとカメラまでの距離を決定するために画面に投影したい数千のボックスを扱っています。
私の現在のアプローチは、ビューと投影行列とビューポート値を使用して、ボックスとプロジェクトを表す球体を取得することです。
// 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 座標はカメラまでの距離に対応していますか?
要約すると、私は計算したい:
- 視錐台のボックスはありますか?
- 画面上のボックスのサイズは?
- ボックスからカメラまでの距離は?
計算を簡単にするために、これに球体表現を使用したいのですが、球体を投影する方法がわかりません。