计算点在 3D 中的可见性 space

Calculating points visibility in 3D space

我正在试验 LWJGL2,我想知道相机是否能够看到 3D space 中的某个点。我正在自己尝试看看我是否可以做到,并最终得到了一些可行的东西,并且只能在 Y 轴上旋转。

此代码有效,但不适用于两个轴。我也不确定这是否是正确的方法。

public boolean isInFrame(float x, float y, float z){ //The z isn't used

    float camera = rotation.y; //The cameras y rotation
    double object = Math.atan2(y, x)*(180/Math.PI);

    object += (180 - camera);
    if (object <0 ) object += 360;
    if (object >360 ) object -= 360;

    return 270>object&&90<object; //set to 180˚ for test


}

对于代码,我假设相机以 0,0,0 为中心。

我只是想知道如何更改它以使其适用于相机的 x 和 y 旋转。例如,无论相机旋转如何,它都可以告诉我一个点是否可见。

注意: 我不担心有什么东西挡住了观点。

提前感谢您的帮助。

如果您有相机的视图和投影矩阵(我们称它们为 VP),您可以将变换应用于您的点并检查结果是否在相机的剪辑体积。

说你的观点是 (x, y, z)。构造一个向量 p = (x, y, z, 1) 并对其应用相机变换:

q = P * V * p

视图变换 V 根据相机位置和方向应用相对于相机的世界变换。然后,投影 P 将相机的视锥体(即相机的可见 space)变形为一个单位立方体,如下所示:


(图片来源:Song Ho Ahn

为了读取结果点的坐标值,我们必须首先通过除以其 w 分量来对其进行去均质化:

r = q / q.w

现在,分量 r.xr.yr.z 告诉你该点是否在相机的可见范围内:

  • 如果r.x < -1,该点位于屏幕左边框之外。
  • 如果r.x > 1,该点位于屏幕右边界之外。
  • 如果r.y < -1,该点位于屏幕底部边框之外。
  • 如果r.y > 1,该点位于屏幕上边框之外。
  • 如果r.z < -1,该点位于相机的近平面之外,即该点在相机后面或离相机太近而无法看到。
  • 如果r.z > 1,该点位于相机的远平面之外,即该点太远,相机看不到。
  • 否则,该点在相机可见范围内。