检测和查找射线与三次贝塞尔曲面三角形的交点

3
在编写模型编辑器时,除了启用光线追踪,我还可以考虑一些操作,其中我想找到射线和三角形贝塞尔曲面之间交点的非常好的近似值。
如何做到这一点?我知道几种方法,但可能有更好的方法。
确切的用例:我可能想使用一个贝塞尔三角形块作为参考表面,用鼠标绘制详细的形状。我也可能想要从这样的块中确定分割点。
如果有C源代码,我可能也想看看。甚至可以使用它代替自己的代码。
2个回答

2
我建议您实现三角形贝塞尔剪辑(PDF)。
然而,另一种可能性是将您的三角形补丁转换为张量积贝塞尔补丁。这样做的优点是,对于张量积贝塞尔有更多的支持,因此您更有可能找到一些可用的代码。转换很简单:
- 将您的三角形补丁视为n+1行控制点的系列(其中n是阶数)
- 第一行有一个控制点,每行比上一行多一个控制点
- 现在,将每行视为适当阶数(0到n阶)的贝塞尔曲线 - 提升每一行的阶数到n
- 每行现在将有n+1个控制点,形成一个n+1乘n+1的控制点网格 - 这个点网格,作为一个n乘n阶的贝塞尔补丁,是与您的三角形相同的表面。
仅寻找交点的话,这应该完全可以工作。然而,您的张量积曲面是退化的(在一端有重合的点),因此当您接近该退化角时可能会遇到一些数值问题。此外,返回三角形域可能会使纹理映射等操作变得稍微棘手。因此,如果您不介意多花点实现成本的话,我建议您使用更直接的三角贝塞尔裁剪方法。

这是我通过搜索找到的一篇论文。它是在我没有ACM访问权限之后发现的,所以感谢您找到了直接链接。 - Cheery

0

我不熟悉三角形贝塞尔曲面,但如果它始终可以包含在三角形内,则如果射线与三角形相交,则必须在其中也相交曲线。

如果上述是真的,那么您可以在两个顶点之间搜索曲线,其边与射线相交,以找到足够接近射线的点。我猜您可以在该区域内对曲线参数进行二分搜索,以获取该点。


我可以在控制多边形中使用三角形,但它将无法完全包含贝塞尔曲面。通过特别检查边缘,这可能会起作用。 - Cheery

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接