检测并找到交叉射线与立方贝塞尔三角形

时间:2010-03-16 19:53:07

标签: math physics bezier raytracing

在编写模型编辑器时,除了启用光线追踪之外,我还可以考虑几个操作,我希望找到关于光线和三角形贝塞尔曲面片之间交点的非常好的近似值。

怎么做?我知道几种方式,但可能有更好的方法。

确切的用例:我可能想使用一个bezier三角形补丁作为参考表面,用鼠标绘制详细的形状。我可能也想从这样的补丁中找出分裂点。

如果有C源代码,我可能也希望看到它。也许甚至可以使用它而不是滚动我自己的代码。

2 个答案:

答案 0 :(得分:2)

我建议您实施Triangular Bezier Clipping(PDF)。

但是,另一种可能性是将三角形贴片转换为张量积Bezier贴片。这样做的好处是对张量积Beziers有更多的支持,所以你更有可能找到一些你可以使用的代码。转换很简单:

  • 将三角形贴片视为一系列n + 1行控制点(其中n为度数)
    • 第一行有1个控制点,每行的控制点比最后一个
    • 多1个
  • 现在,将每一行视为适当程度(0度到度数n)的贝塞尔曲线
  • 度数将每行提升到n度
    • 每行现在有n + 1个控制点,形成一个n + 1乘n + 1个控制点网格
  • 这个点的网格,作为n个贝塞尔曲面的度数n,与三角形的表面相同

为了找到交叉点,这应该可以正常工作。但是,你的张量积补丁是退化的(你的一端有重合点)所以当你接近退化角时,你可能会发现你引入了一些数值问题。此外,映射回三角形域可能会使纹理映射等事情变得更加棘手。所以我建议你使用更直接的Triangular Bezier剪辑,如果你不介意一点实现。

答案 1 :(得分:0)

我不熟悉三角形bezier贴片,但如果它总是包含在一个三角形内,那么,如果光线与三角形相交,它也必须与它内部的曲线相交。

如果上述情况属实,那么您可以搜索两侧与光线相交的顶点之间的曲线,以获得足够接近光线的点。我想你可以对这个区域的曲线参数进行二分搜索,以获得这一点。