【问题标题】:Screen Projection and Culling unitedScreen Projection 和 Culling 相结合
【发布时间】:2011-04-12 05:50:12
【问题描述】:

我目前正在处理几千个盒子,我想将它们投影到屏幕上以确定它们的大小和到相机的距离。

我目前的方法是使用视图和投影矩阵以及视口值来获得一个表示盒子和投影的球体。

// 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. 屏幕上的 Box 大小是多少?
  3. Box 到相机的距离是多少?

为了简化计算,我想为此使用球体表示,但我不知道如何投影球体。

【问题讨论】:

  • 伙计...我不能直截了当地说;)

标签: opengl screen-projection


【解决方案1】:

[更新]

Box 到相机的距离是多少?

在 [which] 坐标空间是 z 对应的坐标 到相机的距离?

答案不是通常的空格。最接近的将在视图空间中(即在应用视图矩阵而不是投影矩阵之后)。在视图空间中,到相机的距离应该是sqrt(x*x + y*y + z*z),因为相机在原点。 (仅当 |x| 和 |y| 相对于 |z| 非常小时,z 才是合理的近似值。)这是假设知道从相机到框的 中心 的距离是足够好。

我认为,如果您真的想要一个 z 坐标对应于相机距离的空间,您需要将点 sqrt(x*x + y*y + z*z) = d 的球面轨迹映射到平面 z = d。我不知道你可以用矩阵做到这一点。

  • 视图中的方框是平截头体吗?
  • 屏幕上的 Box 大小是多少?

我认为您对此的看法是正确的,但是根据相机朝向的方向,您的左右点可能无法确定框看起来有多宽或框是否与视锥相交。请参阅我对your other question 的回复,了解如何做到这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    相关资源
    最近更新 更多