1
1
# Lecture04 Transformation Part II
2
2
3
3
4
+
4
5
## 旋转矩阵是正交矩阵
5
6
6
7
![ image] ( https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/transform6.jpg )
19
20
20
21
因为三维的旋转比较复杂, 因此先从某一个固定轴旋转开始. (逆时针)
21
22
23
+
24
+ ### 绕轴旋转
22
25
![ image] ( https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/rotate3d.jpg )
23
26
24
27
Rx(α) 绕 x 轴旋转, y z 就相当于二维坐标中的 x y.
25
28
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θ 的过程.
27
53
28
54
29
55
56
+ ### 四元数
57
+
58
+ - 解决死锁问题
59
+ - 平滑插值
60
+
61
+ 比如开始时物体旋转了15° , 最终目标物体要旋转25°, 中间如何平滑过度呢? 此刻就需要四元数.
62
+
30
63
## view transformation
31
64
- view camera transformation
32
65
- projection transformation
33
66
- 正交投影
34
67
- 透视投影
35
68
36
69
## 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
+
39
84
40
85
![ image] ( https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/view.jpg )
41
86
42
87
因此要做下面的旋转
43
88
44
89
![ image] ( https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/view1.jpg )
45
90
46
- PS 旋转矩阵是正交矩阵
91
+
47
92
48
93
49
94
## 投影变换
50
95
51
96
Projection is a Transformation. 投影是一种变换.
52
97
98
+ ![ image] ( https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/project0.jpg )
99
+
100
+
101
+ 投影变换最终的效果是把各个坐标映射到 [ −1 , 1] 之间,然后再乘以相应的屏幕高度和宽度,得到最终的屏幕坐标。 [ −1, 1] 的坐标又成为NDC坐标
102
+
53
103
### 正交投影
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
+ 先确定视野范围(图中的矩形空间) 然后标准化( 规则观察体 )
55
114
56
115
![ image] ( https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/project.jpg )
57
116
58
- 先平移到原点 再缩放到标准立方体
117
+ 平移到原点 再缩放到标准立方体 (视锥体xyz 都缩放到 [ -1, 1] 的范围)
118
+
59
119
60
120
### 透视投影
61
121
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
+
62
137
![ image] ( https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/project2.jpg )
63
138
64
139
![ image] ( https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/project3.jpg )
@@ -73,4 +148,31 @@ Projection is a Transformation. 投影是一种变换.
73
148
74
149
https://www.zhihu.com/question/316200199
75
150
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
0 commit comments