计算3D空间中的点可见性

时间:2016-06-09 22:32:44

标签: java 3d camera lwjgl

我正在尝试 LWJGL2 ,我希望能够判断相机是否能够在 3D空间中看到某个点。我正在尝试自己,看看我是否可以做到这一点,并最终得到了一些有用的东西,只有在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旋转。例如,无论相机旋转如何,它都可以告诉我是否可以看到一个点。

注意: 我并不担心阻碍这一观点的任何事情。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

如果您有摄像机的视图和投影矩阵(我们称之为VP),您只需将变换应用到您的点并检查结果是否在剪辑体积内相机。

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

q = P * V * p

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

enter image description here
(图片来源: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,该点位于相机的远处平面之外,即该点太远而无法让相机看到。
  • 否则,该点位于相机的可见范围内。