我在math.SE上尝试了这个问题,令人惊讶的是,答案是“方程式太讨厌了,只需将函数提供给数值根查找器即可”。但是,如果您认为自己是像我这样的“图形专家”,并且在设计工作中广泛使用Bezier曲线,我就相信可以做得更好。 Kajiya有一个发布的算法,我没有背景知识(Sylvester矩阵),但是有关数学的建议是SE的结果是t中的18阶多项式,您仍然需要解决数值上。我有另一个结果相似的想法。 -smoothness?

除非如此,执行此计算的最快方法是什么?您能否“发现摆动”来为递归细分提供一个紧密的界限(和目标)?如果必须使用数字寻根仪(叹气),它需要什么属性,并且速度是最佳选择?

我最初的想法是准备类似Laplace的特定表面如我对三角形的其他数学问题的答案所述。但是我也会对通用方法感兴趣。我只是在考虑一组固定的形状,例如犹他州的茶壶。但是我对优化动画帧之间的时间连贯性的方式非常感兴趣。

评论

您是在寻找可应用于任意Bezier曲面的通用方法,还是为特定曲面准备快速方法的方法?运行前是否可以固定您的表面形状?

请注意,与对光线进行射线追踪相比,您可以对贝塞尔曲线表面进行射线处理容易得多。您还可以比其他种类的射线追踪或raymarch单变量曲面容易得多! blog.demofox.org/2015/07/28/rectangular-bezier-patches

#1 楼

首先,这是我想您正在考虑的Kajiya方法:Kajiya,射线追踪参数补丁程序,SIGGRAPH82。该技术报告版本可能会提供更多信息。如果您不介意用一些代数几何和复数弄脏您的手,那不是没有可能,并且从概念上来说也不难。但是,直接执行此操作非常昂贵。 ),以获取数字根查找器的良好“初始值”。如果做得好,就可以避免出现“皱纹”问题。超级平滑”的要求,但它并不比使用射线微分时差。使镶嵌水平与射线的“大小”匹配可以很好地限制错误。此外,您可能仍然需要纹理坐标的微分,因此也可以使用它来控制相交测试的准确性。这样做很大程度上取决于您的场景图形表示。您可能需要查看射线相干性。向您最喜欢的搜索引擎询问有关射线包跟踪和射线重新排序的信息。

#2 楼


希望以代数方式解决Ray / Bezier曲面的相交是一个总的梦想,是一个梦想。双三次Bezier面片是18度的代数曲面。要使射线与该曲面相交,您必须找到18度多项式的根。这些根没有公式,必须通过数值方法来找到。实际上,有数学结果(Abel-Ruffini定理)告诉我们,永远不会有超过4级的方程式根的公式。它表示永远不会找到它们,因为它们不存在。它们的阶数为4,因此可以通过找到四次方的根(即阶数为4的多项式)来计算射线补丁相交。有一些公式可以找到四次方的根,但它们很讨厌,很难编写可靠地实现公式的代码。

评论


$ \ begingroup $
我想指出的是,永远不可能存在大于4的多项式方程的根的公式。关于具有双三次Bezier斑块的线的代数,Abel-Ruffini定理最多是对此的部分解释。
$ \ endgroup $
–user9485
20年7月19日在14:30

#3 楼

我几十年前使用的另一种选择(yikes!)是使用1985年的Toth方案,该方案采用间隔算法来缩小搜索空间。 IIRC最终将求助于Newton-Rhapson,但IIRC再一次,我认为它很少需要一个或两个以上的步骤就可以找到一个好的解决方案。好吧,除了快速浏览之外)Mitchell发表了一些有关间隔数学的光线跟踪的最新工作。有点“过度杀伤”,因为您可以使用诸如开花之类的技巧来获得边界和导数。但是,如果将Bezier曲线与其他功能(例如绕轴旋转)结合使用,则其通用性会更大。)

#4 楼

https://www.shadertoy.com/results?query=bezier
如果存在兼容性问题,请按年龄排序:

,...显示了许多样条子集的许多解决方案,将距离返回到2d样条曲线,或跟踪3d面片。花键和修补程序有多种形式。天堂最简单,贝塞尔很简单,小节过于复杂。您对样条线的约束越多,获得的越简单。 NURBS是过度推广;
-与更对称的样条相比,权重的非均匀性(“ NU”)降低了效率
-合理性(R)也增加了一些复杂度(定量)并与附近的段混合(以递归方式解决)。以什么顺序求解二次方程。
由于指数复杂度和精度损失,在高于三次方的指数上变得不切实际。求解根问题的方法,这似乎是渲染大多数样条曲线补丁的最简单,最有效的解决方案。

Lagrange表示法简化了跟踪/行进(因为L点位于样条曲线上,而ControlVector点(完全相同的样条曲线)很少出现在样条曲线上。简化了连续性,并减少了差异(减少了相减)。
可以通过一次有效地跟踪天堂弦补丁:其他三次(或更高)样条曲线使启发式球面跟踪/射线行进方法比敢于分析计算所有根以保持最小的正根更有效(并且“足够精确”)(每个根的精度误差呈指数累积) )。


在计算机图形学中,样条曲线和面片已在2006年几乎完全被z刷替换。z刷使用具有均质坐标的位移贴图,甚至使用“类型”将球体和线段合并(线段半径0,球体的长度为0,并集既简单又有用)。对于较小的精度损失,却可以以相对较低的查找表内存成本在性能上大幅度提高性能,这很容易在gpu上动态化。

评论


$ \ begingroup $
没关系。所有3d补丁解决方案都是通过球面跟踪完成的。
$ \ endgroup $
– ollj
17年8月24日在15:53

$ \ begingroup $
如果补丁更简单,它将大大提高性能和精度。在某些迭代中,一系列的seamess heavensines使您走得很远:
$ \ endgroup $
– ollj
17年8月24日在15:56

$ \ begingroup $
shadertoy.com/view/MtsXzl
$ \ endgroup $
– ollj
17年8月24日在15:56

#5 楼

https://www.shadertoy.com/view/MldczM
射线与三角形b样条的解析交点,3个二次贝塞尔曲线,每个样条3个CV,2个样条共享3个角CV。所有简历高度均与三角形平面正交。它可以解决重心坐标中<= 2个根。永远不会有3个交点,因此这是曲线函数的惊人简单跟踪。
一阶导数也非常短。
用于相机移动的ESDF键
注释中的父着色器具有优化程度较低,精度较低,重复性更高,天真的更简单的代码。
如果相机位于三角形的棱镜内(在三角形的上方或下方),它仍然存在渲染负表面的错误。这似乎是一个更简单的特例,只有一个根,而无法忽略另一个根。解决这个问题的分支可能非常简单。

评论


$ \ begingroup $
欢迎来到CGSE。请在您的答案中添加链接源的相关代码段。如果链接过期,您的答案将不再有用。
$ \ endgroup $
–wychmaster♦
20年7月18日在12:21

$ \ begingroup $
有趣,但老实说,它距三角形仅一步之遥,而且IIRC(但不幸的是不在办公室,我无法查看我的Farin的“ CAGD曲线和曲面”副本)获得C1(或G1?)的连续性,我相信您需要一个四次贝塞尔曲线三角形,即15个控制点
$ \ endgroup $
–西蒙F
20年7月21日在16:59