3

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

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

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

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

4

2 回答 2

2

我建议您实施三角贝塞尔剪裁(PDF)。

但是,另一种可能性是将您的三角形补丁转换为张量积贝塞尔补丁。这样做的好处是对张量积 Beziers 的支持更多,因此您更有可能找到一些可以使用的代码。转换很简单:

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

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

于 2010-03-16T23:21:15.310 回答
0

我不熟悉三角形贝塞尔补丁,但如果它总是可以包含在三角形内,那么如果光线与三角形相交,它也必须与其中的曲线相交。

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

于 2010-03-16T22:13:39.310 回答