大家好,
我正在编写一个非常不传统的光线追踪器,用于计算场景中各种物体的传热性质。在这个光线追踪器中,从原始物体的表面发射随机光线进入场景以检查交点。
这个特定的算法要求每个光线都在原始空间中进行开发,然后由源对象进行仿射变换到世界空间,然后再通过其他物体在场景中的原始空间中进行仿射变换,以检查是否存在交点。
一切都很好,直到我进行各向异性缩放,例如将对象按[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轴延伸的圆柱(单位半径和高度),以及一个在x-y平面上的环形,内径为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(cylinder)或M ^-1(cylinder)将光线r(os)正确地转换为世界空间r(ws)。
第二个问题是什么是将光线r(ws)从世界空间转换为对象空间以检查与其他对象相交的正确方法,使用M(annulus)和M ^-1(annulus)。
一些额外的背景信息:
此应用程序用于计算N个对象之间的辐射传热。该光线从对象上的随机点发射,其方向被随机选择以位于以该点处表面法线为定向的半球分布内。
以下是我的问题的一些可视化。当首次生成时,光线方向分布如下: