1
上一篇:坐标系

任意非零向量 <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 个向量指向球心,另外两个向量分别与球的经线和纬线相切。如果能构造出这个基,我就可以制造天网——在太空中布置一些相机,用它们监控我绘制的整个世界。

这是一个宏大的计划,以致于我还没想好如何去实现它。

下一篇:经纬

garfileo
6k 声望1.9k 粉丝

这里可能不会再更新了。


« 上一篇
坐标系
下一篇 »
经纬

引用和评论

2 篇内容引用
0 条评论