java - 检查光线是否与虚拟框相交
问题描述
我有一个包含 2 个 3DPoint 的虚拟框,其中一个是最小值 (x,y,z),第二个是最大值 (x,y,z)
我有一条带有中心点和方向矢量的射线
如何检查向量是否与此虚拟框有交集
(我有dotProduct、crossProduct、distance等的所有方法)但是我不知道我需要如何开始查找是否有交叉点,
在附加图像中,我尝试显示 2 种状态,一种是光线有交集,另一种没有。如何通过代码找到它
现在,如果有交叉点,我只需要查找布尔值,实际上我不需要找到这些点。
public class BoundaryVolume {
public Point3D min;
public Point3D max;
....
public boolean boundingIntersection(Ray ray) {
//Point3D p0 = ray.get_POO();
// Vector v = ray.get_direction();
// Vector v1 = min.subtract(p0);
// Vector v2 = max.subtract(p0);
// double s1 = v.dotProduct(v1.crossProduct(v2).normalized());
// if (isZero(s1)) return false;
}
}
射线:
public class Ray {
private Point3D _POO;
private Vector _direction;
....
}
解决方案
设射线有起点rx, ry, rz
和方向向量dx, dy, dz
,轴对齐框的两个角是A和B(B分量大于A分量)。
在参数形式中,射线可以表示为
x = rx + t * dx
y = ry + t * dy
z = rz + t * dz
其中 t 是范围内的参数0..Infinity
获取光线与平面 Ax、Bx、Ay 等相交的 t 个参数。
t_ax = (A.x - rx) / dx
t_bx = (B.x - rx) / dx
t_ay = (A.y - ry) / dy
...
选择参数的正值,并为每个计算交点是否位于相应的矩形
y_ax = ry + t_ax * dy
z_ax = rz + t_ax * dz
if (A.y<=y_ax<=B.y) and ((A.z<=z_ax<=B.z))
ray intersects a face
if not - continue with the next face