Skip to content

Commit eb1c4aa

Browse files
committed
add notes4
1 parent 78ec39c commit eb1c4aa

File tree

8 files changed

+109
-7
lines changed

8 files changed

+109
-7
lines changed
Binary file not shown.

Notes4.md

Lines changed: 109 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# Lecture04 Transformation Part II
22

33

4+
45
## 旋转矩阵是正交矩阵
56

67
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/transform6.jpg)
@@ -19,46 +20,120 @@
1920

2021
因为三维的旋转比较复杂, 因此先从某一个固定轴旋转开始. (逆时针)
2122

23+
24+
### 绕轴旋转
2225
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/rotate3d.jpg)
2326

2427
Rx(α) 绕 x 轴旋转, y z 就相当于二维坐标中的 x y.
2528

26-
PS 需要说明的是 这个3D变换是针对右手坐标系 左手坐标系的很多值和这里完全相反
29+
Rz(α) 绕 z 轴旋转, x y 就相当于二维坐标中的 x y.
30+
31+
Ry(α) 绕 y 轴旋转, z x 就相当于二维坐标中的 x y.
32+
33+
PS: 注意一下绕 Y 轴旋转. 矩阵中非0 1 的部分似乎和 绕x 绕y 有些不一样.
34+
35+
这是因为 x 是 y ✖️ z 得到 绕 x 旋转, 和 y ✖️ z方向一致. 我们在表示矩阵的时候, 也是 T ✖️ (x0, y0, z0)
36+
37+
z 是 x ✖️ y 得到 绕 z 旋转, 和 x ✖️ y 方向一致
38+
39+
而y 是 z ✖️ x 得到, 绕 y 旋转, 和 z ✖️ x 方向一致, 而我们表示矩阵的时候是 T ✖️ (x0, y0, z0)
40+
41+
所以这里的绕Y 的旋转, 相比其他两个轴, 存在一个转置. 所以Ry 1,3位置的元素不是 -sinα 而是 sinα
42+
43+
### 欧拉角
44+
3D 中所有旋转都可以分解为绕轴旋转.
45+
46+
47+
### Rodrigues Rotate Formula 罗德里格斯旋转公式
48+
49+
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/transform7.jpg)
50+
51+
52+
空间内的任意一个向量V, 绕旋转轴k 旋转 θ 角度得到新向量 Vθ 的过程.
2753

2854

2955

56+
### 四元数
57+
58+
- 解决死锁问题
59+
- 平滑插值
60+
61+
比如开始时物体旋转了15° , 最终目标物体要旋转25°, 中间如何平滑过度呢? 此刻就需要四元数.
62+
3063
## view transformation
3164
- view camera transformation
3265
- projection transformation
3366
- 正交投影
3467
- 透视投影
3568

3669
## view/camera transformation 视图变换 (也被称为 modelview transformation )
37-
定义相机的 pos lookat up direction (前两个已经可以定义出相机镜头方向 up direction 就是镜头的旋转情况)
38-
为了方便计算, 先让相机放在原点 看向 -z 的方向, up 方向是 y 的正方向 (相机所拍的物体跟着相机一起运动 这样相机所拍的场景和移动之前都是一样的)
70+
71+
定义一个相机需要
72+
- pos
73+
- lookat
74+
- up direction (前两个已经可以定义出相机镜头方向 up direction 就是镜头的旋转情况)
75+
76+
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/view0.jpg)
77+
78+
79+
80+
先让相机移动到原点 并且使得相机看向 -z 的方向, up 方向是 y 的正方向 (相机所拍的物体跟着相机都做上面的变换)
81+
82+
(让相机放在 0, 0, 0 位置是为了后续计算方便)
83+
3984

4085
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/view.jpg)
4186

4287
因此要做下面的旋转
4388

4489
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/view1.jpg)
4590

46-
PS 旋转矩阵是正交矩阵
91+
4792

4893

