Unity中的3D数学和渲染

3D数学的应用:图形学、游戏、虚拟现实和动画等

坐标系:
 1D:是数轴,是一条规定了原点、方向和单位长度的直线。关于计数和度量的数学。数轴是个一维的图。
 2D:是笛卡尔坐标系
 3D:是空间直角坐标系,三维坐标系,三个轴互相垂直

平面放射性坐标系: 相交于原点的两条数轴,构成了平面放射性坐标系
笛卡尔坐标系:如果两条数轴上的度量单位相等,则称此放射性坐标系为笛卡尔坐标系
笛卡尔直角坐标系: 数轴互相垂直的笛卡尔坐标系称为笛卡直角坐标系
笛卡尔斜角坐标系: 数轴不垂直的笛卡尔坐标系称为笛卡斜角坐标系

两条直线确定一个平面的条件是:两条直线平行或相交

在3D中,我们用(x,y,z)来表示一个点。坐标的每个分量分别代表了该点到yz,xz,xy平面的有符号距离

z轴方向的确定有2种方式:左手坐标系与右手坐标系 //因为X轴和Y轴的方向是固定的,不会改变的(向右和向上为正)
 左手坐标系 : Unity中的世界坐标系、Direct3D
 右手坐标系 : 笛卡尔坐标系、OpenGL、 3D Max,   Maya是基于OpenGL开发的

两个坐标系,还有一个不同点就是旋转:左手坐标系以顺时针为正方向,而右手坐标系以逆时针为正方向
 //(除大姆指向的)四指的握紧方向为旋转方向

Unity中的几种坐标系: //因为在不同的情况下使用不同的坐标系更加方便
  1.全局坐标系(World Coordinate System) :原点在(0,0,0)
  2.局部坐标系(Local Coordinate System) : 原点会发生变化的
  3.屏幕坐标系(Screen Space)  : 屏幕上的二维坐标系,以像素来定义的,左下角(0,0),右上角(Screen.width,Screen.height);z轴的坐标是相机的世界坐标中z轴的负值(坐标转换时用到).
      鼠标位置坐标属于屏幕坐标,Input.mousePosition
     手指触摸屏幕也为屏幕坐标:Input.GetTouch(0).position
  4.视口坐标系(ViewPort Space): 就是屏幕坐标系的单位化,左下角(0,0),右上角(1,1),z轴的坐标是相机的世界坐标中z轴的负值

 全局坐标系:trasporm.position得到的就是物体的全局坐标,与它有没有父物体和父物体的位置和旋转都没有关系的。 
 局部坐标系:transform.localPosition,也称为模型坐标系或物体坐标系。Unity检视视图中显示的为localPosition的值
           每个物体都有自身独立的物体坐标系;当物体移动或改变方向时,和该物体相关联的坐标系也将随之移动或改变方向。
           移动父物体时,局部坐标是不会改变的
           模型Mesh保存的顶点坐标均为局部坐标系下的坐标,所以是不会发生变化的。
 屏幕坐标:建立在屏幕上的二维坐标系。以像素来定义的,屏幕的左下角为(0,0),右上角为(Screen.width, Screen.height),z轴的坐标是相机的世界坐标中z轴坐标的负值(一般是0,因为在游戏物体从世界坐标投影到屏幕坐标时才考虑z值)。就是Game视图的窗囗大小
         鼠标位置坐标属于屏幕坐标,通过Input.mousePosition可以获得该位置的坐标。
         手指触摸屏幕也为屏幕坐标,Input.GetTouch(0).position可以获得单个手指触摸屏幕时手指的坐标
 视口坐标系: 将Game视图的屏幕坐标系单位化,左下角(0,0),右上角(1,1)。z轴的坐标是相机的世界坐标中z轴坐标的负值。
         应用:控制某个点在屏幕内,通过在视囗坐标系中的值<=1来判断

