RayTracing:何时标准化矢量?

Set*_*ron 5 graphics raytracing vector linear-algebra

我正在重写我的光线追踪器,并试图更好地理解它的某些方面.

我似乎已经解决了关于法线的问题,以及你应该如何将它们乘以变换矩阵的转置的倒数.

我感到困惑的是,我应该将我的方向向量归一化吗?

我正在关注某本书,有时候它会明确说明我的矢量和其他情况的归一化,我发现我需要.

归一化向量的方向相同,单位长度为1?所以我不清楚何时有必要?

谢谢

Mic*_*ays 6

除非您正在处理矢量之间的角度,或者除非您正在旋转矢量,否则您永远不需要对矢量进行标准化.

而已.

在前一种情况下,所有的trig函数都要求向量在单位圆上着陆,这意味着向量是标准化的.在后一种情况下,你要分割幅度,旋转矢量,确保它保持一个单位,然后再将幅度乘以.规范化只适用于领土.

  • 如果有人告诉你,坐标系统由n个单位矢量被定义,知道我帽,J-帽子,K-帽子等可以是任何的任意矢量(S)的任何长度和方向,只要没有的它们是平行的.这是仿射变换的核心.

  • 如果有人试图告诉你点积需要标准化矢量,请摇头并微笑.当您使用点积乘以得到两个向量之间的角度时,它只需要归一化向量.

但是,规范化不会使数学"更简单"吗?

不是 - 它增加了一个幅度计算和一个除法.0..1之间的数字与0..x之间的数字没有区别.

话虽如此,你有时会正常化,以便与他人合作.但是,如果您在调用方法之前发现自己将向量归一化为原则问题,请考虑使用附加到向量的标志来为自己节省一步.在数学上,它并不重要,但实际上,它可以在性能上产生巨大的差异.

所以再次......它是关于旋转矢量或测量其与另一个矢量的角度.如果你不这样做,不要浪费周期.


Bob*_*oss 3

tl;dr:归一化向量简化了你的数学。它们还减少了图像中非常难以诊断的视觉伪影的数量。

归一化向量方向相同,单位长度为 1?所以我不清楚什么时候有必要?

您几乎总是希望光线追踪器中的所有向量都被归一化。

最简单的例子是相交测试:弹跳光线击中另一个物体的位置。

考虑一条射线:

p(t) = p_0 + v * t
Run Code Online (Sandbox Code Playgroud)

在这种情况下,沿着该射线的任意点p(t)被定义为相对于原始点的偏移p_0以及沿着特定方向的偏移v。对于参数的每一个增量t,结果p(t)将移动另一个长度增量,其长度等于向量的长度v

请记住,您知道p_0并且v。当您试图找到该光线下一次撞击另一个物体的点时,您必须解决这个问题t。在该表示中使用归一化向量vs 显然更方便(即使并非总是明显必要)。

然而,相同的向量v用于照明计算。想象一下,我们有另一个u指向光源的方向向量。出于非常简单的着色模型的目的,我们可以将特定点处的光定义为这两个向量之间的点积:

L(p) = v * u
Run Code Online (Sandbox Code Playgroud)

诚然,这是一个非常无趣的反思模型,但它抓住了讨论的要点。如果反射指向光,则表面上的点是明亮的,否则是暗淡的。

现在,请记住,编写此点积的另一种方式是向量的大小乘以它们之间的角度的余弦的乘积:

L(p) = ||v|| ||u|| cos(theta)
Run Code Online (Sandbox Code Playgroud)

如果uv具有单位长度(标准化),则该方程将与两个向量之间的角度成正比。但是,如果v不是单位长度,比如说因为在上面的光线模型中反射矢量后没有进行标准化,那么现在您的照明模型有问题。表面上使用较大的斑点v会比不使用较大的斑点亮得多。