我试图为我的OpenCL实时光线跟踪器找到线段和二次贝塞尔曲线三角形之间的交点。
这个问题Detect&find intersection ray vs. cubic bezier triangle讨论了找到光线和立方贝塞尔三角形之间的碰撞点,主要的推荐是尝试细分或张量积bezier补丁。
我在几个地方读到,当测试一个线段对着二次贝塞尔三角形时,你最终必须求解二次方程,但我还没有找到任何关于那个的信息方程式实际上是,并开始怀疑它是否真实。到目前为止,我找到它的尝试也很短暂:P
除了使用细分或张量积bezier补丁之外,有没有人知道这是真的还是如何解决它?
这里是二次贝塞尔三角形的等式:
AS ^ 2 + 2 * D S T + 2 * E S U + B * T ^ 2 + 2 * F T U + C * U ^ 2
其中S,T,U是三角形的参数。您可以用(1-S-T)替换U,因为它们是重心坐标。
A,B,C是三角形的角,D,E,F是沿边缘的控制点。
超级难倒在这一个!
答案 0 :(得分:0)
线段具有参数方程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,数值方法和求解过程可能在数值上不稳定)。这就是有时推荐细分方法的原因。