4

全部,

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

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

一切都很好,直到我做了一个各向异性比例,例如按 [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变换的方向

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

4

2 回答 2

3

逆转置变换矩阵保持旋转分量不变,但反转缩放。这意味着缩放仍然存在。这对于法线是正确的:考虑在 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(我多么希望如此使用 Mathjax ...)。只要您重新规范化向量,这似乎是正确的。


编辑:

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

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

于 2011-04-29T03:46:18.670 回答
1

这只是前几天在这个问题中出现的

其中一个答案链接到 Ray Tracing News 文章,该文章讨论了对法线使用逆变换的转置。

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

要回答有关进行转换的正确方法的问题,请点击此链接到光线追踪新闻

于 2011-04-29T14:47:41.747 回答