【问题标题】:3D Affine transformation problem in raytracing光线追踪中的 3D 仿射变换问题
【发布时间】:2011-08-15 03:48:18
【问题描述】:

全部,

我正在编写一个非常非传统的光线追踪器来计算场景中各种物体的传热特性。在这个光线追踪器中,随机光线从我的原始对象的表面射入场景以检查交叉点。

这种特殊的算法要求每条光线在原始空间中发展,然后由源对象仿射变换到世界空间,然后仿射变换回场景中其他对象的原始空间以检查相交。

在我进行各向异性缩放之前一切都很好,例如按 [2 2 1] 缩放对象(各向异性缩放很好)。这让我相信我没有正确地转换光线的方向分量。目前,我通过将方向分量乘以源对象逆变换矩阵的转置将光线方向从原始空间转换到世界空间,然后通过乘以目标对象变换的转置,将光线从世界空间转换到每个原始空间矩阵。

我还尝试乘以源图元的变换矩阵以从图元到世界空间,并乘以目标逆变换以从世界空间到图元空间,但没有成功。

我相信从原始物体表面(在随机点和随机方向)发射的光线应该以与“常规”光线追踪中的表面法线相同的方式进行转换,但我不确定。

那里的任何专家都知道我的方法中的缺陷是什么?如果需要更多信息,请随时询问。


这个光线追踪器的基本算法如下:

For each object, i, in scene
{
    for each ray, r, in number of rays per object
    {
        determine random ray from primitive i
        convert ray from primitive space of i to world space

        for each object, j, in scene
        {
            convert ray to primitive space of object j
            check for intersection with object j
        }
    }
}

希望能澄清这个问题,让我们看一个例子。假设我有一个沿 z 轴(单位半径和高度)延伸的圆柱体和一个位于 xy 平面内的环形空间,内径为 7,外径为 8。我希望在 x 和 y 中将圆柱体缩放 6 倍方向(但不是 z 方向)所以我的仿射变换矩阵如下:

M(cylinder) = |2 0 0 0|        M^-1(cylinder) = | .5 0. 0. 0. |
              |0 2 0 0|                         | 0. .5 0. 0. |
              |0 0 1 0|                         | 0. 0. 1. 0. |
              |0 0 0 1|                         | 0. 0. 0. 1. |

M(annulus) =  |1 0 0 0|        M^-1(annulus) =  |1 0 0 0|
              |0 1 0 0|                         |0 1 0 0|
              |0 0 1 0|                         |0 0 1 0|
              |0 0 0 1|                         |0 0 0 1|

现在假设我有一条射线,它在圆柱体 s 的表面上具有随机起点,并且在远离圆柱体 c 表面的方向上具有随机方向,从而得到射线 r(os) = s + ct。

我想将此射线从原始(对象)空间转换到世界空间,然后测试与场景中其他对象(环)的相交。

第一个问题是使用 M(圆柱体)或 M^-1(圆柱体)将射线 r(os) 转换到世界空间 r(ws) 的正确方法是什么。

第二个问题是使用 M(annulus) 和 M^-1(annulus) 将光线 r(ws) 从世界空间转换到对象空间以检查与其他对象相交的正确方法是什么.


一些额外的背景信息:

此应用程序用于计算 N 个对象之间的辐射传热。光线从物体上的一个随机点发射,其方向被随机选择在一个半球形分布内,该半球形分布以随机点的表面法线为取向。


这是我的问题的一些可视化。首次生成时的光线方向分布:

如果我使用变换矩阵 M 将变换应用于世界坐标:

如果我使用逆变换矩阵 M^-1 将变换应用于世界坐标

【问题讨论】:

  • 这句话很难理解:“现在这个特定的算法要求光线在原始空间中确定,然后由源对象仿射变换到世界空间,然后仿射变换回另一个原始空间场景中的对象以检查交叉点。”另外,您能否解释一下为什么您在第二段中所做的事情。这里需要更多的解释和数学来帮助你。
  • 我认为如果您将有关算法的陈述编码成数学公式或代码可能会有所帮助,只是为了清楚乘法的顺序等。
  • 另外,请稍等。我看不出这与 C++ 有什么直接关系。这听起来就像一道数学题。
  • 你的变换矩阵是从原始空间到世界空间的线性变换,反之亦然?我不明白为什么你需要变换矩阵的转置,除非你的变换矩阵是正交的。否则对于给定向量 x 的线性变换矩阵 A,A(INV)*A*x=x。您必须引入某种类型的非线性变换才能打破这种关系。例如,您是否还处理变换矩阵中的平移,如果是,您是否使用齐次坐标系?
  • 克里斯是正确的,它与 C++ 没有任何关系我已经删除了标签。最初我打算通过代码来处理它(它是用 C++ 编写的),但我决定不需要。

