Opengl 屏幕投影和筛选联合

Opengl 屏幕投影和筛选联合,opengl,screen-projection,Opengl,Screen Projection,我目前正在处理几千个盒子,我想把它们投射到屏幕上,以确定它们的大小和到相机的距离 我当前的方法是使用视图和投影矩阵以及视口值获取一个表示长方体和项目的球体 // PSEUDOCODE // project box center from world into viewspace boxCenterInViewSpace = viewMatrix * boxCenter; // get two points left and right of center leftPoint = boxCen

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

我当前的方法是使用视图和投影矩阵以及视口值获取一个表示长方体和项目的球体

// 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坐标是否与到摄影机的距离相对应

总之,我想计算:

  • 长方体是否位于视锥体中
  • 屏幕上盒子的大小是多少
  • 从盒子到相机的距离是多少

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

    [更新]

    从盒子到相机的距离是多少

    在 [哪个]坐标空间是z 坐标对应于 到摄像机的距离

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

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

    • 长方体是否位于视锥体中
    • 屏幕上盒子的大小是多少

    我认为这是正确的,但取决于相机朝向哪个方向,左右点可能无法确定长方体看起来有多宽,或者长方体是否与视锥体相交。要做到这一点,请参阅我的答案。

    伙计。。。我说不到重点;)