【发布时间】: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