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

时间:2010-12-30 15:33:06

标签: 3d collision-detection

我需要将光线从地面投射到太阳,并想要找到物体是否在阴影中。我计划通过跟踪从地面立方体到太阳的线并查找是否有任何物体挡路来做到这一点。但是我不熟悉数学找到线相交的所有立方体,所以我可以测试它们是否被填充。任何人都可以对此有所了解吗?

2 个答案:

答案 0 :(得分:1)

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

阿。谷歌搜索“线立方体碰撞”出现了不少命中。这个看起来很有希望。

http://www.devmaster.net/forums/archive/index.php/t-371.html

  

基本上,它是这样的(我一定会犯错):

     

取出构成立方角的8个顶点。我们将在四边形中进行工作。

     

第一个任务是计算出所有6个面法线,并将它们存储在某个数组中。要计算出正常情况,你必须使用两个矢量parralel到脸部的叉积。根据该法线,您可以使用平面方程确保光线的终点在所有平面之外(结果> 0)。

     

好的,有些数学:

     

构成面ABCD的四个顶点(x,y,z)用于制作两个向量。   为了获得这两个向量,这是一个简单的B-A和C-A问题(这意味着B.x - A.x,B.y - A.y等...)

     

我们有两个平行向量,A和B我会称之为清晰   ...

它继续用了几段。

你可以做的一件事可能会加快一些事情的速度,即确定立方体与相关线的接近程度。更多数学,以找到给定点(立方体中心)的直线上的最近点。

http://www.gamedev.net/community/forums/topic.asp?topic_id=185204

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


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

if((x1 ^ 2 + y1 ^ 2)>(x2 ^ 2 + y2 ^ 2)){     // x1,y1长于x2,y2。   }

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

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

Dot产品很便宜。

现在建立另一个垂直于第一个平面的平面,再次获得你的点数产品。如果您的立方体也被第二个平面切割......那么在这种情况下仍然可以切割两次而不是在线上。

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

答案 1 :(得分:0)

您想要执行(或在这种情况下,很多)光线框交叉点。这里有一个示例算法: http://www.siggraph.org/education/materials/HyperGraph/raytrace/rtinter3.htm

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