屏幕投影和剔除联合

时间:2010-09-14 15:30:18

标签: opengl screen-projection

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

我目前的方法是使用视图和投影矩阵以及视口值来获取表示框和项目的球体。

// 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. 视图中的Box是否为视锥体?
  2. 屏幕上Box的大小是多少?
  3. 从Box到相机的距离是多少?
  4. 为了简化计算,我想为此使用球体表示,但我不知道如何投射球体。

1 个答案:

答案 0 :(得分:0)

<强> [更新]

  

Box与相机之间的距离是多少?

     

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

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

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

  
      
  • 视图中的Box是否为视锥体?
  •   
  • 屏幕上Box的大小是多少?
  •   

我认为你正处于正确的轨道上,但是根据相机朝向的方向,你的左右点可能无法确定盒子的宽度或盒子是否与视锥体相交。请参阅我对your other question的回答。很长一段时间。