计算点在 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 旋转。例如,无论相机旋转如何,它都可以告诉我一个点是否可见。
注意:
我不担心有什么东西挡住了观点。
提前感谢您的帮助。
如果您有相机的视图和投影矩阵(我们称它们为 V
、P
),您可以将变换应用于您的点并检查结果是否在相机的剪辑体积。
说你的观点是 (x, y, z)
。构造一个向量 p = (x, y, z, 1)
并对其应用相机变换:
q = P * V * p
视图变换 V
根据相机位置和方向应用相对于相机的世界变换。然后,投影 P
将相机的视锥体(即相机的可见 space)变形为一个单位立方体,如下所示:
(图片来源: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
,该点位于相机的远平面之外,即该点太远,相机看不到。
- 否则,该点在相机可见范围内。
我正在试验 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 旋转。例如,无论相机旋转如何,它都可以告诉我一个点是否可见。
注意: 我不担心有什么东西挡住了观点。
提前感谢您的帮助。
如果您有相机的视图和投影矩阵(我们称它们为 V
、P
),您可以将变换应用于您的点并检查结果是否在相机的剪辑体积。
说你的观点是 (x, y, z)
。构造一个向量 p = (x, y, z, 1)
并对其应用相机变换:
q = P * V * p
视图变换 V
根据相机位置和方向应用相对于相机的世界变换。然后,投影 P
将相机的视锥体(即相机的可见 space)变形为一个单位立方体,如下所示:
(图片来源: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
,该点位于相机的远平面之外,即该点太远,相机看不到。 - 否则,该点在相机可见范围内。