上一篇:坐标系
任意非零向量 <x, y, z>
,可使用 POV Ray 提供的 vnormalize
单位化处理,亦即将该向量转化为模长为 1 的新向量 <x', y', z'>
。例如
#declare foo = <1, 3, 5>;
#declare foo = vnormalize(foo);
有个严重的问题,如果 foo
是零向量 <0, 0, 0>
,那么 vnormalize
就会报错。例如
#declare foo = <0, 0, 0>;
#declare foo = vnormalize(foo);
povray 在解析上述代码时,会崩溃,并抱怨
Possible Parse Error: Normalizing zero-length vector.
如果 foo
的值不是像上例那样以字面值的形式直接赋值,而是来自他人提供的数据,就很难保证它的值不是零向量。更安全的做法是使用条件结构 #if ... #end
对零向量的情况进行检测:
#declare foo = <0, 0, 0>;
#if (vlength(foo) != 0)
#declare foo = vnormalize(foo);
#end
上述代码中的条件结构的意思是,如果 foo
的长度(模长)不为 0,那么就对其单位化,并绘制箭头。好吧,我是想借机演示一下 POV Ray 条件结构的用法。如果有多个条件分支,可以像下面这样来写:
#if (表达式 1)
... ... ...
#elseif (表达式 2)
... ... ...
#elseif (表达式 3)
... ... ...
#else
... ... ...
#end
做了三十三个俯卧撑之后,我才想起来,这篇文章的题目是「标准正交基」,充满了浓浓的线性代数的味道。3 个彼此正交的三维单位向量可以构成三维线性空间的标准正交基。N 个彼此正交的 N 维单位向量可以构成 N 维线性空间的标准正交基。任何一个无限的线性空间,只需要寥寥几个相互正交的单位向量就撑起来了。
老子说,三生万物。文天祥说,天地有正气,杂然赋流形。下则为河岳,上则为日星。于人曰浩然,沛乎塞苍冥。标准正交基,就是线性空间里的正气。
如何确定两个向量是否正交呢?看它们的内积。例如,
#declare A = <1, 0, 0>;
#declare B = <0, 1, 0>;
向量 A 和 B 的内积即
A.x * B.x + A.y * B.y + A.z * B.z
若 A 和 B 的内积为 0,则二者正交。上例中,显然 A 和 B 是正交的,因为在世界坐标系中, A 是 X 轴的方向,B 是 Y 轴的方向。POV Ray 提供的 vdot
函数可计算任意两个向量的内积,用法为 vdot(A, B)
。
POV Ray 中的世界坐标系即单位矩阵
$$ \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} $$
因此该矩阵是标准正交基,这也是我能徒手写出来的唯一的一个标准正交基。因此,一个问题是,如何构造其他标准正交基呢?
现在假设,以 <0, 0, 0>
为中心,以 1 为半径的球面上有一个点 X,以该点为原点构造一个标准正交基,令其第 3 个向量指向球心,另外两个向量分别与球的经线和纬线相切。如果能构造出这个基,我就可以制造天网——在太空中布置一些相机,用它们监控我绘制的整个世界。
这是一个宏大的计划,以致于我还没想好如何去实现它。
下一篇:经纬
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。