文章目录
一、旋转
三维空间中绕坐标轴旋转
R x ( α ) = ( 1 0 0 0 0 cos α − sin α 0 0 sin α cos α 0 0 0 0 1 ) R y ( α ) = ( cos α 0 sin α 0 0 1 0 0 − sin α 0 cos α 0 0 0 0 1 ) R z ( α ) = ( cos α − sin α 0 0 sin α cos α 0 0 0 0 1 0 0 0 0 1 ) \begin{array}{l}\mathbf{R}_{x}(\alpha)=\left(\begin{array}{cccc}1 & 0 & 0 & 0 \\0 & \cos \alpha & -\sin \alpha & 0 \\0 & \sin \alpha & \cos \alpha & 0 \\0 & 0 & 0 & 1\end{array}\right) \\\mathbf{R}_{y}(\alpha)=\left(\begin{array}{cccc}\cos \alpha & 0 & \sin \alpha & 0 \\0 & 1 & 0 & 0 \\-\sin \alpha & 0 & \cos \alpha & 0 \\0 & 0 & 0 & 1\end{array}\right) \\\mathbf{R}_{z}(\alpha)=\left(\begin{array}{cccc}\cos \alpha & -\sin \alpha & 0 & 0 \\\sin \alpha & \cos \alpha & 0 & 0 \\0 & 0 & 1 & 0 \\0 & 0 & 0 & 1\end{array}\right)\end{array} Rx(α)=⎝⎜⎜⎛10000cosαsinα00−sinαcosα00001⎠⎟⎟⎞Ry(α)=⎝⎜⎜⎛cosα0−sinα00100sinα0cosα00001⎠⎟⎟⎞Rz(α)=⎝⎜⎜⎛cosαsinα00−sinαcosα0000100001⎠⎟⎟⎞
其中绕y轴旋转比较特殊,可以通过向量叉乘去理解,x与y叉乘得到z,y与z叉乘得到x。这两个都是符合叉乘,通过另外另外两个轴右手逆时针旋转得到。而y是z与x叉乘的结果,这两个轴的右手旋转方向和转动方向相反,取负号。
三维空间中绕任意轴旋转
对于任意一个旋转
R
x
y
z
(
α
,
β
,
γ
)
R_{xyz}(α,β,γ)
Rxyz(α,β,γ),可以由 R_x(α) 、R_y(β) 和
R
z
(
γ
)
R_z( \gamma)
Rz(γ) 组成。其中,α 、β 和 γ 称为欧拉角(Euler Angles)。通过下图中的操作,可将飞机的头朝向任意方向。
罗德里格斯公式(Rodrigues’ Rotation Formula)
在三维旋转理论中,对于给定旋转轴和旋转角度,以Olinde Rodrigues命名的罗德里格斯公式是用于在空间旋转向量的高效算法。
旋转轴为 n 轴,旋转角为 α .默认旋转轴过原点(若不过原点,可想将其移至原点,然后做线性变换后,在将其平移至原位置)。其中,罗德里格斯公式如下:
二、观测变换(View/Camera Transformation)
上述三种变换即为MVP变换。
视图变换View Transformation
视图变换是在摆一个照相机。如何才能确定一个相机的摆放
1 定义的三个要素
- 位置
- 观测的方向
- 向上方向(正立,倒立的像)
2 进行视图变换
约定:相机在原点,向上指向 Y,看向 Z 方向。
3 相机转换步骤
将相机转换到原点的标准方向
先将其平移至原点。
再求旋转,先求得其逆变换再求逆,既可以得到变换矩阵(由于旋转变换矩阵为正交矩阵,其逆就是其转置)
总结
投影变换(Rrojection Transformation)
1 投影变换的分类
其中,人眼成像类似于透视投影(右图);正交投影(左图)常用于工程制图。
透视投影是在一个点投射成四棱锥形成;正交显示若将相机放于无限远,远、*面将无限接近。
2、正交投影
( 一 )3D化2D方法:
下图将去除z轴,投影移至
[
−
1
,
1
]
2
[-1,1]^2
[−1,1]2,约定俗成。
( 一 )3D方法:
定义一个空间中的立方体,将其映射成标准立方体
[
−
1
,
1
]
3
[−1,1]^3
[−1,1]3中。“先平移再缩放”。
z轴用远和近表示
变换矩阵
坐标系选择不同,会导致结果不同。
三 透视投影
- 越远的对象越远
- 平行线不再相交
如何进行透视投影?(难点)
简单说,就是把这个Frustum的远平面f挤成同*面n一样大的平面,然后进行正交投影。
约定:
3. *面不变
4. 远平面f的中心点不变
5. Z值仍为f
关于远平面挤压后坐标的变化,(通过相似三角形算出)等值关系:
在齐次坐标中,利用上述相似关系
y
′
=
n
z
y
x
′
=
n
z
x
(similar to y’)
y^{\prime}=\frac{n}{z} y \quad x^{\prime}=\frac{n}{z} x \text { (similar to y') }
y′=znyx′=znx (similar to y’)
(
x
y
z
1
)
⇒
(
n
x
/
z
n
y
/
z
unknown
1
)
mult.
by
z
=
=
(
n
x
n
y
still unknown
z
)
\left(\begin{array}{l}x \\y \\z \\1\end{array}\right) \Rightarrow\left(\begin{array}{c}n x / z \\n y / z \\\text { unknown } \\1\end{array}\right)^{\begin{array}{l}\text { mult. } \\\text { by } z \\==\end{array}}\left(\begin{array}{c}n x \\n y \\\text { still unknown } \\z\end{array}\right)
⎝⎜⎜⎛xyz1⎠⎟⎟⎞⇒⎝⎜⎜⎛nx/zny/z unknown 1⎠⎟⎟⎞ mult. by z==⎝⎜⎜⎛nxny still unknown z⎠⎟⎟⎞
上述变换可以用矩阵表示如下,可以确定出变换矩阵的三行
如何去确定剩下的一行呢?通过以下
1. 利用*面的点不变性 *面上的点在经过上述变换后坐标不变
计算出第三行的前两个问号,得出一个等式
A
n
+
B
=
n
2
An+B=n^2
An+B=n2:
2. 利用远平面的点,Z坐标值不变性,得出一个等式
A
n
+
B
=
f
2
An+B=f^2
An+B=f2:
联立上两式即可得
Question:对于中间任意一点(x,y,z),在经过挤压后(将其变为立方体后),变换后的Z值会靠近远平面还是靠近*面?
Answer:会更大一些,乘以变换矩阵即可得到结果。