【问题标题】:Detect&find intersection ray vs. cubic bezier triangle检测和查找相交射线与三次贝塞尔三角形
【发布时间】:2011-01-28 07:03:59
【问题描述】:

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

如何做到这一点?我知道几种方法,但可能有更好的方法。

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

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

【问题讨论】:

    标签: math physics bezier raytracing


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 这是我通过搜索找到的一篇论文。那是在 ACM 之后,我没有访问权限,所以感谢您找到它的直接链接。
    【解决方案2】:

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

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

    【讨论】:

    • 我可以在控制多边形中使用三角形,但它不能完全包含贝塞尔补丁。通过专门检查边缘,这可以工作。
    猜你喜欢
    • 2014-05-03
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    相关资源
    最近更新 更多