一:坐标系
1.笛卡尔坐标系
2D坐标系都是‘’等价‘’的,无论原点在哪里,我们都可以通过平移将两个坐标系重合
3D坐标系则存在左手坐标系和右手坐标系的区别,两者通过平移无法完全重合,大拇指为X+, 为食指为Y+,中指为Z+,左右手可以分别描述左手坐标系和右手坐标系
2.常见的坐标系
(1)世界坐标系:描述所有物体的绝对位置的坐标系,即把所有的坐标统一到一个大的坐标系中
(2)物体坐标系:每个物体独立的坐标系,每个物体内部的部件用此坐标系计算简单直观
(3)摄像机坐标系:以摄像机位置为原点的坐标系,可以用来统一物体在摄像机空间下的计算
二:向量
1.表示
(1)向量表示方向,标量表示大小
(2)向量和点结合可以表示特定的位置,即通过将点沿向量方向平移确定位置
(3)一些特殊向量
0向量,各个分量都为0的向量,没有任何方向
2.向量的运算
(1)加减法
将向量的每个分量分别相加或者相减
几何解释,a+b表示将a,b向量首位相连得到的新向量
(2)乘法
点乘(内积):等于对应分量乘积的和,还等于向量大小相乘再乘以夹角的cos值,即结果是一个标量,描述了两个向量的相似程度,结果越大两个向量越接近
叉乘(外积):[x1,y1,z1]*[x2,y2,z2] = [y1z2-y2z1, z1x2-x1z2, x1y2-x2y1],叉乘的优先级高于点乘,运算结果仍然是一个向量,而且这个向量垂直于两个向量所在的平面,由此延伸,如果a,b两个向量互相垂直,那么和叉乘的结果组成的三个向量互相垂直,可以作为一组三维坐标
叉乘的方向确定:右手定则,aXb,四指从a到b,大拇指所指的方向就是结果向量的方向
叉乘的结果的大小:aXb = |a|*|b|*sinA,正好是以a,b向量为边的平行四边形的面积
(3)向量乘以标量等于把向量的每个分量分别乘以这个标量
(4)向量的模a(x,y)=sqrt(x*x+y*y),标准化(normalize)即用向量除以他的模
(5)自己实现向量类(实践)
三:矩阵
(1)概述:一个有r行c列的矩阵,可以这样理解,向量是标量的数组,而矩阵是向量的数组
(2)方阵:行数=列数的矩阵称作方阵,对角元素指的是行号和列号相同的元素,如果所有非对角元素都是0,那么则成为对角矩阵,单位矩阵是一种特殊的对角矩阵,对角元素均为1的对角矩阵是单位矩阵
(3)向量作为矩阵表示:1*n矩阵称为行向量,n*1称为列矩阵,可以说向量是一种特殊的矩阵
(4)矩阵的转置:将矩阵沿着对角线反折,转置可以使行向量变成列向量;特性:任意矩阵的转置的转置等于本身,任意对角矩阵的转置等于本身
(5)标量和矩阵相乘:用标量分别乘以矩阵中的每个元素
(6)矩阵乘法:
前提是a的列数等于b的行数,如果不匹配没有意义,
排列乘法,
不满足交换律(行列数可能都不匹配),
向量和矩阵相乘,等同于矩阵乘法,行向量左乘(行向量在左乘以一个矩阵)结果是行向量,列向量右乘矩阵结果是列向量;由此可以看到,向量标识三维中的点的话,可以通过矩阵对其进行变换,而保证得到的结果仍然是三维空间中的点
(7)矩阵的几何解释
几种变换:旋转,缩放,投影,镜像,仿射
四:矩阵和线性变换
(1)变换物体和坐标系
(2)旋转
(3)缩放
(4)正交投影和透视投影:前者的投影线相互垂直,后者投影线会相交
(5)镜像:沿任意轴的翻转
(6)切变:非均匀拉伸,X = X + sY,Y = Y
(7)组合变换:模型空间->世界空间->摄像机空间,三个矩阵通过矩阵乘法的结合律可以合并成一个矩阵
(8)变换的分类:
1.线性变换:F(a+b) = F(a)+F(b)
2.仿射变换:仿射变换指的是线性变换后接着平移,即任何线性变换都是仿射变换,但不是所有仿射变换都是线性变换
3.可逆变换:变幻的矩阵具有可逆矩阵,即矩阵是可逆的,则这个变换是可逆变换
4.等角变换:变换前后两个向量的大小和方向都不改变
5.正交变换:轴垂直不进行缩放变换
6.刚体变换:只改变物体的位置和方向,不包括长度,角度,面积,体积
(9)矩阵的行列式
1.行列式:右下-左上
2.矩阵积的行列式等于矩阵行列式的积|AB| = |A||B|;
3.矩阵转置的行列式等于原矩阵的行列式
4.矩阵的任意行或者列为0,那么他的行列式为0
5.交换矩阵的任意两行或者两列,行列式变为负
6.行列式的几何解释,行列式等于以基向量为两边的平行四边形的有符号面积
(10)矩阵的逆
1.矩阵的逆乘以矩阵结果是单位矩阵
2.单位矩阵的逆是他本身
3.矩阵转置的逆等于他逆的转置
4.矩阵乘积的逆等于矩阵的逆的相反顺序的乘积
5.用途,进行逆变换或者撤销原变换
(11)正交矩阵
1.矩阵乘以他的转置矩阵等于单位矩阵,即矩阵的转置矩阵等于他的逆矩阵,这样可以在计算时通过直接用逆矩阵代替转置矩阵来简化计算
2.若一个矩阵是正交的那么它应该满足:矩阵的每一行都是单位向量,矩阵的所有行互相垂直
(12)4*4齐次矩阵
3*3矩阵表示的是线性变换,不包含平移,4*4矩阵能表示平移,4D中w分量能够开关4*4矩阵的平移部分
五:方位和角位移
1.矩阵形式
优点:1.可以立即对向量进行旋转
2.矩阵的形式被api利用,也就是矩阵可以直接拿来计算,而其他的形式则要转化成矩阵
3.多个角位移连接直接将矩阵连接
4.矩阵的逆,因为旋转矩阵是正交的,所以求逆只是求转置,简化计算
缺点:1.内存占用大,一个矩阵需要保存16个浮点数
2.不直观,直接观察一个矩阵并不能知道他进行了什么角度变换
3.矩阵可能是病态的,矩阵中的元素并不一定都是有用的
2.欧拉角
欧拉角是将角位移分解为绕三个互相垂直轴的三个旋转序列(万向锁是一个底层问题,至今没有解决方案)
优点:1.对于我们来说很直观,很容易使用
2.表达简洁,占用内存小
3.任意三个数都是合法的
缺点:1.给定方位的表达方式不唯一
2.两个角度求插值非常困难(0和360,720都是一个角度)
3.四元数
一个标量+一个3D向量分量
Quaternion camPosRotation = Quaternion.Euler(rotY, rotX, 0);,将一个三维的rotation转化成一个四元数,
_CameraTrans.position = camPosRotation * PcCameraDis然后左乘一个三维的向量 可以实现对三维向量的旋转,而三维的rotation是不能直接相乘进行旋转的。
优点:1.平滑插值,其他方法不容易平滑插值
2.快速连接和角位移求逆,四元数叉乘能将角位移序列转换为单个角位移
3.能和矩阵形式快速转换
4.仅用四个数表示,比较高效
缺点:1.比欧拉角稍微大一点
2.四元数可能不合法(可以通过标准化四元数来解决)
3.难以使用
4.各方法比较
1.欧拉角最容易使用和被人使用
2.如果在坐标系之间转换向量,选择矩阵形式
3.需要大量保存数据时使用四元数或者欧拉角,节省内存占用
4.平滑的插值只能使用四元数来完成,如果用其他形式则需要先转换到四元数