首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RayTracing:何时对向量进行规范化?

RayTracing:何时对向量进行规范化?
EN

Stack Overflow用户
提问于 2011-07-29 14:58:15
回答 5查看 7K关注 0票数 6

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

我似乎已经处理了关于法线的问题,以及你应该如何用变换矩阵的转置的逆来乘以它们。

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

我遵循的是一本书,有时它会明确地声明将我的向量和其他情况规范化,但它没有,我发现我需要这样做。

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

谢谢

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-07-29 15:16:40

标准化向量简化了你的数学。它们还减少了图像中难以诊断的视觉伪影的数量。。

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

你几乎总是希望射线追踪器中的所有矢量都归一化。

最简单的例子是交集测试:反弹射线在哪里击中另一个物体。

考虑一条光线,其中:

代码语言:javascript
复制
p(t) = p_0 + v * t

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

记住,你知道p_0v。当您试图找到这个光线下一次击中另一个对象的点时,您必须为这个t进行求解。在该表示中使用规范化向量v显然更方便,如果不是总是明显必要的话。

然而,同样的矢量v被用于照明计算。假设我们有另一个指向光源的方向矢量u。为了建立一个非常简单的阴影模型,我们可以将特定点的光定义为这两个矢量之间的点积:

代码语言:javascript
复制
L(p) = v * u

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

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

代码语言:javascript
复制
L(p) = ||v|| ||u|| cos(theta)

如果uv是单位长度(归一化),则方程将与两个向量之间的角度成正比。然而,如果v不是单位长度,比方说,在上面的光线模型中反射了矢量之后,因为你没有去标准化,那么现在你的照明模型就有了问题。使用更大的v的表面斑点将比没有的斑点亮得多。

票数 2
EN

Stack Overflow用户

发布于 2011-08-11 03:46:50

你永远不需要标准化一个向量,除非你是在处理向量之间的角度,或者你是在旋转一个向量。

就这样。

在前一种情况下,所有的trig函数都要求向量降落在一个单位圆上,这意味着向量是规范化的。在后一种情况下,你要把震级除以,旋转矢量,确保它保持一个单位,然后乘以这个量值。正常化只是随着领土的推移。

  • ,如果有人告诉你坐标系是由n个单位向量定义的,那就知道i-hat,j-hat,k-hat等都可以是任意长度和方向的任意矢量,只要它们都不是平行的。这是仿射变换的核心。
  • 如果有人试图告诉你点积需要标准化向量,摇头微笑。当您使用点积得到两个向量之间的角度时,它只需要归一化向量。

但是标准化不是让数学变得“简单”了吗?

不完全是--它增加了一个数值计算和一个除法。0.1之间的数字与0.x之间的数字没有什么不同。

话虽如此,你有时为了和别人玩得很好而恢复正常。但是,如果在调用方法之前,您发现自己将向量规范化为一个原则问题,请考虑使用附加在该向量上的标志来为自己节省一步。从数学上讲,它并不重要,但实际上,它可以在性能上产生巨大的差异。

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

票数 7
EN

Stack Overflow用户

发布于 2011-07-29 15:02:30

当你在某些数学中使用方向矢量时,它是有必要规范化的,因为它的长度会影响到它。

最主要的例子是点积,它被用于大多数照明方程中。你有时也需要标准化你在照明计算中使用的矢量,即使你相信它们是正常的。

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

另一个向量可能标准化或不规范化的例子是跨乘积,这取决于您正在做什么。例如,当使用这两个交叉乘积来构建一个正交基时,您必须至少标准化一次(尽管如果您天真地这样做,那么您就会更经常地这样做)。

如果您只关心产生的“向上向量”的方向,或者关注符号,则不需要进行规范化。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6875055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档