从一个向量建立一个坐标系

如题


假设有一个单位化的三维向量 $\mathbf{a}$,如何由$\mathbf{a}$构建出另外两个坐标系的基$\mathbf{b}$, $\mathbf{c}$?

下面是C代码:

1
2
3
4
5
6
7
8
9
10
void ComputeBasis(const Vec& a, Vec* b, Vec* c)
{
if (Abs(a.x) >= 0.57735f)
b->Set(a.y, -a.x, 0.0f);
else
b->Set(0.0f, a.z, -a.y);

b = Normalize(b);
*c = Cross(a, *b);
}

0.57735 怎么来的?

假设$\mathbf{a}$的三个分量相同并且是单位向量,即 $\mathbf{a} = (s,s,s)$,那么 $3 * s^2 = 1$,得出$s = \sqrt{1/3} = 0.57735$。如果三个分量不相等的话,那么肯定有其中一个分量肯定是大于$0.57735$的。

为什么?

vector basis
如果 $x$ 分量比较大,我们就按下面的步骤来

  1. 将$\mathbf{a}$投影到$x-y$平面上,得到$\mathbf{x}’$;
  2. 将$\mathbf{x}’$绕$z$轴顺时针旋转$90$度,得到$\mathbf{b}$;
  3. $\mathbf{c} = \mathbf{a} \times \mathbf{b}$,得到$\mathbf{c}$。

其中第2步得到的$\mathbf{b}$也和$\mathbf{a}$垂直。
假设$\mathbf{a} = \mathbf{op}$,$\mathbf{p}$在$x-y$平面上投影为$\mathbf{p}’$,$\mathbf{b} = \mathbf{op}$,那么我们要证明:
$$\mathbf{a} \perp \mathbf{b}$$

证明
因为:
$$| \mathbf{op} |^2 = | \mathbf{op’} |^2 + | \mathbf{p’q} |^2,\\
|\mathbf{p’q}|^2 = |\mathbf{oq}|^2 + |\mathbf{op’}|^2,\\
|\mathbf{pq}|^2 = |\mathbf{p’q}|^2 + |\mathbf{p’p}|^2.$$
所以:
$$| \mathbf{op} |^2 + |\mathbf{oq}|^2 = |\mathbf{pq}|^2$$
所以$$\mathbf{a} \perp \mathbf{b}$$

旋转

绕$z$轴顺时针旋转角度$\theta$,对应旋转矩阵为:
$$
\begin{bmatrix}
cos \theta & sin \theta & 0 \\
-sin \theta& -cos \theta & 0 \\
0& 0 & 1
\end{bmatrix}
$$
那么旋转90度得到对应的旋转矩阵为:
$$
\begin{bmatrix}
0 & 1 & 0 \\
-1& 0 & 0 \\
0& 0 & 1
\end{bmatrix}
$$
又因为是在$x-y$平面上,所以$z$分量为$0$。
那么旋转矩阵就是:
$$
\begin{bmatrix}
0 & 1 & 0 \\
-1& 0 & 0 \\
0& 0 & 0
\end{bmatrix}
$$
所以:
$$
\mathbf{b}=
\begin{bmatrix}
0 & 1 & 0 \\
-1& 0 & 0 \\
0& 0 & 1
\end{bmatrix} \mathbf{a} = [a.y, -a.x,0.0]^T
$$

##另一种情况
如果$x$分量没有$0.57735$那么大,则绕$x$顺时针旋转$90$度。
对应的旋转矩阵为:
$$
\begin{bmatrix}
0 & 0 & 0 \\
0 & 0 & 1 \\
0& -1 & 0
\end{bmatrix}
$$
对应的
$$
\mathbf{b}=
\begin{bmatrix}
0 & 0 & 0 \\
0 & 0 & 1 \\
0& -1 & 0
\end{bmatrix} \mathbf{a} = [0.0, a.z, -a.y]^T
$$

第三个基

有了坐标系的两个基,那么第三个基就很好求,一个叉乘完事儿。

参考:Computing a Basis

文章目录
  1. 1. 0.57735 怎么来的?
  2. 2. 为什么?
  3. 3. 旋转
  4. 4. 第三个基
,