类比2D空间的齐次坐标,引入3D空间中的齐次坐标
注意这个问题:是线性变换先还是平移变换先?这个问题的意思是是左上角的3×3矩阵是线性变换(缩放、旋转、错切),右边一列表示平移变换,那么这个矩阵作用在这个点上,是先线性变换,还是先平移呢?
这个问题其实很简单,该矩阵的作用其实是:
(
x
′
y
′
z
′
)
=
(
a
b
c
d
e
f
g
h
i
)
⋅
(
x
y
z
)
+
(
t
x
t
y
t
z
)
\left( \begin{array}{l} x'\\ y'\\ z' \end{array} \right) = \left( \begin{array}{l} a&b&c\\ d&e&f\\ g&h&i \end{array} \right) \cdot \left( \begin{array}{l} x\\ y\\ z \end{array} \right) + \left( \begin{array}{l} t_x\\ t_y\\ t_z \end{array} \right)
⎝⎛x′y′z′⎠⎞=⎝⎛adgbehcfi⎠⎞⋅⎝⎛xyz⎠⎞+⎝⎛txtytz⎠⎞
所以当然是线性变换再平移了
绕着哪个轴旋转,哪个轴的坐标就不变
注意:
R
y
R_y
Ry矩阵有些不一样的原因在于,根据右手法则,y轴=z轴×x轴,是z轴在前。
一个重要的思路就是由简单的变换组合出复杂的变换。
注意:默认Rodrigues’ Rotation Formula默认 axis n 过原点。如果是要绕任意轴旋转,做法是先把要旋转的轴平移到原点,然后再做旋转,然后再平移回去。
prove:
还有一种古老的方法是四元数,主要解决旋转矩阵不适合做插值的问题。本门课程不再提了。
View / Camera Transformation
三维空间的物体,变成二维的一张照片,是如何变换的?
MVP变换,也就是 model view projection
注意
R
v
i
e
w
−
1
R_{view}^{-1}
Rview−1的这个矩阵,它的第一列是一个单位向量,第二列也是一个单位向量,第三列也是一个单位向量,且这三个单位向量相互垂直,这满足了正交矩阵的条件,所以它是一个正交矩阵,
然后它可以将 x方向单位向量旋转到
g
^
×
t
^
\hat{g}\times\hat{t}
g^×t^.将y方向单位向量旋转到
t
^
\hat{t}
t^,将z方向单位向量旋转到
−
g
-g
−g.所以它是一个可以将原始坐标的xyz方向按原点旋转到摄像机的方向的一个旋转向量
反过来,它的逆矩阵就是将摄像机的方向旋转到xyz轴方向的旋转向量,而正交矩阵的逆就是它的转置。
注意这个名字 ModelView Transformation
这样做的目的是要方便投影!!!
Orthographic projection 正交投影
Perspective projection 透视投影
它们本质的区别是是否有近大远小的性质。
那么,在数学上如何来描述这个区别呢?
translate and scale the resulting rectangle to
[
−
1
,
1
]
2
[-1,1]^2
[−1,1]2 的意思是将去掉z坐标后的平面移动和缩放到-1到1范围的矩形,这是一个约定俗成的办法,可以简化之后的操作
注意名词:canonical cube
注意通常的办法和之前先投影的办法有区别
在这里,l<r, b<t,但是f<n,也就是说,如果一个面离视点更远,它的z值会更小,也就是说“远小于近”,所以opengl使用左手系来避免这个问题,可是使用左手系也会带来其它的问题,再次强调,本课程统一使用右手系。
拉成一个单位立方体之后,物体会被拉伸。但是还会做视口变换,这之后再讲。
透视投影是应用最广泛的投影