我正在尝试 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旋转。例如,无论相机旋转如何,它都可以告诉我是否可以看到一个点。
注意: 我并不担心阻碍这一观点的任何事情。
感谢您的帮助。
答案 0 :(得分:1)
如果您有摄像机的视图和投影矩阵(我们称之为V
,P
),您只需将变换应用到您的点并检查结果是否在剪辑体积内相机。
说你的观点是(x, y, z)
。构造一个向量p = (x, y, z, 1)
并将相机变换应用于它:
q = P * V * p
视图变换V
根据相机位置和方向应用世界相对于相机的变换。然后,投影P
将相机的视锥体(即相机的可见空间)变形为单位立方体,如下所示:
(图片来源:Song Ho Ahn)
为了读取结果点的坐标值,我们必须首先通过除以w
分量对其进行去均匀化:
r = q / q.w
现在,组件r.x
,r.y
,r.z
会告诉您该点是否位于相机的可见范围内:
r.x < -1
,则该点位于屏幕的左边框之外。r.x > 1
,则该点位于屏幕的右边框之外。r.y < -1
,则该点位于屏幕的下边框之外。r.y > 1
,则该点位于屏幕的上边框之外。r.z < -1
,该点位于相机的近平面之外,即该点位于相机后面或者太靠近相机无法看到。r.z > 1
,该点位于相机的远处平面之外,即该点太远而无法让相机看到。