我目前正在处理数千个我想投影到屏幕上以确定它们的大小和到相机的距离的盒子。
我目前的方法是使用视图和投影矩阵以及视口值来获得一个代表盒子和项目的球体。
// 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坐标是否对应于到相机的距离?
总结一下,我想计算:
- 视图中的盒子是平截头体吗?
- 屏幕上的 Box 大小是多少?
- Box到相机的距离是多少?
为了简化计算,我想为此使用球体表示,但我不知道如何投影球体。