光线追踪:何时规范化矢量



我正在重写我的光线追踪器,只是想更好地理解它的某些方面。

我似乎已经解决了有关法线的问题,以及如何将它们乘以转换矩阵转置的逆函数。

我感到困惑的是什么时候应该规范化我的方向向量?

正在关注某本书,有时它会明确说明要规范化我的向量和其他情况,它没有,我发现我需要这样做。

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

谢谢

除非处理

矢量之间的角度,或者旋转矢量,否则永远不需要对矢量进行归一化。

就是这样。

前一种情况下,所有三角函数都要求向量落在单位圆上,这意味着向量是归一化的。 在后一种情况下,您正在划分幅度,旋转矢量,确保它保持一个单位,然后将幅度乘回去。 正常化只是与领土相伴而行。

  • 如果有人告诉您坐标系是由 n 个单位向量定义的,请知道 i-hat、j-hat、k-hat 等可以是任何长度和方向的任何任意向量,只要它们都不平行。 这是仿射变换的核心。

  • 如果有人试图告诉你点积需要归一化向量,请摇头微笑。 点积仅在使用归一化向量来获取两个向量之间的角度时需要归一化向量。

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

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

话虽如此,你有时会为了与他人相处而正常化。 但是,如果您发现自己在调用方法之前原则上规范化向量,请考虑使用附加到向量的标志来节省自己的步骤。 从数学上讲,这并不重要,但实际上,它可以对性能产生巨大影响。

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

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

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

您几乎总是希望对光线追踪器中的所有矢量进行归一化。

最简单的例子是交叉测试:反射光线击中另一个物体的位置。

考虑一条射线,其中:

p(t) = p_0 + v * t

在这种情况下,沿该射线p(t)任意位置的点定义为与原始点p_0的偏移和沿特定方向的偏移v。 对于参数t的每个增量,生成的p(t)将移动另一个长度增量,长度增量等于向量v的长度。

请记住,您知道p_0v. 当您试图找到该射线下一次击中另一个物体的点时,您必须解决该t 。 在该表示中使用归一化向量v显然更方便,如果不是总是明显必要的话。

但是,在照明计算中使用相同的矢量v。 想象一下,我们有另一个指向光源的方向矢量u。 为了一个非常简单的着色模型,我们可以将特定点的光定义为这两个向量之间的点积:

L(p) = v * u

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

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

L(p) = ||v|| ||u|| cos(theta)

如果uv的单位长度(归一化(,则方程的计算结果将与两个向量之间的角度成正比。 但是,如果v不是单位长度,比如说,因为在上面光线模型中反射矢量后,您没有费心进行归一化,现在您的照明模型出现了问题。 使用较大v的表面上的斑点将比不使用较大的斑点亮得多。

每当在受其长度影响的某些数学中使用方向向量时,都必须对其进行归一化。

最典型的例子是点积,它用于大多数照明方程。有时还需要对照明计算中使用的矢量进行归一化,即使您认为它们是正常的。

例如,在三角形上使用插值法线时。常识告诉你,由于顶点处的法线是法线,所以通过插值得到的向量也是法线。常识就这么多...事实是,除非它们都指向同一个方向,否则它们会更短。这意味着你会把三角形着色得太暗(更糟糕的是,光源越接近表面,效果就越明显,这是一个......非常有趣的结果(。

向量可能归一化也可能不归一化的另一个示例是叉积,具体取决于您正在执行的操作。例如,当使用两个交叉积来构建正交基时,您必须至少归一化一次(尽管如果您天真地这样做,您最终会更频繁地这样做(。
如果您只关心生成的"向上向量"的方向或符号,则无需归一化。

我将回答相反的问题。什么时候不需要正常化?几乎所有与照明相关的计算都需要单位向量 - 点积然后为您提供矢量之间角度的余弦,这非常有用。一些方程仍然可以应对,但变得更加复杂(基本上是在方程中进行归一化(这主要留下了交叉测试。

如果您有单位向量,则可以简化许多交集检验的方程。有些不需要它 - 例如,如果您有一个平面方程(具有单位法线(,则可以在不归一化射线方向矢量的情况下找到射线-平面相交。距离将以射线方向矢量长度表示。如果您只想与一堆这些平面相交,这可能没问题(相对距离都是正确的(。但是,一旦您想与不同的距离进行比较(使用归一化光线方向计算(,距离值将无法正确比较。

您可能会考虑在完成一些不需要的方向矢量的工作后对其进行归一化 - 也许您有一个可以在没有归一化矢量的情况下遍历的加速度结构。但这也不相关,因为最终光线会击中某些东西,你会想要用它进行照明/阴影计算。所以你不妨从一开始就规范化它们......

换句话说,任何特定的计算可能不需要归一化的方向向量,但给定的方向向量几乎肯定需要在过程中的某个点进行归一化。

向量用于存储两个概念上不同的元素:空间中的点和方向:

  • 如果要在空间中存储点(例如相机的位置、光线的原点、三角形的顶点(,则不希望进行归一化,因为您将修改矢量的值并丢失特定位置。
  • 如果要存储方向(例如相机向上、光线方向、对象法线(,则要归一化,因为在这种情况下,您感兴趣的不是点的特定值,而是它所代表的方向,因此您不需要量级。在这种情况下,归一化很有用,因为它简化了一些操作,例如计算两个向量的余弦,如果两个向量都归一化,则可以使用点积来完成此操作。

相关内容

  • 没有找到相关文章

最新更新