全局坐标系和局部坐标系, 转换:
 transform.Translate(translation:Vector3, relativeTo: Space = Space.Self); //移动
 没着translation的方向移动|translation|的距离,其结果应用到relativeTo坐标系中。不改变坐标点的位置,只是让它从一个局部坐标系转换成世界坐标系,坐标的数值/表示发生变化: 
 transform.TransformPoint(Vector3 position) : 将一个坐标点从局部坐标系转换到全局坐标系。
   //注:返回值受scale缩放影响
 transform.InverseTransformPoint(Vector3 position):将坐标点从全局坐标系转换到局部坐标系
 tansform.TransformDirection(Vector3 direction):将一个方向从局部坐标系转换到全局坐标系。
 transform.InverseTransformDirection(Vector3 direction):将一个方向从全局坐标系转换到局部坐标系。
 transform.TransformVector(Vector3 vector):将一个向量从局部坐标系转换到全局坐标系。
 transform.InverseTransformVector(Vector3 vector):将一个向量从全局坐标系转换到局部坐标系。
 Transform.forward, Transform.right, Transform.up:当前物体的物体坐标系的z轴,x轴,y轴在世界坐标系上的指向。
Vector3.forward ,(0,0,1)的缩写,是世界坐标的
使用区别:
 transform.forward :获取的是自身坐标系的z轴在世界坐标系中的(归一化后的)方向
    transform.Translate(transform.forward * Time.deltaTime, Space.Self); //还要加上旋转的角度到自身坐标系下
    transform.Translate(transform.forward * Time.deltaTime, Space.World); //不需要加上旋转到自身坐标系下

 Vector.forward : (0,0,1)的简写,在世界坐标系下的。
    transform.Translate(Vector3.forward * Time.deltaTime, Space.Self); //沿自身坐标系的z轴移动
    transform.Translate(Vector3.forward * Time.deltaTime, Space.World); //沿世界坐标系的z轴移动

 屏幕坐标系与全局坐标系, 转换:
   Camera.ScreenToWorldPoint(Vector3 position): 将屏幕坐标转换为全局坐标。
   Camera.WorldToScreenPoint(Vector3 position):将全局坐标转换为屏幕坐标。

 屏幕坐标系与视口坐标系, 转换:
   Camera.ScreenToViewportPoint(Vector3 position):将屏幕坐标转换为视口坐标。
   Camera.ViewportToScreenPoint(Vector3 position):将视口坐标转换为屏幕坐标。

向量 :在数学中,向量(也称为矢量),是指具有大小和方向的量。
     向量的大小就是向量的长度,也叫做模。向量的方向描述了空间中向量的指向

向量与点的区别:
  点: 点中的xyz表示的是到每个维度的距离
  向量:向量中的数xyz,表示了向量在每个维度上的有向位移

Unity中的点和向量:都使用 Vector2/Vector3来表示
  Transform.position表示一个点,即游戏物体在世界坐标系中的点。
  Transform.forward表示一个向量,即当前物体的物体坐标系的z轴在世界坐标系上的指向。
  在Unity中,点和向量都是以(x,y,z)的形式表示

零向量 : 是非常特殊的一个向量,它是唯一一个大小为0的向量,也是唯一一个没有方向的向量。
        2D零向量表示为(0,0),3D零向量表示为(0,0,0)。
        在Unity中,用Vector3.zero来表示3D零向量。
负向量 : 每个向量都有一个负向量,
        满足条件:一个向量和它的负向量相加等于零向量。
        向量变负,将得到一个和原向量大小相等,方向相反的向量。
3D向量的长度:
在Unity中,可以通过Vector3.magnitude计算向量的长度。Vector3.sqrMagnitude则返回向量长度的平方。
Vector3.Distance(A,B)可以计算2个点A,B之间的距离,即返回向量AB或向量BA的长度。等同于(B-A).magnitude或(A-B).magnitude。

3D向量与标量相乘:3(1,2,3) = (3,6,9)
向量与非零标量的除法,即乘以该标量的倒数。
3D向量与标量相除:
Unity中使用运算符*来计算与标量的乘法,用运算符/来计算与标量的除法

向量归一化:
   Vector.Normalize(),把向量归一化,改变原有向量
   Vector3.normalized,返回归一化的向量,原来向量不改变

