如何射线追踪贝塞尔曲面?


18

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

因此,希望以代数方式解决Ray / Bezier曲面相交问题,从而使其有可能进行明确的编码并具有超快的超光滑度,这是一个总的梦想吗?

除此以外,执行此计算最快的方法是什么?您是否可以“找到摆动”来获得递归细分的严格界限(和目标)?如果必须使用数字寻根器(叹气),它需要什么属性,并且速度是最佳选择吗?

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


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

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

Answers:


14

首先,这是我想您正在考虑的Kajiya方法:Kajiya,射线追踪参数补丁,SIGGRAPH82。技术报告版本可能会提供更多信息。

我希望您从中得到的是,这不是不可能的,并且如果您不介意用一些代数几何和复数弄脏您的手,那么从概念上讲也不是困难。但是,直接进行此操作非常昂贵。

“真实的”光线示踪剂往往会做两件事的某种组合:

  • 在补丁上放置边界层次结构(例如AABB),以获取数字根查找器的良好“初始值”。如果做得好,可以避免“皱纹”问题。
  • 将补丁整理成DDG外壳,然后像多边形网格一样进行光线跟踪。

最后一点听起来像消除了“超级平滑”的要求,但它并不比使用射线微分时差。使曲面细分级别与射线的“大小”匹配可以很好地限制错误。此外,您可能仍然需要纹理坐标的差异,因此您也可以使用它来控制相交测试的准确性。

利用时间相干性不是一个坏主意,但确切地讲,如何做到这一点在很大程度上取决于场景图的表示形式。您可能需要查看射线相干性。向您喜欢的搜索引擎询问有关射线包跟踪射线重新排序的信息


9

希望以代数方式解决Ray / Bezier-surface相交是一个总的梦想

是的,这是白日梦。双三次Bezier面片是18度的代数曲面。要使光线与该曲面相交,您必须找到18度的多项式的根。这些根没有公式-您必须通过数值方法来找到它们。实际上,有数学结果(Abel-Ruffini定理)告诉我们,永远不会有超过4级的方程式根的公式。它说它们永远不会被发现,因为它们不存在。

如果您真的想对曲线形状进行分析(代数)射线跟踪,则可以尝试使用Steiner色块。它们的阶数为4,因此可以通过找到四次方(即阶数为4的多项式)来计算射线补丁相交。有一些公式可以找到四次方的根,但是它们很讨厌,很难编写可靠地实现公式的代码。


5

我几十年前使用的另一种选择(yikes!)是使用 1985年的Toth方案,方案采用区间算术来缩小搜索空间。IIRC最终将求助于Newton-Rhapson,但IIRC又一次,我认为它很少需要一个或两个以上的步骤来获得一个好的解决方案。

尽管我没有看过它(除了快速浏览),Mitchell还发表了一些有关间隔数学的光线跟踪的最新工作。

(我应该补充一点,如果只在做Bezier曲面,则interval方法可能有点“过大杀伤力”,因为您可以使用开花之类的技巧来获得边界和导数。但是,如果将Bezier曲线与其他函数结合在一起,例如绕轴旋转,则其通用性会更大。)


1

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

,...显示了许多样条子集的许多解决方案,它们可以将距离返回到2d样条曲线,也可以跟踪3d面片。花键和面片有多种形式。天堂最简单,贝塞尔很简单,小节过于复杂。您对样条线的约束越多,获得的越简单。NURBS是扩展过大;-与更对称的样条曲线相比,其权重的非均匀性(“ NU”)降低了效率-其合理性(R)也增加了一些复杂性,难以进行分段(定量)和与附近分段的混合(递归解决)。

bezier-patch-tracing是根求解,随之而来的是对精度的上下文优先级确定;以什么顺序求解二次方程。由于指数复杂性和精度损失,对于指数高于立方的指数,这变得不切实际。

ray-marching == sphere-tracking是用于根求解的较简单的启发式方法,它似乎是渲染大多数样条线补丁的简单且最有效的解决方案。

Lagrange表示简化了跟踪/行进(因为L点在样条线上,而ControlVector点(完全相同的样条)很少在样条上)

天堂样条的特殊情况,其中stat和end的一阶导数== 0。简化了连续性,并减少了差异(减少了相减)。可以通过一次有效地跟踪Heavensine-patch:https://www.shadertoy.com/view/4djfW3, 而其他三次(或更高)样条曲线 使启发式球体跟踪/射线行进方法更有效(并且“足够精确”),而不是敢于分析地计算所有根,以保持最小的正根(每个根以指数形式累积精度误差)。


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


没关系。所有3d补丁解决方案都是通过球面跟踪完成的。
ollj

当补丁更简单时,它只会显着提高性能和精度。到一小段重复的seamess heavensines使您走得很远的地方:
ollj

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.