Files
thejinchao.github.io/docs/note/graphics/math/transform_02.md
T
2025-02-22 22:42:02 +08:00

159 lines
5.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 几何变换(二)
----
## 4. 仿射变换
### 4.1 齐次坐标(Homogeneous Coordinates)
#### 4.1.1 定义
齐次坐标就是将一个原本是n维的向量或者一个n维的点用一个n+1维坐标来表示,例如二维点$[x,y]$,用$[x,y,w]$表示,它等同于笛卡尔坐标系中的$[x/w,y/w]$
$$
[x,y,w]\Leftrightarrow[\frac{x}{w},\frac{y}{w}]
$$
#### 4.1.2 齐次的含义
笛卡尔坐标$[x,y]$,等同于齐次坐标$[kx,ky,k]$,所以称作该坐标是"齐次",Homogeneous一词有“同质”的含义,译作同质坐标可能更准确一些
#### 4.1.3 点和矢量
在图形学中,一般用$[x,y,0]$表示一个二维矢量,用$[x,y,z,1]$表示一个二维点。 这样可以保证矢量的“平移不变性”,也就是一个矢量经过平移变换,仍然保持和原先一致。
$$
\begin{bmatrix}
1&0&t_x\\
0&1&t_y\\
0&0&1
\end{bmatrix}\begin{bmatrix}x\\y\\0\end{bmatrix}=\begin{bmatrix}x\\y\\0\end{bmatrix}
$$
两个矢量的和或者差$\vec{\boldsymbol{u}}\pm\vec{\boldsymbol{v}}=[u_x,u_y,u_z,0]\pm[v_x,v_y,v_z,0]=[u_x\pm v_x,u_y\pm v_y,u_z\pm v_z,0]$仍然是一个矢量,而两个点的差也是矢量,点和矢量的和或者差也是矢量
$$\begin{split}
{vector}+{vector}&={vector} \\
{point}-{point}&={vector} \\
{point}+{point}&={?} \\
{point}+{vector}&={point} \\
\end{split}$$
其次坐标表示的两个点的和也是有意义的,表示两个点的中点
$$
[x_1,y_1,1]+[x_2,y_2,1]=[x_1+x_2,y_1+y_2,2]=[\frac{x_1+x_2}{2}, \frac{y_1+y_2}{2}, 1]
$$
### 4.2 齐次矩阵表达
#### 4.2.1 线性变换无法表示图形学中所有的几何变换,因此需要定义一种变换为
$$
\alpha(\vec{\boldsymbol{v}})=\tau(\vec{\boldsymbol{v}})+\vec{\boldsymbol{b}}
$$
用矩阵表达为
$$\begin{split}
\alpha(\vec{\boldsymbol{v}})&=\boldsymbol{A}\vec{\boldsymbol{v}}+\vec{\boldsymbol{b}} \\
&=\begin{bmatrix}
A_{11}&A_{12}&A_{13}\\
A_{21}&A_{22}&A_{23}\\
A_{31}&A_{32}&A_{33}
\end{bmatrix}\begin{bmatrix}x\\y\\z\end{bmatrix}+\begin{bmatrix}b_x\\b_y\\b_z\end{bmatrix}
&=\begin{bmatrix}x'\\y'\\z'\end{bmatrix}
\end{split}$$
常用4X4齐次矩阵来做这种运算
$$
\begin{bmatrix}
A_{11}&A_{12}&A_{13}&b_x\\
A_{21}&A_{22}&A_{23}&b_y\\
A_{31}&A_{32}&A_{33}&b_z\\
0&0&0&1
\end{bmatrix}\begin{bmatrix}x\\y\\z\\1\end{bmatrix}=\begin{bmatrix}x'\\y'\\z'\\1\end{bmatrix}
$$
## 5. 平移变换
### 5.1 定义
空间中的某一点$\boldsymbol u$,移动到$\boldsymbol{u}+\vec{\boldsymbol{b}}$,那么用齐次矩阵表示这个变换为
$$
\boldsymbol T=\begin{bmatrix}
1&0&0&b_x \\
0&1&0&b_y \\
0&0&1&b_z \\
0&0&0&1
\end{bmatrix}
$$
## 6. 组合变换
### 6.1 定义
图形学中将所有变换统一使用4X4的齐次坐标组合
$$
R=R_n\cdots R_3R_2R_1
$$
这样,一系列变换可以组合到一个矩阵中完成
$$
\cdots(R_3(R_2(R_1\vec{\boldsymbol{u}}))=(\cdots R_3R_2R_1)\vec{\boldsymbol{u}}
$$
### 6.2 坐标系变换
一个物体在不同坐标系中的变换,比如常用的局部坐标系到世界坐标系的变换
![](./transform_axis.svg)
设新坐标系x'y'z'的原点在原坐标系的$\vec{\boldsymbol{O}}(x_o,y_o,z_o)$处,新坐标系的单位坐标矢量在原坐标系中的矢量为$\vec{\boldsymbol{i}'},\vec{\boldsymbol{j}'},\vec{\boldsymbol{k}'}$,那么将物体的坐标从原先坐标系xyz转换到新坐标系x'y'z'的转换可以分为两部分
#### 6.2.1 平移矩阵
构建平移矩阵,目的是将物体在原坐标系中的坐标做一个偏移,这个偏移可以视作将物体和新坐标系一起移动,将新坐标系的原点$\boldsymbol{O}$挪到原坐标系的原点处,可以得到
![](./transform_axis_move.svg)
$$
\boldsymbol{T}=\begin{bmatrix}
1&0&0&-x_0 \\
0&1&0&-y_0 \\
0&0&1&-z_0 \\
0&0&0&1
\end{bmatrix}
$$
#### 6.2.2 构建旋转矩阵
接下来要构建一个旋转矩阵$\boldsymbol{R}$,目的是将片以后的物体坐标和新坐标系旋转到和原坐标系一致,也就是经过这个矩阵,可以将新坐标系中的$x'$轴旋转到原坐标系的$x$轴,也就是:
$$
\boldsymbol{R}\begin{bmatrix}i_x'\\i_y'\\i_z'\\0\end{bmatrix}=\begin{bmatrix}1\\0\\0\\0\end{bmatrix}
$$
同理,也需要将$y'$轴旋转到$y$轴,$z'$轴旋转到$z$轴
![](./transform_axis_roate.svg)
这个矩阵并不好直接写出,但是它的逆矩阵就比较容易,也就是能够将写出
$$
\boldsymbol{R}^{-1}=\begin{bmatrix}
i_x'&j_x'&k_x'&0 \\
i_y'&j_y'&k_y'&0 \\
i_z'&j_z'&k_z'&0 \\
0&0&0&1
\end{bmatrix}
$$
这个矩阵满足
$$\begin{split}
\boldsymbol{R}^{-1}[1,0,0,0]^T&=[i_x',i_y',i_z',0]^T\\
\boldsymbol{R}^{-1}[0,1,0,0]^T&=[j_x',j_y',j_z',0]^T\\
\boldsymbol{R}^{-1}[0,0,1,0]^T&=[k_x',k_y',k_z',0]^T
\end{split}$$
由于这是一个正交矩阵,所以
$$
\boldsymbol{R}=(\boldsymbol{R}^{-1})^T=\begin{bmatrix}
i_x'&i_y'&i_z'&0 \\
j_x'&j_y'&j_z'&0 \\
k_x'&k_y'&k_z'&0 \\
0&0&0&1
\end{bmatrix}
$$
#### 6.2.3 组合后的坐标转换矩阵
$$\begin{split}
\boldsymbol{RT}&=\begin{bmatrix}
i_x'&i_y'&i_z'&-(x_0i_x'+y_0i_y'+z_0i_z') \\
j_x'&j_y'&j_z'&-(x_0j_x'+y_0j_y'+z_0j_z') \\
k_x'&k_y'&k_z'&-(x_0k_x'+y_0k_y'+z_0k_z') \\
0&0&0&1
\end{bmatrix}\\&=\begin{bmatrix}
i_x'&i_y'&i_z'&-\vec{O}\cdot\vec{i'} \\
j_x'&j_y'&j_z'&-\vec{O}\cdot\vec{j'} \\
k_x'&k_y'&k_z'&-\vec{O}\cdot\vec{k'} \\
0&0&0&1
\end{bmatrix}\end{split}
$$
验证
$$\begin{split}
\boldsymbol{RT}[i_x',i_y',i_z',0]^T&=[1,0,0,0]^T\\
\boldsymbol{RT}[j_x',j_y',j_z',0]^T&=[0,1,0,0]^T\\
\boldsymbol{RT}[k_x',k_y',k_z',0]^T&=[0,0,1,0]^T\\
\boldsymbol{RT}[x_0,y_0,z_0,1]^T&=[0,0,0,1]^T
\end{split}$$