单位矩阵:对角元素都为1的对象矩阵
   性质:用做生意一个矩阵乘以单位矩阵,都得到原矩阵
   在Unity中,可以通过Matrix4x4.identity来获得一个4×4的单位矩阵。
   在Unity中,可以通过Matrix4x4.isIdentity来判断一个矩阵是不是单位矩阵。
   在Unity中,可以通过Matrix4x4.zero获得一个4×4的所有元素都为0的矩阵
转置矩阵:行和列换过来,矩阵A的转置矩阵用AT(T右上角);沿对角线翻折。
   Unity中, Matrix4x4.transpose来获取一个矩阵的转置矩阵 
逆矩阵:满足AB=I, 只有方块矩阵才可能有逆矩阵
   性质:有逆矩阵,说矩阵可逆,或说非奇异的
   A的逆矩阵A-1(-1为右上角);它的行列式表示为|A|,或detA
   判断一个矩阵是否可逆,计算它的行列式是否不为0(不为0就是可逆)
      计算方法:对角线相乘相减(左上右下为主对角线)
      行列式的表示:det

      三阶行列式的计算方法:按某一行或某一列展开成无素与对应的代数余子式的乘积之和(正负交替,周围都是)
   逆矩阵的求解:A-1 = 1/|A|[....];  Unity中使用Matrix4x4.Inverse(matrix)


变换:  
 齐次坐标:n维->n+1维, 用来明确区分向量和点,同时也更易用于进行仿射几何变换
   空间直角坐标系、基向量
   点的齐次坐标表示:(x,y,z,1)
   向量的齐次坐标表示:(x,y,z,0)
   所以,我们可以用齐次坐标去进行点和向量之间的运算:
     点与点之间的减法,可以的到一个向量。
     向量和向量之间的加减,还是得到一个向量。
     点和向量之间的加法,可以得到一个移动了向量距离之后的点。

 线性变换:从代数上,是指可以保留矢量加和标量乘的变换。需要满足下面的2个条件。
      T(v+u)=T(u)+T(v)
      T(sv)=sT(v)
   从几何的角度上去理解,需要满足:
    (1)变换前是直线的,变换后依然是直线。
    (2)直线比例保持不变。
    (3)变换前是原点的,变换后依然是原点
 
 仿射变换 = 线性变换+平移。
    从几何的角度上去理解,需要满足上述(1),(2)即可

 结论:旋转和缩放属于线性变换,但是平移不属于线性变换。
      平移、旋转、缩放都属于仿射变换。

 仿射变换可以用矩阵和向量相乘的方式来表示:4x4矩阵 * 4x1列向量
 应用:计算一个点或者一个向量,经过平移、旋转、缩放等仿射变换后的值:
      4x4矩阵就是变换矩阵,4x1列向量就是点或向量
      变换矩阵最后一行是001/0001
   
 2D平移变换:平移矩阵
 2D缩放:缩放矩阵
 2D旋转矩阵:
     cos  -sin  0
     sin   cos  0
      0     0   1
 三种矩阵的逆矩阵:平移-tx -ty, 缩放1/tx 1/ty, 旋转如下:
     cos   sin  0
     -sin  cos  0
      0     0   1
 物体变换和坐标系变换: Fc => FMc=F(Mc)=(FM)c
 复合变换:我们可以把平移、旋转、缩放结合起来,形成一个复杂的变换过程。
   规律:(矩阵乘法不满足交换律,)所以不同的变换顺序得到的结果可能是不一样的。
        矩阵乘法:满足结合律,但不满足交换律,所以
        (FM)c=F(Mc)
        但 FRTc != FTRc
 3D变换,旋转绕y轴转方向相反
 Unity中的变换:rotate传的是Quaternion,要先通过Quaternion.Euler()构建
     另外的API看Matrix4x4, RTS,Translate,Scale
 

渲染:

Unity_渲染_灯光_前向渲染_乱码的博客的博客-CSDN博客_unity像素渲染

unity渲染篇:画面亮度、饱和度、对比度调整_unity大话东游的博客-CSDN博客_unity 饱和度

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值