用我的光线追踪器帮我解决这个错误

时间:2011-04-13 09:46:54

标签: graphics geometry raytracing matrix-multiplication

我不打算发布这个问题的任何代码,因为它需要太多的上下文,但我会在概念上解释我在做什么。

我正在构建一个使用仿射变换的简单光线跟踪器。我的意思是我将来自相机坐标的所有光线与通用形状相交。这些形状都具有相关的仿射变换,并且在与场景对象相交之前,光线首先乘以这些变换的反转。

例如,假设我想要一个半径为3的球体位于(10,10,10)。我创建了球体并给它一个表示这种变换的变换矩阵。

我在相机坐标中创建一条光线。我将光线乘以球体变换矩阵的倒数,并将其与通用球体相交(r = 1 at(0,0,0))。我沿着这条普通光线在交叉点处获取距离并使用它我找到一般法线和沿着原始光线的点并将它们保存到一个Transformation对象中(以及距离(t)和实际转型。)

当弄清楚这个交叉点的颜色时,我采用变换的逆转置并将其乘以通用法线来找到法线。如果我使用逆变换光线的交点中的 t 值,则交点只是沿着原始非变换光线的点。

问题是,当我以这种方式做事时,转换会产生奇怪的效果。主要效果是转换似乎将场景中的灯光与它们一起拖动。如果我构建一堆图像并对每个帧应用稍大一点的旋转到球体,它似乎用它来拖动场景中的灯光。这是一个例子

老实说,我无法弄清楚我在这里做错了什么,但我正在撕裂我的头发。我想不出有什么好的理由可以发生这种情况。任何帮助都将非常感激。

2 个答案:

答案 0 :(得分:1)

免责声明:我不是光线追踪的专家,我也错过了在问题描述中理解转置的转置。

当您计算交点处的法线时,您处于“变换坐标空间”中,特别是对吗?因此,法线也将在该坐标空间中。稍后您只会将该矢量转置到实际交点,但法线仍然会旋转。

假设您有一个通用球体,正x为红色,负x为蓝色。让我们考虑相机在20,0,0,你的1球在y轴周围只有180度(没有转置)。然后光线(1,0,0)将是变换光线-1,0,0并将从负x处(-1,0,0)和t = 9处击中球体。法线应为(-1 ,0,0)。当您将法线转换为实际交点时,法线仍然是(-1,0,0)。因此,通过遵循该法线,您应该获得正确的颜色,但也可以获得球体“背面”的光线。

答案 1 :(得分:1)

您决定在对象坐标而不是世界坐标中进行交叉。恕我直言,这是一个错误(除非你做了很多实例)。但是,考虑到这一点,您应该计算对象空间中的交点以及对象空间中的法线。这些需要使用对象转换转换回世界坐标 - 而不是它的反转。这就是对象进入世界空间的方式,以及对象空间中的所有内容如何进入世界空间。我不确定如何变换t参数,所以我最初会改变交点,直到你得到正确的结果。