我希望确定射线与盒子之间的交点。该盒子由其最小三维坐标和最大三维坐标定义,射线由其起点和指向方向定义。
目前,我正在为盒子的每个面形成一个平面,并将射线与该平面相交。如果射线与平面相交,则检查交点是否实际上在盒子表面上。如果是,则检查它是否是该射线的最近交点,并返回最近的交点。
我检查平面交点是否在盒子表面本身上的方式是通过一个函数。
目前,我正在为盒子的每个面形成一个平面,并将射线与该平面相交。如果射线与平面相交,则检查交点是否实际上在盒子表面上。如果是,则检查它是否是该射线的最近交点,并返回最近的交点。
我检查平面交点是否在盒子表面本身上的方式是通过一个函数。
bool PointOnBoxFace(R3Point point, R3Point corner1, R3Point corner2)
{
double min_x = min(corner1.X(), corner2.X());
double max_x = max(corner1.X(), corner2.X());
double min_y = min(corner1.Y(), corner2.Y());
double max_y = max(corner1.Y(), corner2.Y());
double min_z = min(corner1.Z(), corner2.Z());
double max_z = max(corner1.Z(), corner2.Z());
if(point.X() >= min_x && point.X() <= max_x &&
point.Y() >= min_y && point.Y() <= max_y &&
point.Z() >= min_z && point.Z() <= max_z)
return true;
return false;
}
其中corner1
是该盒子面矩形的一个角,corner2
是对面的角。我的实现大多数时候都能正常工作,但有时会给我错误的交点。请参见以下图像:
这张图片展示了从相机的眼睛出发并击中盒子表面的射线。其他射线是盒子表面的法线。可以看到特定的一条射线(实际上是法线)从盒子的“后面”出现,而法线应该从盒子的顶部向上出现。这似乎很奇怪,因为还有其他多个射线正确地击中了盒子的顶部。
我想知道我检查交点是否在盒子上的方式是否正确,或者是否应该使用其他算法。
谢谢。