场景遍历期间的Ray-Box交叉与矩阵变换

时间:2010-04-01 01:49:40

标签: raytracing

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

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

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

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

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

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

    我可能出错的任何建议?

    提前谢谢。

1 个答案:

答案 0 :(得分:0)

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