【问题标题】:Is there any fast ray→surface intersection algorithm?有没有快速射线→表面相交算法?
【发布时间】:2015-06-02 17:59:50
【问题描述】:

三角形是具有非常简单的ray→triangle 相交算法的曲面,只需几个操作即可完成。由于这个原因,它们经常被用作光线追踪应用程序的基元——例如,网格由一组三角形近似。问题是,近似值越详细,您需要的三角形越多,这意味着更多的测试。如果您的对象是一个完美的球体,那么使用三角形可能不是一个好主意,因为有一个 O(1) 算法可以直接测试 ray→sphere 的交点,只需很少的操作。

我的问题是:与三角化方法相比,还有哪些表面具有“具有更快的ray→surface”相交的特性?是否有任何数学结构/对象可以让我们逼近任意 3D 对象的表面并在 O(1) 中检查其交集?

【问题讨论】:

  • 你可以用样条补丁或其他东西平铺你的表面。找到一条射线与样条曲线的交点需要一定的时间,但这不是小菜一碟。
  • 我认为椭圆体或 3D 盒子更容易,但没有那么精确,您需要使用最适合您的网格形状的最简单的对象 可以使用任何可以用数学公式表示的几何形状...不知道形状(任意网格)就这么难。物体表面拟合是一个非常缓慢的过程,但它可以预先计算一次,因此不会减慢运行时间......
  • 具有简单方程的连续光滑表面。例如椭圆体(和球体)和平面,以及圆柱面。不是像长方体这样的角形(它们是 O(面数))
  • @willywonka_dailyblah 是正确的,具有简单方程的连续光滑表面,例如圆锥截面。我将添加轴对齐的边界框:AABB 有快速的相交算法,在运行时间方面可能会更好,可以在由三角形组成的任意长方体上测试相交(大概每个面有 12 个,每个面 2 个)。

标签: algorithm math 3d language-agnostic raytracing


【解决方案1】:

你对自己的身材有什么了解? - 纯封闭形式:有些有封闭的解决方案。 - 如果它只是一个三角形汤,你需要一些数据结构来加速:例如网格、八叉树、边界框层次结构、BSP... - 如果你能表达一个势函数或距离函数 - 甚至是近似的 - 例如隐式曲面,你可以使用二分法得到交集(迭代速度非常快)。

(或者您可以加入 SparseVoxels 社区,但这是另一回事 ;-))。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-11
    • 2012-02-14
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    • 2019-06-25
    相关资源
    最近更新 更多