1

有几种方法可以测试我的光线盒交叉点:

  1. 使用 ComputeIntersectionBox(...) 方法,它将射线和盒子作为参数,并计算射线和盒子最近的交点。该方法通过与盒子的每个面形成一个平面并找到与每个平面的交点来工作。一旦找到交点,通过检查交点是否在角点之间来检查该点是否在盒子的表面上。当我在两个不同的盒子上运行这个算法后查看光线时,我得到了正确的交点。

  2. 在具有两个球体、一个十二面体(三角形网格)和两个框的场景上使用 ComputeIntersectionScene(...) 方法而不使用矩阵变换。ComputeIntersectionScene(...) 递归遍历场景图的所有节点并计算与给定光线最近的交点。该测试尤其不应用父节点可能具有的任何也需要应用于其子节点的转换。通过这个测试,我还获得了正确的交叉点。

  3. 使用带有矩阵变换的 ComputeIntersectionScene(...) 方法。此测试与上述测试类似,只是在找到光线与场景中的节点之间的交点之前,使用节点变换矩阵的逆矩阵将射线转换为节点的坐标系,并且在计算交点后,此交点通过将变换矩阵应用于交点,将其变换回世界坐标。

当用第 3 种方法在 2 中描述的同一场景文件上进行测试时,用 4 条射线进行测试(因此,一条射线与一个球体相交,一条射线与另一个球体相交,一条射线与一个盒子相交,一条射线与另一个盒子相交),仅两个球体相交,两个盒子没有相交。当我调试查看我的 ComputeIntersectionBox(...) 方法时,它实际上告诉我射线与盒子上的每个平面相交,但每个交点并不位于盒子上。

这似乎是一种奇怪的行为,因为当使用没有转换的测试 2 时,我获得了正确的框相交(因此,我相信我的光线框相交是正确的),当使用带有转换的测试 3 时,我获得了正确的球体相交(因此,我相信我的转换光线应该没问题)。

有什么建议我可能会出错吗?

先感谢您。

4

1 回答 1

0

所以这个错误实际上是一个实现错误:当我转换光线时,我正在转换指向光线的指针,它也转换了其中的所有指针(因为函数是递归的)。我应该做的是制作我的射线的单独副本并在副本上执行转换,而不是原件。

于 2010-04-14T18:06:46.343 回答