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

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

这对于平移似乎很好,但是对于旋转却可以分解。例如。这是两个分别旋转30度和90度的三角形:

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

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

(100个样本,可视化法线)

一些问题是由于BVH断裂(假设物体的极值位于关键帧处) ),但即使是蛮力渲染也不正确。

我只能通过执行前向变换(变换对象,而不是光线)来解决所有问题,但这仅适用于可能的对象(仅



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

#1 楼

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

如果您的某些交点和着色例程无法在这种变形的坐标系中正常工作,除非您已针对此类情况进行了专门测试和强化。 (例如,在剪切坐标系中,采用两个单位矢量的点积不能得到与正交法则相同的答案。)

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

评论


$ \ begingroup $
确定要约束向前变换的对象与约束向后变换的射线相同吗?例如,我可以使射束后的射线重新归一化(并相应地缩放命中距离)。这不会改变结果。
$ \ endgroup $
–imallett
15年10月14日在19:41

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



$ \ begingroup $
[请参见编辑;至少,我确实认为重新规范化应排除交点的问题-但这就是我的想法;束缚光线不会束缚物体。在您的答案中,您建议使用[inverse?] TRS,然后重新组合。这是生产渲染器的方式吗?
$ \ endgroup $
–imallett
15年10月14日在21:01

#2 楼

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

评论


$ \ begingroup $
我将其分解为线性近似,这很典型。一个人可以通过多个这样的步骤来处理更复杂的变换。¶我的问题不是使变换非线性,而是使对它的线性近似正确。
$ \ endgroup $
–imallett
15年10月14日在19:45