3

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

我正在构建一个使用仿射变换的简单光线追踪器。我的意思是我将相机坐标中的所有光线与通用形状相交。这些形状都具有相关的仿射变换,光线首先乘以这些变换的倒数,然后再与场景对象相交。

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

我在相机坐标中创建了一条射线。我将射线乘以球体变换矩阵的逆矩阵,并将其与通用球体相交(r=1 在 (0,0,0) 处)。我在交叉点处沿这条通用射线的距离,并使用它找到通用法线和沿原始射线的点,并将它们保存到一个变换对象中(连同距离(t)和实际变换)。

当需要计算这个交点的颜色时,我采用变换的逆转置并将其乘以通用法线以找到法线。如果我使用来自逆变换射线的交点的t值,则交点就是沿原始未变换射线的点。

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

老实说,我无法弄清楚我在这里做错了什么,但我正在扯掉我的头发。我想不出任何好的理由来发生这种情况。任何帮助将不胜感激。

4

2 回答 2

1

您已决定在对象坐标而不是世界坐标中进行交集。恕我直言,这是一个错误(除非您进行大量实例化)。但是,鉴于此,您应该计算对象空间中的交点以及对象空间中的法线。这些需要使用对象转换转换回世界坐标 - 而不是它的倒数。这就是物体如何到达世界空间,以及物体空间中的一切如何到达世界空间。我不确定如何转换 t 参数,所以我会先转换交点,直到你得到正确的结果。

于 2011-04-18T19:16:41.413 回答
1

免责声明:我不是光线追踪方面的专家,我也误解了问题描述中的转置。

当您计算交点处的法线时,您尤其处于“变换坐标空间”中,对吗?所以法线也将在那个坐标空间中。稍后您只需将该向量转置到真正的交点,但法线仍会旋转。

假设您有一个通用球体,正 x 为红色,负 x 为蓝色。假设相机位于 20,0,0 处,而您的 1 球体仅围绕 y 轴旋转 180 度(无转置)。然后射线 (1,0,0) 将是变换后的射线 -1,0,0 并将在 (-1,0,0) 和 t = 9 处从负 x 击中球体。法线应为 (-1 ,0,0)。当您将该法线转置到真正的交点时,法线仍将是 (-1,0,0)。因此,通过遵循该法线,您应该获得正确的颜色,以及来自球体“背面”的光。

于 2011-04-14T08:31:57.527 回答