标签: math raytracing matrix-multiplication montecarlo affinetransform


【解决方案1】:

逆转置变换矩阵保持旋转分量不变,但反转缩放。这意味着缩放仍然存在。这对于法线是正确的:考虑在 2d 中从 (0,0)(.707,.707) 的线段。法线是 (-.707,.707)。如果我们按 (s,1) 缩放,我们会得到一个从 (0,0)(s*.707,.707) 的段>。在极限情况下,随着 s 变大,我们基本上有一条平行于 x 轴的平线。这意味着法线应该指向 y 轴。所以我们得到一个 (-.707/s,.707) 的法线。然而,从这个例子中应该清楚的是,变换后的向量不再是单位长度。也许您需要规范化方向分量?

如果我们首先使用转换矩阵可以表示为夹在两个旋转之间的缩放(a la SVD)的属性,我们会得到您的出站转换矩阵如下所示:R2out*Sout^-1* R1out 然后您的入站转换矩阵如下所示: R1in^-1*Sin*R2in^-1 (我多么希望 SO 使用 Mathjax...)。这似乎是正确的,只要你重新规范化你的向量。


编辑:

考虑到这一点,我决定反转置可能对正常情况有效。考虑上面的例子。如果s=2,那么线段的斜率,原来是1,变成1/2。同样,法线的斜率从 -1 变为 -2。线段和射线之间仍然存在 90 度角。到目前为止,一切都很好。现在......如果所考虑的向量实际上平行于线段怎么办。我们得到 2 的斜率,不再平行。

所以,我想我现在有两个问题。您的程序实际上出了什么问题/是什么让您认为它不正确? 正确的行为是什么?也许你可以制作一个二维图。

【讨论】:

  • 我不确定我是否遵循您的出站和入站转换术语。我已经研究过规范化方向向量。我说过的信息是,如果你比你的交叉时间 (t) 标准化,那将是错误的。
  • 我同意 JCooper 的观点,可能在某处引入了非线性。如果您要附加多个转换,则顺序很重要(即我认为我说您可能想要先缩放,然后旋转然后转换为位置是正确的)。如果您愿意,可以使用我的光线追踪代码作为参考,您可以创建圆柱体、变换并检查光线交叉点,只需在 python shell 中编写几行代码github.com/danieljfarrell/pvtrace 如果您需要指导,请告诉我。
  • 在我运行的情况下,我要么只是缩放,要么缩放和转换(按该顺序),因此顺序不应该成为问题。我不确定在哪里引入非线性。
  • JCooper 这里有更多背景信息。我的代码实际上计算了一个称为视图因子的东西,它是一个表面可以看到另一个表面的多少。从表面 i 到表面 j 的视角因子 Fij 计算为离开 i 的射到 j 的光线数量/离开 i 的光线总数。现在我正在测试这个link 场景。当不使用缩放(或各向同性)时,我得到正确的结果,但如果我按 [2 2 1] 缩放,我得到不正确的结果。按 M 变换得到的结果较低,按 M^-1 变换得到更高的结果。
  • @TDawg 所以你做一个蒙特卡罗模拟来近似视角因子?这意味着光线需要在缩放后从圆柱表面随机采样,以避免使样本不均匀,对吧?
【解决方案2】:

这只是前几天在This question中出现的

其中一个答案链接指向一篇光线追踪新闻文章,该文章讨论了对法线使用逆变换的转置。

我必须同意 JCooper 提出的“究竟出了什么问题?”。我的第一个想法是你似乎在模拟辐射热传递,你必须小心物体的不均匀缩放。如果在发射的物体表面上具有均匀分布的“光子”,然后对该物体应用非均匀缩放,则离开表面的光子分布将不均匀。这是一个可能的陷阱,但由于您没有指出出了什么问题,因此很难说这是否是您的问题。

要回答有关正确转换方法的问题,请关注This link to Ray Tracing News

【讨论】:

  • phkahler,你说得非常正确我正在模拟辐射传热,我的问题是我的“光子”均匀分布在各向异性缩放后变得不均匀。所以本质上我需要知道如何从对象空间转换到世界空间,从世界空间转换到对象空间以保持均匀分布。
  • 如果你将均匀分布的点放在立方体的表面上,然后将其垂直拉伸 2 倍,顶部和底部的点不会改变密度,而侧面的密度只有一半。同样的问题也存在于球体上。我确定有解决方案,但我认为这不是转换本身的问题。
猜你喜欢
  • 2013-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-23
  • 1970-01-01
  • 2019-12-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多