【图形学笔记】Lecture04-Transforms 变换
Lecture04-Transforms 变换
Transforms 变换
变换有什么用?1、建模。2、观察。
- Scale Transform(non-uniform anisotropic)缩放变换(非规范,各向异性),如果是规范的就叫 相似变换(Similarity Transform)。
- Reflection Transform 反射变换。
- Shear Transform 剪切变换。
- Rotate (CCW by default)旋转(默认逆时针)
- Translation 平移:需要加一个维度(齐次坐标 Homogeneous Coordinates)
- 在齐次坐标上,\((x,y,w)\) 在2D里面对应点 \((x/w,y/w,1)(w\neq 0)\)
- Affine Transformation 仿射变换
对应着先做线性变换(这里其实还有个概念叫刚体变换 Rigid Transform),再做平移
- Projective Transform 对应着任意一个矩阵
Composite Transform 分解变换
有点显然,跳了。
Q:如何沿着给定的点 \(c\) 旋转?
A:先把c平移到原点,旋转,再平移回去,\(M=T(c)\cdot R(\alpha) \cdot T(-c)\)
3D Transformations 三维的变换
几乎一样的,先线性变换,再平移。
旋转
绕着 \(x,y,z\) 轴旋转,意味着这个轴的基不动,旋转另外两个基,假设原本是\(e^{xi}=\cos x+i\sin x=(X,Y)\),逆时针旋转 \(\alpha\) 之后,得到\(e^{(x+\alpha)i}=\cos(x+\alpha)+i\sin(x+\alpha)=X\cos\alpha-Y\sin \alpha+i(Y\cos \alpha +X\sin\alpha)\),也就是\(e^{(x+\alpha)i}=(X\cos\alpha-Y\sin\alpha,X\sin\alpha+Y\cos\alpha)\)
然后\(R_{xyz}(\alpha,\beta,\gamma)=R_x(\alpha)\cdot R_y(\beta)\cdot R_z(\gamma)\) 叫欧拉角(注意这里是有顺序的,当然实际上关于欧拉角能说的也有很多细节,这里似乎都省略了)
Rodrigues 罗德里格旋转公式
沿着向量 \(\vec n\) 旋转 \(\alpha\),对应的转移矩阵:
注记:
- 1、注意这里的轴是默认过原点的,没过原点自然就要平移啦。
- 2、右边的矩阵是个什么鬼东西?仔细想,这个向量对应着叉积运算:
Viewing Transformation 视图变换
-
相机和物体一起移动,那么得到的照片是一样的。
-
考虑把照相机移动到原点,并且朝着 \(-z\) 轴的方向看,然后把物体做对应的变换。相机有哪些关键的信息?
-
需要固定观测的方向 \(\vec g\),以及向上的方向(相机的向上方向) \(\vec t\),同时通常会定一个向 \(\vec g\times \vec t\)。
也就是说假设给相机做了变换 \(M_{view}\),意味着:
- 1、移动到原点。
- 2、旋转 \(g\) (gaze direction)到 \(-z\) 轴,旋转 \(t\) 到 \(y\) 轴,旋转 \(g\times t\) 到 \(x\) 轴。
第一步是
第二步看起来不好求,考虑逆变换矩阵(这里相当于直接对列向量写):
然后注意到一个事实:对于任意 \(n\) 维空间上的旋转变换,对应着把原本的基变成一组新的基,假设\(R_{ij}=(\vec x_1,\dots,\vec x_n)\),则
\(\vec x_i(i=1,\dots,n)\) 都是单位向量,因此\((R\cdot R^T)_{ij}\) 当且仅当 \(i=j\) 时为1,其他时候是 \(0\),故 \(R\cdot R^T=E\),所以对于旋转变换,逆变换矩阵=变换矩阵的转置!
最后
Projection Transformation投影变换
orthographic/perspective projection 正交/透视投影
Orthographic Projection正交投影
通过平移把立方体 \([l,r]\times [b,t]\times [f,n]\) 中心移到原点,再通过伸缩变换把立方体变成标准(canonical)立方体\([-1,-1]^3\)。
这时候 \(z\in [-1,1]\) ,在做 Z-buffer的时候比较方便。
注意: 现在的变换看来,会觉得沿着 \(-z\) 轴的远/近不是很直观(n应该代表near,f应该代表far,但这里是反过来的)
Perspective Project 透视投影
三维空间怎么做透视投影?
- 1、先挤压(squish),把锥台体(frustum)变成一个立方体(cuboid)。
- 2、再做正交投影
标准的透视投影(只看头尾)
如果只看前后平面,透视投影之后 \(z\) 应该是不变的
- 中心在 \((0,0,0)\),想想投影平面在 $z=d $。
- \((x,y,z)\to (x\cdot \frac{d}{z},y\cdot \frac{d}{z},d)\)
- 如何用矩阵表示变换?齐次坐标! 所有形如\((kx,ky,kz,k)\) 的齐次坐标\((k\neq 0)\),都对应着3维空间里的点 \((x,y,z)\) !
- 所以就变成考虑:
Perspective to Orthographic
我们现在希望透视到正交的这一步,能保持一些性质:
-
1、近平面和远平面的 \(z\) 应该保持不变。
-
2、近平面和远平面的中心(假设平面中心穿过 \(z\) 轴)的坐标应该保持不变。
-
3、 \(x,y\) 变换和上面的一样,\((x,y)\to (x\frac{n}{z},y\frac{n}{z})\),其中 \(n\) 表示到近平面的距离。
于是:
假设最左边到最右边乘了个我们要的矩阵 \(M_{persp\to ortho}\),那么应该有:
接着考察远近平面的中心不变这条性质,取近平面上任意一点 ,要有 \(M_{persp\to ortho}(x,y,n,1)^T=(nx,ny,n^2,1)^T\),因为 \(x,y\) 是任取的,所以可以直接假设矩阵的第三行形如 \((0,0,A,B)\) 的形式,那么有 \(An+B=n^2\)。
再考虑远平面的中心\((0,0,f,1)\),变换后是\((0,0,f,1)\sim (0,0,f^2,f)\),因此有 \(Af+B=f^2\),解方程组得到
最终
以及
Q:那么在近平面和远平面中间的点的变化是均匀的吗?
A:并不是,比如取 \((0,0,\frac{n+f}{2},1)\) 这一点,变换后 \(z\) 方向分量变为 \(\frac{n^2+f^2}{2}\),很明显不是均匀的。
Hierarchical Transforms 层次变换
每个形状都有自己的变换,如果单独编辑一个元素,可以引起很多变换。
引入“骨骼”(Skeleton)的概念,分组表示:
- 每个组包含一些更小的组,或者形状
- 每个组的变换和上一级的组的变换相关
- 每个组的变换自然就是,从根节点下来的变换的复合。