我不会为这个问题发布任何代码,因为它需要太多的上下文,但我会从概念上解释我在做什么。
我正在构建一个使用仿射变换的简单光线追踪器。我的意思是我将相机坐标中的所有光线与通用形状相交。这些形状都具有相关的仿射变换,光线首先乘以这些变换的倒数,然后再与场景对象相交。
例如,假设我想要一个位于 (10,10,10) 的半径为 3 的球体。我创建了球体并给它一个表示这个变换的变换矩阵。
我在相机坐标中创建了一条射线。我将射线乘以球体变换矩阵的逆矩阵,并将其与通用球体相交(r=1 在 (0,0,0) 处)。我在交叉点处沿这条通用射线的距离,并使用它找到通用法线和沿原始射线的点,并将它们保存到一个变换对象中(连同距离(t)和实际变换)。
当需要计算这个交点的颜色时,我采用变换的逆转置并将其乘以通用法线以找到法线。如果我使用来自逆变换射线的交点的t值,则交点就是沿原始未变换射线的点。
问题是,当我以这种方式做事时,转换会产生奇怪的效果。主要效果是变换似乎将灯光从场景中拖出。如果我构建一堆图像并在每一帧中对球体应用稍大的旋转,它似乎会拖动场景中的灯光。这是一个例子
老实说,我无法弄清楚我在这里做错了什么,但我正在扯掉我的头发。我想不出任何好的理由来发生这种情况。任何帮助将不胜感激。