将光线转换为对象空间以进行运动模糊


12

我的raytracer支持各种各样的对象。为了使它们相交,我使用了将光线转换为对象空间的标准技术。在我添加运动模糊之前,这非常有效。

我将运动模糊建模为一系列转换(为简化讨论,确切地说是两个)而不是一个。我的方法是在两个关键帧处进行射线的逆变换,并控制位置/方向。

对于翻译来说,这似乎工作正常,但对于旋转来说,它却失败了。例如,这是两个分别旋转30度和90度的三角形:

旋转1
(4个样本,MN重建,红色样本来自两个关键帧附近)

在拐角处,我希望弯曲的样本位于两个顶点之间的直线上。相反,它们向外凸出。错了 在具有更多有趣转换的更有趣场景中,它会导致多种故障模式。例如,这是螺旋桨旋转45度:

旋转2
(100个样本,法线可见)

某些问题是由于BVH断裂(假定对象的极值位于关键帧处)造成的,但是即使是强行渲染也不正确。

我只能通过执行正向变换(变换对象,而不是光线)来解决所有问题,但这仅适用于可能的对象(实际上只有三角形)。


如何使我的光线跟踪器通过变换光线而不是对象来产生线性近似值来进行变换(尤其是旋转)?

Answers:


7

在关键帧之间设置射线位置/方向应等效于在关键帧之间设置反矩阵并通过被约束矩阵进行变换。麻烦的是,如果关键帧具有不同的旋转度,则扭曲矩阵通常会变得“怪异”,并具有剪切,不均匀的比例等。

如果您的某些交集和着色例程无法在这种变形的坐标系中正常工作,我不会感到惊讶,除非您已针对这些情况进行了专门测试并对其进行了强化。(例如,在正交坐标系中,在剪切坐标系中获得两个单位矢量的点积不会给出相同的答案。)

这只是一个猜测,但是如果您选择一种插值方法,将平移,旋转和缩放(如果适用)分别分开(对旋转部分使用四元数)并重新组合,则可能会更好。


您确定约束前向变换的对象与约束后向变换的射线相同吗?例如,我可以使射束后的射线重新归一化(并相应地缩放命中距离)。这不会改变结果。
imallett

@imallett约束光线应等效于约束反矩阵,但不一定等效于约束正矩阵或约束对象(因为反转不是线性运算)。而且我不认为在lerp完全修复问题之后重新对射线进行归一化-您仍然可以处于剪切,非均匀缩放的坐标系中,这可能会弄乱交叉例程等中的数学运算。
内森·里德

[请参见编辑;至少,我确实认为重新规范化可以排除交叉路口的问题-但这就是我的想法;束缚光线不会束缚物体。在您的答案中,您建议使用[inverse?] TRS,然后重新组合。这是生产渲染器的方式吗?
malletlet

3

我认为AFAICS 对相当非线性的插值进行单线性逼近不会使您走得太远,但是Gribel等人的这篇关于光栅化运动模糊的论文/演讲可能会有所帮助。


我将其分解为线性近似值,这很典型。一个人可以通过多个这样的步骤来处理更复杂的变换。¶我的问题不是使变换非线性,而是使线性近似正确。
imallett
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.