【问题标题】:Intersect Line vs Quadratic Bezier Triangle相交线与二次贝塞尔三角形
【发布时间】:2014-05-03 21:17:17
【问题描述】:

我正在尝试为我的 OpenCL 实时光线追踪器找到线段和二次贝塞尔三角形之间的交点。

这个问题Detect&find intersection ray vs. cubic bezier triangle 讨论了寻找射线和三次贝塞尔三角形之间的碰撞点,主要建议是尝试细分或张量积贝塞尔补丁。

我在一些地方读到过,在针对二次贝塞尔三角形测试线段时,您最终只需要求解二次方程,但我没有找到任何关于该方程实际是什么的信息,并且我开始怀疑这是不是真的。到目前为止,我试图找到它的尝试也失败了:P

除了使用细分或张量积贝塞尔补丁之外,有谁知道这是否属实或如何解决?

这是二次贝塞尔三角形的方程:

AS^2 + 2*DST + 2*ESU + B*T^2 + 2*FT U + C*U^2

其中 S,T,U 是三角形的参数。您可以将 U 替换为 (1-S-T),因为它们是重心坐标。

A,B,C 是三角形的角,D,E,F 是沿边的控制点。

超级难倒这个!

【问题讨论】:

  • 因为这涉及找到一个公式,而不是相同的 C++ 算法,最好在math.stackexchange.com 上询问?

标签: c++ math raytracing bezier


【解决方案1】:

当您的贝塞尔面片有 3 条以上的边时,光线交点不再是解析的(即使边上的样条线只是二次曲线),并且足够精确的迭代方法会明显变慢。由于固有的递归,Bezier 补丁在性能方面是可悲的,您可能希望对傅立叶补丁进行 FFT。 Shadertoy.com [iq] 有各种“扭曲的立方体相交”(不通过 sphere-tracking==raymarching 进行迭代,这是有效的,但也会导致许多低精度情况下的伪影,其中迭代的收敛太慢)。

是的,三角形-贝塞尔补丁交点只有解析二次复杂度(边界上有二次贝塞尔曲线),但它涉及一些预计算(除非它已经在重心坐标中),这会显着降低结果精度(重心加 1全局划分,并总结所有领域)

2019 年在 opengl 中的 shadertoy 上解决了这个问题(很糟糕,因为它有 1 个错误情况和太低的精度): https://www.shadertoy.com/view/XsjSDt 我稍微优化了它(修复了精度问题,添加了相机和剔除): https://www.shadertoy.com/view/ttjSzw + https://www.shadertoy.com/view/wlSyzd 还看到, https://www.reddit.com/r/askmath/comments/sfn8mk/analytic_intersection_ray/

【讨论】:

    【解决方案2】:

    线段有参数方程P = P0+(P1-P0)*v=P0+d*v,其中v是参数[0..1] 要找到与蛮力的交点,您必须求解三个二次方程组,例如

    x0+dx*v=AxS^2 + 2*Dx*S*T + 2*Ex*S*U + Bx*T^2 + 2*Fx*T*U + Cx*U^2
    

    这个系统有 8 种可能的解,只有当结果 v,s,t 同时位于 0..1 范围内时,交集才存在。解决这个系统并不容易(可能的方法 - Gröbner basis,数值方法和求解过程可能在数值上不稳定)。这就是为什么有时推荐使用细分方法的原因。

    【讨论】:

    • 哦,真不幸。我的印象是,既然它是二次的,它会更直接。我会更多地研究你提到的方法。非常感谢您提供的信息。
    猜你喜欢
    • 2011-01-28
    • 2015-10-03
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 2016-10-05
    • 2012-01-19
    • 2012-07-27
    • 1970-01-01
    相关资源
    最近更新 更多