Transformation 基础变换
Linear Algebra
Dot product
求投影projection
求夹角
判断前后
Cross product
判断左右和前后
右手系$\vec{\omega}=\vec{u}\times\vec{v}$
Matrices
不满足交换律 满足结合律
转置Transpose
2D transformations
Linear Transforms:
用相同维度的矩阵相乘进行变换
Scale Matrix
Reflection Matrix
Shear Matrix
Rotation Matrix 默认逆时针
3D Transforms
3D Rotations
我们所采用的是右手系,在二维之中其逆时针旋转矩阵是x轴向y轴旋转,对应到3维便是绕z轴旋转(x轴转向y轴),不难推出绕x轴旋转(y转向z),绕y轴旋转(z转向x)
任意旋转矩阵都是正交矩阵($AA^T=I$) 正交矩阵逆和转置相同 $R_{-\theta} = R_\theta^T$
(所有的旋转都是针对原点来说)
Affine Transformations仿射变换
Homogeneous coordinates 齐次坐标
引入齐次坐标目的:将平移也用矩阵变换实现
添加一个维度
$\omega$为0时表示矢量 不为0时表示点
且为点时vector + vector = vector
point - point = vector
point + vector = point
point + point = point(中点)
仿射变换
3D同2D增加一个维度
先进行线性变换再平移变换
最后一维为1,表示点(point), 为0表示方向(direction).方向的位移没有意义,方向始终不会变。第四维不是只能是1和0,在投影变换中,齐次坐标会有更多的作用
Composing Transforms组合变换
不满足交换率 从后往前实现
满足结合率
对绕非原点的旋转可先平移再绕原点旋转再平移回去
Viewing Transformation 观测变换
将虚拟世界中以(x,y,z)为坐标的物体变换到 以一个个像素位置(x,y) 来表示的屏幕坐标系之中(2维)
Think about how to take a photo (MVP)
- Find a good place and arrange people (model transformation)游戏场景中的物体调整至他们应该在的位置
- Find a good “angle” to put the camera (view transformation)得到物体与摄像机的相对位置
- Cheese! (projection transformation)将三维空间投影至标准二维平面($[-1,1]^2$)之上(这里的z并没有丢掉,为了之后的遮挡关系检测)
- 视口变换(viewport transformation):将处于标准平面映射到屏幕分辨率范围之内,即$[-1,1]^2→[0,width]*[0,height]$, 其中width和height指屏幕分辨率大小
View / Camera Transformation 视图变换
Define the camera first
- Position $\vec{e}$
- Look-at / gaze direction $\hat{g}$
- Up direction $\hat{t}$
transform the camera to The origin, up at Y, look at -Z 相机和物体一起都要变换
正常旋转不好就考虑逆变换 旋转矩阵的逆变换既为转置
Projection Transformation 投影变换
Orthographic projection 正交投影
simple:
Drop Z coordinate
Translate and scale the resulting rectangle to [-1, 1]
In general:
将物体全部转换到一个$[−1,1]^3$的空间之中
将原空间范围的左下角移至原点 放大给定倍数 将缩放后的空间范围移至新空间范围
摄像机方向:看向z的负方向 所以远的物体z更小
Perspective projection 透视投影
看成先挤压为长方体再正交投影
$y’=\frac{n}{z}y$ x同y
再由两个特殊点,近平面z=n上的点不变和远平面z=f上的点的z坐标不变可得矩阵
以上得到$[-1,1]^3$
详细推导: https://zhuanlan.zhihu.com/p/122411512?utm_source=qq&utm_medium=social&utm_oi=605668290971045888
viewport transformation 视口变换
$[-1,1]^2→[0,width]*[0,height]$ 三维变二维
$M=M_{viewport}M_{persp}M_{view}$
变换法线向量
模型变换可能会导致模型位置形状发生改变,如果属于该模型的各个三角形面的法线向量不跟着改变的话,那么此时所记录的法线向量就是错误的。因此法线向量一定也要跟着模型本身发生改变
对模型实行M矩阵的变换之后:
- 平移, 旋转的情况下,法线变换矩阵就是变换矩阵M,不需要额外计算;
- 等比缩放情况下,法线变换矩阵就是变换矩阵M,法线变换后需要除以缩放比例归一化;
其他情况使用$N = (M^{-1})^T$求法线变换矩阵
n为法向量 t为切向量 $t_M$为变化后的切向量 $n_N$为变化后的法向量
$n^Tt = n^TIt = n^TM^{-1}Mt = 0$
$(n^TM^{-1})Mt = n^TM^{-1}t_M = 0$
$n_N^T = n^TM^{-1}$
$n_N = (n^TM^{-1})^T = (M^{-1})^T n$M不可逆时使用伴随矩阵$A^ = |A|A^{-1}$ $N = (M^)^T$