检查框内是不是有 3D 点

Posted

技术标签:

【中文标题】检查框内是不是有 3D 点【英文标题】:Check if 3D point inside a box检查框内是否有 3D 点 【发布时间】:2018-10-05 22:21:56 【问题描述】:

我有一个由 8 个顶点组成的盒子,可以在任何方向上缩放或旋转,所以我对每个变换的顶点应用变换矩阵,我在 X、Y 和 Z 上从中心有中心、大小和方向,怎么能我检查盒子内是否有任何 3D 点?

【问题讨论】:

【参考方案1】:

如果你有:

vec3 center; // Center of the box.
vec3 dx, dy, dz; // X,Y, and Z directions, normalized.
vec3 half; // Box size in each dimension, divided by 2.

vec3 point; // Point to test.

那么测试就这么简单:

vec3 d = point - center;
bool inside = abs(dot(d, dx)) <= half.x &&
              abs(dot(d, dy)) <= half.y &&
              abs(dot(d, dz)) <= half.z;

点积的主要属性是 X⋅Y == |X|⋅|Y|⋅cos(angle_formed_by_X_and_Y).

如果Y 被归一化,那么X⋅Y 基本上给出了XY 上的投影长度(如果XY 形成的角度为钝角,则为负数)。一旦你有了投影长度,你只需要将它们的绝对值与你的盒子对应的半范围进行比较。

【讨论】:

感谢您的精彩解释,我实现了它并且工作得很好 您好,您能解释一下 dx、dy 和 dz 是什么吗?这些方向是什么? @Biiiiiird 这些基本上是盒子侧面的法线(单位长度的向量垂直于侧面)。 @HolyBlackCat 所以 dx, dy, dz 是相对于或局部于盒子本身,而不是全局轴 x、y 和 z?我可以通过找到盒子 3 个侧面的法线来简单地计算这个吗?也可以计算例如。 half.x,这也是本地的吗?计算顶点中的最大和最小 x 值,将两者相减并除以 2?希望我的理解是正确的。 @Biiiiiird dx,dy,dz 不依赖于盒子位置,是的。它们确实取决于它的旋转。是的,只需计算法线。我不确定 half.x/y/z 是本地的还是全局的,它只是盒子大小除以二。

以上是关于检查框内是不是有 3D 点的主要内容,如果未能解决你的问题,请参考以下文章

检查两个 3D numpy 数组是不是包含重叠的 2D 数组

鼠标坐标到 3D 世界/投影以进行点碰撞

Unity3d检查用户是不是拥有授权设备相机

使用 jQuery 检查收音机时,检查收音机是不是已检查不起作用

Android:如何检查矩形是不是包含触摸点?

如何检查滑动是不是在堆栈视图的范围内