我目前正在学习OpenGL中的光照,其中涉及到GLSL中的一个函数normalize。根据OpenGL文档所述,该函数“计算两个向量的标准化乘积”。然而,仍然没有解释“标准化”是什么意思。我已经尝试在Google上寻找有关标准化乘积的信息,但似乎找不到任何相关内容。能否有人解释一下标准化的含义并提供一些标准化值的示例?
我目前正在学习OpenGL中的光照,其中涉及到GLSL中的一个函数normalize。根据OpenGL文档所述,该函数“计算两个向量的标准化乘积”。然而,仍然没有解释“标准化”是什么意思。我已经尝试在Google上寻找有关标准化乘积的信息,但似乎找不到任何相关内容。能否有人解释一下标准化的含义并提供一些标准化值的示例?
我认为混淆是来自于将“a value”标准化与将“a vector”标准化区分开来的想法;如果您只将一个单独的数字视为值,那么标准化没有任何意义。只有将标准化应用于向量时才有用。
向量是数字序列;在三维图形中,它通常表示为坐标v = <x,y,z>
。
每个向量都有一个大小或长度,可以使用勾股定理找到:|v| = sqrt(x^2 + y^2 + z^2)
这基本上是从原点<0,0,0>
到向量表示的点的一条线的长度。
如果向量的长度为1,则向量是向量单位向量。就是这样!
将向量标准化意味着更改它,使其指向相同的方向(考虑来自原点的那条线),但其长度为1。
我们使用法向量的主要原因是表示方向;例如,如果您正在建模无限距离处的光源,则无法为其提供精确的坐标。但是,您可以使用法向量指示从特定点找到它的位置。
这是一个数学术语,该链接用非常简单的方式解释了它的含义:
2D和3D计算机图形中的操作通常使用已经被标准化即转换为单位向量的向量副本来执行...将向量标准化涉及两个步骤:
- 计算其长度,然后,
- 将其 (
xy
或xyz
) 组件的每个元素除以其长度...
如果你对向量或者向量代数不是很了解,那么这个概念可能比较难以解释。(你可以查看这篇关于向量、法向量甚至标准化过程的文章查看)
但是,“标准化”的过程或概念指的是使某物达到标准或“正常”的过程。
在向量的情况下,我们假设一个标准向量的长度为1。因此,标准化一个向量就是将任意长度的向量保持方向不变,将其长度改为1,从而将其转换为所谓的单位向量。