首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >射线跟踪中的三维仿射变换问题

射线跟踪中的三维仿射变换问题
EN

Stack Overflow用户
提问于 2011-04-29 00:31:14
回答 2查看 2.2K关注 0票数 4

全,

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

该算法要求每条光线在原语空间中展开,然后仿射被源物体转换成世界空间,然后仿射变换回场景中其他物体的原始空间,以检查是否相交。

在我做各向异性标度之前,一切都是好的,例如,用2 2 1缩放对象。这使我相信,我没有正确地转换光线的方向分量。目前,我将光线方向从原语空间转化为世界空间,将方向分量乘以源物体的转置变换矩阵,再将光线从世界空间转化为每个原语空间,再乘以目标变换矩阵的转置。

我也曾尝试过用源原语的变换矩阵乘从原语到世界空间,再乘以目的地逆变换,从世界空间到原语空间,但都没有成功。

我认为从原始物体表面发射的射线(在一个随机点和一个随机方向上)应该以“规则”射线追踪中的正常曲面的方式转换,但我不确定。

有专家知道我的方法有什么缺陷吗?如果需要更多的信息,请随意询问。

这种射线追踪器的基本算法如下:

代码语言:javascript
复制
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轴(单位半径和高度)延伸,圆环位于内径7和外径8的x平面上。我希望在x和y方向(但不是z方向)用6因子对圆柱进行缩放,所以我的仿射变换矩阵如下:

代码语言:javascript
复制
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|

现在假设我有一条射线,它在圆柱体的表面上有一个随机的起始点,并且从圆柱体c的表面上有一个随机的方向,给出射线r(os) =s+ ct。

我想把这条光线从原始(物体)空间转换到世界空间,然后测试与场景中的其他物体(环)的交集。

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

第二个问题是,怎样才能正确地将光线r(ws)从世界空间转换到物体空间,用M(环)和M^-1(环)检查与其他物体的交集。

一些补充背景资料:

此应用程序用于计算N个物体之间的辐射传热。射线是从物体上的一个随机点发射的,它的方向被随机选择,分布在一个半球形分布中,其表面在随机点处呈法线。

以下是我的问题的一些设想。第一次生成射线方向分布时:

如果我使用转换矩阵M将转换应用于世界协调:

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-29 14:47:41

这件事是前几天在这个问题发生的

其中一个答案链接到射线追踪新闻的一篇文章,文章讨论了反变换在法线上的使用。

我不得不同意JCooper的说法:“到底出了什么问题?”我的第一个想法是,你似乎是在模拟辐射传热,你必须小心,不均匀地缩放物体。如果你在被发射的物体表面有一个均匀的“光子”分布,然后你对这个物体进行不均匀的缩放,那么你就会得到离开这个表面的光子的不均匀分布。这是一个可能的陷阱,但由于你没有指出出了什么问题,所以很难说这是否是你的问题。

要回答有关进行转换的正确方法的问题,请遵循这链接到射线追踪新闻

票数 1
EN

Stack Overflow用户

发布于 2011-04-29 03:46:18

逆转置变换矩阵保持旋转分量不变,但反转标度。这意味着缩放仍然存在。这对于法线是正确的:在2d,考虑从(0,0)(.707,.707)的线段。正常值为(-.707,.707)。如果我们用(s,1)进行标度,我们得到一个从(0,0)(s*.707,.707)的段。在这个极限中,随着变大,我们基本上有一条与x轴平行的平行线。这意味着法线应该沿着y轴点。因此,我们得到了(-.707/s,.707)的一个正规。但是,从这个例子应该可以清楚地看到,转换后的向量不再是单位长度。也许您需要规范化方向组件?

如果我们首先使用一个转换矩阵可以表示为两个旋转之间的缩放( la SVD)的属性,那么您的出站转换矩阵看起来是这样的:R2out*Sout^-1*R1out,然后您的入站转换矩阵看起来是:R1in^-1*Sin*R2in^-1 (我希望这样使用Mathjax.)。这似乎是正确的事情,只要你重新规范你的向量。

编辑:

一夜之间,我想到这一点,我决定反转置的东西可能只适用于法线情况。考虑上面的例子。如果s=2,则线段的斜率(最初为1 )将变为1/2。同样,正常的斜率从-1变为-2.线段和光线之间还有一个90度的角度。到目前一切尚好。现在..。如果所考虑的向量实际上是平行于线段的话。我们得到了2的斜率,不再平行。

所以,我想我现在有两个问题。你的程序到底出了什么问题/是什么让你认为它不正确?正确的行为是什么?也许你可以做一个二维的情节。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5826606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档