2010-09-14 60 views
0

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

我目前的做法是获得一个球体代表使用视图和投影矩阵以及视口值的方框和项目。

// 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. 箱子到相机的距离是多少?

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

+0

男人......我不明白这一点;) – fho 2010-09-14 15:30:41

回答

0

[更新]

什么是从盒到照相机的距离?

在 [哪个]坐标空间是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的回答有很长的路要做。