4994
## 投影变换
5095

5196
Projection is a Transformation. 投影是一种变换.
5297

98+
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/project0.jpg)
99+
100+
101+
投影变换最终的效果是把各个坐标映射到 [−1 , 1] 之间,然后再乘以相应的屏幕高度和宽度,得到最终的屏幕坐标。 [−1, 1] 的坐标又成为NDC坐标
102+
53103
### 正交投影
54-
视锥体缩放到 [-1, 1] 的立方体中
104+
105+
简单地理解方式: ( 关键操作: 扔掉 z 轴信息 )
106+
107+
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/project0.jpg)
108+
109+
110+
111+
实际上一般是这么操作:
112+
113+
先确定视野范围(图中的矩形空间) 然后标准化( 规则观察体 )
55114

56115
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/project.jpg)
57116

58-
先平移到原点 再缩放到标准立方体
117+
平移到原点 再缩放到标准立方体 (视锥体xyz 都缩放到 [-1, 1] 的范围)
118+
59119

60120
### 透视投影
61121

122+
先挤压视体, 使其成为一个长方体, 那么问题就变为了正交投影.
123+
124+
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/project5.jpg)
125+
126+
这个挤压要保持下面的性质
127+
128+
- 近平面的任何点在挤压前后不会变
129+
- 远平面的 z 值不会发生改变
130+
- 远平面的中心点位置不会改变
131+
132+
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/project6.jpg)
133+
134+
原本的 y 在挤压之后变为 y' 根据相似三角形就可以得到上面的结果
135+
136+
62137
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/project2.jpg)
63138

64139
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/project3.jpg)
@@ -73,4 +148,31 @@ Projection is a Transformation. 投影是一种变换.
73148

74149
https://www.zhihu.com/question/316200199
75150

76-
正交矩阵之所以叫正交矩阵,是因为一套正交基向量在该矩阵变换下仍然是正交的,这是正交矩阵的充分必要条件。很明显的,任何两个向量在旋转矩阵的变换下,这两个向量仍然是正交的,所以旋转矩阵是正交矩阵
151+
正交矩阵之所以叫正交矩阵,是因为一套正交基向量在该矩阵变换下仍然是正交的,这是正交矩阵的充分必要条件。很明显的,任何两个向量在旋转矩阵的变换下,这两个向量仍然是正交的,所以旋转矩阵是正交矩阵
152+
153+
154+
### 关于3D 变换中Ry
155+
B站有个回答说的很好
156+
157+
https://www.bilibili.com/video/BV1X7411F744?p=4
158+
159+
AT 12:46, 这是因为二位平面定义时,逆时针实际是在三维从z正向看,因此3维绕y旋转,逆时针实际是z向x转,但是旋转矩阵的行列对应关系是x向z转,取逆(转置)就得到了
160+
161+
### 关于左手坐标系
162+
首先把 把左右手坐标系 x 方向都朝一个方向.
163+
164+
左手坐标系远的物体 Z 值越大, 但是右手坐标系是远的物体 z 越小.
165+
166+
这一点左手坐标系上更加直观.
167+
168+
169+
### 关于 Frustum
170+
171+
https://zh.wikipedia.org/wiki/%E8%A7%86%E4%BD%93
172+
视体(英语:viewing frustum)又称视景体、视锥,是三维世界中在屏幕上可见的区域,即虚拟摄像机的视野。
173+
174+
### 其他一些关于投影的文章
175+
176+
https://blog.csdn.net/qq_35976351/article/details/84889065
177+
178+
http://www.cppblog.com/lai3d/archive/2008/12/15/69515.html

images/project0.jpg

42.4 KB
Loading

images/project4.jpg

45.9 KB
Loading

images/project5.jpg

256 KB
Loading

images/project6.jpg

208 KB
Loading

images/transform7.jpg

38.1 KB
Loading

images/view0.jpg

38 KB
Loading

0 commit comments

Comments
 (0)