3d 如何在三维网格中找到光线相交的所有立方体?

3d 如何在三维网格中找到光线相交的所有立方体?,3d,collision-detection,3d,Collision Detection,我需要将光线从地面投射到太阳上,并想知道阴影中是否有物体。我计划通过追踪一条从地面立方体到太阳的直线,找出是否有任何物体挡住了我的视线。然而,我不熟悉数学,无法找到一条直线相交的所有立方体,因此我可以测试它们是否已填充。有人能解释一下吗?您想执行一个(或在本例中,许多)光线盒相交。下面是一个示例算法: 或者,如果您的立方体都是轴对齐且紧密排列的,您可能需要尝试Bresenham算法的3D版本(用于通过像素绘制线)。蛮力方法是检查每个立方体都在您的线上。IIRC涉及到一些非平凡的几何体 啊。谷歌

我需要将光线从地面投射到太阳上,并想知道阴影中是否有物体。我计划通过追踪一条从地面立方体到太阳的直线,找出是否有任何物体挡住了我的视线。然而,我不熟悉数学,无法找到一条直线相交的所有立方体,因此我可以测试它们是否已填充。有人能解释一下吗?

您想执行一个(或在本例中,许多)光线盒相交。下面是一个示例算法:


或者,如果您的立方体都是轴对齐且紧密排列的,您可能需要尝试Bresenham算法的3D版本(用于通过像素绘制线)。

蛮力方法是检查每个立方体都在您的线上。IIRC涉及到一些非平凡的几何体

啊。谷歌搜索“线立方体碰撞”找到了不少点击率。这个看起来很有希望

基本上是这样的(我肯定会犯错误):

以构成立方体角的8个顶点为例。我们将四人一组来解决这个问题

第一个任务是计算出所有6个面法线,并将它们存储在某个数组中。要算出法线,必须使用两个向量的叉积,这些向量与面平行。从该法线可以使用平面方程确保光线的端点位于所有平面之外(结果>0)

好的,一些数学:

构成面ABCD的四个顶点(x、y、z)用于生成两个向量。 要得到这两个向量,只需简单的B-a和C-a(即B.x-a.x,B.y-a.y等)

我们有两个平行向量,A和B,为了清晰起见,我将它们称为

接下来的几段就是这样

您可以做的一件事是确定多维数据集与所讨论的线的距离,这可能会加快速度。从给定点(立方体的中心)查找直线上最近的点需要更多的数学知识

在你知道是否会有碰撞之前,你不需要进行所有的表面测试


快速碰撞检测技巧: 二维中两点之间的距离:sqrt(x^2+y^2)。基本的。 但是如果你只想知道两件事之间的相对距离,你可以跳过SQRT

如果((x1^2+y1^2)>(x2^2+y2^2)){ //x1,y1比x2,y2长。 }

平方根是昂贵的,避免平方根是一件好事,特别是在碰撞检测等内部循环中

嘿,我有个想法。建立一个平面,它是你的直线的延伸(比如说直线垂直,y永远不会改变…不管怎样)。取立方体所有点的点积。如果所有立方体都在一侧或另一侧(全部为正或全部为负),则立方体不会被平面“切割”,因此不能与直线相交

Dot产品很便宜

现在构建另一个平面,垂直于第一个平面,然后再次获取点积。如果立方体也被第二个平面切割。。。crud,在这种情况下,仍然有可能被切割两次而不在线

第一个也是唯一一个平面需要垂直于立方体中心与直线上最近点之间的直线(叉积时间)。如果该平面切割立方体(立方体顶点的正负点积),则立方体与直线相交。

您可能需要尝试。