向量代数
- 为什么用向量,而不用坐标点(标量)表示位置?因为向量有大小,方向,不仅有更多的操作,而且除了表示位置,还可以表示力(物理),方向(视角,攻击,光线,多边形……),位移,速度……
- 注意:向量仅有两个属性,只要大小和方向相同,那么向量就是相同的,位移不影响向量的属性
- 为什么引入坐标系?因为计算机无法直接处理向量,需要2d | 3d的坐标-系
- 向量和坐标系:将向量的起点移到坐标原点,因而可以确定向量v(x,y,z)
- directX采用左手坐标系,与opengl右手坐标系不同,意味着z轴的正方向相反
- //
- 正交投影:
- 一个向量v可以分解为两个互相正交的向量,为向量加法的逆运算
- proj n(v):v在n上的投影,n为单位向量(仅考虑方向),那么投影的大小p:
- p = kn = k; k = ||v|| cos ;所以 p = ||v ||cos n = (||v|| ||n|| cos)n = (v n)n
- prep n(v) :v在n上投影的正交分量,:向量 w = v - p; w + p = v;
- //
- 规范正交:如果向量集每个向量都相互正交,且都为单位向量,则集合为规范正交
- 正交化:将非规范正交,变为正交
- 2D:向量v0平行n轴,使v正交化:v - proj n (v):向量v - v在n上投影 = 向量相减 = prep n(v)
- 3D:向量可能依次减去多个方向的投影
矩阵代数
- 余子式:A为n*n的矩阵,- 上标Aij,表示去除i行j列的(n-1)(n-1)矩阵
- 行列式:detA(A的行列式) = (求和) Aij (某元素) (-1)^i + f (符号) det -上标Aij(余子式的行列式)
- Aij元素的代数余子式Cij:(-1)i+j(符号) det -上标Aij(余子式的行列式):
- 代数余子式矩阵CA:右Cij构成的矩阵
- 伴随矩阵A^*:CA^T 矩阵的转置矩阵
- 逆矩阵A^-1:几何意义为矩阵除法(倒数),A^* / detA
- //
- 线性组合:
- 向量 * 矩阵 :可以写为线性的形式:行向量 * 矩阵的每一列,移项后,u A = xA1. + yA2. + zA3. (这里 n. 表示第n行),相当于向量u的标量系数,和矩阵A的每行线性组合
变换
- 线性变换:
- 输入输出都是向量, 且满足如下两个性质,则T为线性变换
- T(u + v) = T(u) + T(V); T(ku) = k T(u) ;k为标量
- 线性性质推论:T(au,bv,cw) = T(au + (bv + cw)) = aT(u) = T(bv + cw) = aT(u) + bT(v) + cT(w)
- //
- 矩阵表示法
- T(u)如何用矩阵表示?填入ijk标准基向量:坐标轴的3个单位向量
- 根据线性变换性质:T(xi+yj+zk) = xT(i) + yT(j) + zT(k),根据线性组合可以推导为矩阵A的形式
- //
- 缩放:
- 证明S变换为线性变换:通过带入两个性质,符合等式
- 计算缩放矩阵:根据矩阵表示法,我们已经知道了S(T),和ijk,:S(i) ,S(j) S(k)……
- //
- 旋转:
- 对于想要计算v绕n旋转后的 Rn(v)向量,我们首先表示proj n(v)的投影,和v^T = prep n(v) = v - proj n(v) 正交于n的投影,并且发现,只有v^T被v的旋转影响,而另一个投影分量不变化
- 接着表示v^T 和 proj n(v)的叉积,可以获得正交于两个向量的第3个向量 n * v^T = ||n|| ||v^T||sina(a为n与v^T的夹角 = 90) = v^T,
- 最后表示 Rn(v)和轴n的连线,Rn(v^T) ,因为在一个圆周Rn(v^T)的长度 = v^T的长度,上条的叉积也==v^T,3个向量长度相等,Rn(v^T) = cosv^T + sin(n*v)
- Rn(v) = proj n(v) + Rn(v^T)
- 计算旋转矩阵:……需要根据上述公式推导旋转矩阵Rn(),包括单位矩阵,反对称矩阵等
- 计算了Rn(),可以通过控制n向量的方向,带入旋转矩阵的n(x,y,z)中,从而获得以x轴或y轴或z轴旋转的旋转矩阵
- 旋转矩阵的行向量都是规范正交的,则逆矩阵和转置矩阵相同
- //
- 放射变换
- 线性变换T(u) + 平移变换b
- 矩阵表示法:v(x.y,z) A(3*3) b(x,y,z)
- 对于顶点,引入了齐次坐标w,因为我们知道向量没有位置的概念,所以平移仅适用于点(x,y,z,1),而向量表示为(x,y,z,0)
- 如果引入w表示仿射变换:v(x.y,z) A(4*4)
- //
- 平移
- 恒等变换:直接返回输入参数的线性变换,
- 对于仿射变换中的T(u)就是恒等变换
- 我们可以直接用仿射变换表示旋转和缩放矩阵,方法使b=0
- 刚体变换:保形变换,保长性,保角性,可以用仿射变换表示
- //
- 复合变换:
- SRT:缩放旋转位移,注意顺序不能变
- //
- 向量坐标转换:
- 向量p位于标架A中,如何求出在标架B中对于的p坐标呢?
- 2D:如果知道pA(x,y),并且知道uv(即A的坐标系),在B标架中对应的坐标向量,则pB = xub + yvb,
- 这种推导:将p分解为xy的两个正交投影,分别*ub ,vb变换到B空间的向量方向(标量*向量 的方向为向量方向),这样p就可以由两个分量获得,两个正交投影向量的加法,为p向量
- 3D同理:pB = xub + yvb + zwb
- 点的坐标转换:
- 点和向量有区别,点有位置属性,必须考虑到它的位移
- pB = xub + yvb + zwb + Q(Q为uvw的原点,即需要相对于Q的点,+Q的偏移量)
DirectXMath库
- 包含向量,矩阵,变换……操作的API库,
- 略……