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

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

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

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

有帮助吗?

解决方案

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

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

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

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

其他提示

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top