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 饱和度

Unity中的3D数学和渲染相关推荐

  1. Unity中的3D数学—02向量与矩阵

    1.向量 1.1 向量的运算 运算 公式 矢量和标量的乘/除法 k v = ( k v x , k v y , k v z ) k\mathbf{v}=(kv_x,kv_y,kv_z) kv=(kvx ...

  2. Unity 中的 3D 数学学习笔记——认识坐标系及坐标系之间的转换

    一 :3d空间坐标系  x,y,z 轴 z轴方向确定有两种方式 左手坐标系和右手坐标系 左手坐标系:伸开左手,大拇指指向X轴正方向,食指指向Y轴正方向,其他三个手指指向Z轴正方向. 右手坐标系:伸开右 ...

  3. Unity基础01——3D数学

    1.数学计算公共类Mathf 1.Mathf和Math Math是C#中封装好的用于数学计算的工具类--位于system命名空间中 Mathf是Unity中封装好的用于数学计算的工具结构体--位于Un ...

  4. 在Unity中创建3D直升机游戏

    In this lecture from Colton Ogden, you can learn game development principles by coding a Helicopter ...

  5. Unity中实现3D人物残影效果

    一:效果演示 二:思路 --使用SkinnedMeshRenderer类中的BakeMesh方法去复制出新的Mesh --再使用Graphics.DrawMesh绘制会Mesh 三:核心代码实现 -- ...

  6. unity中实现ue眼球的渲染

    此图取至ue官方网站 在shader里面我们还是需要使用英文,中英文对照: 巩膜:sclera 角膜缘:limbus 虹膜:iris 瞳孔:pupil 角膜:cornea 渲染效果. 模型方面: 使用 ...

  7. unity中实现3d物体的颜色随时间渐渐消失

    实现的原理就是修改material的color属性的Alpha值,通过把值逐渐变为0来达到消失 注意:这种方法只对部分shader有作用,我用的是 下面是代码: using System.Collec ...

  8. 【Unity3D】使用 FBX 格式的外部模型 ( 向 Unity 中添加 FBX 模型 | 向 Scene 场景中添加 FBX 模型 | 3D 物体渲染 | 3D 物体材质设置 )

    文章目录 一.向 Unity 中添加 FBX 模型 二.向 Scene 场景中添加 FBX 模型 三.3D 物体渲染 四.3D 物体材质设置 一.向 Unity 中添加 FBX 模型 Unity 中使 ...

  9. Unity中动画切换

    在unity中,3D模型的切换可以使用animator状态机或者代码切换Animator.CrossFade切换函数 使用状态机切换 需要连接各个动画的逻辑关系,并且添加切换参数,设置退出时间,调整切 ...

  10. 将Uity中的3D场景导入Laya并在Chrome浏览器中显示

    本文将实现将Unity中的3D场景通过插件导出到Laya2.0,并在Chrome中显示出来 1:将3D场景需要的模型导入Unity,并将LayaAir插件导入 插件下载地址https://ldc2.l ...

最新文章

  1. C++ 三五法则,看看你能不能理解
  2. oracle 11所选安装,在red hat enterprise linux 5.4上安装oracle11g
  3. Java8学习之旅2---基于Lambda的JDBC编程
  4. 省AK赛——J - Happy Great BG
  5. 怎么用python算单价和总价_用python计算最高投标限价
  6. Linux虚拟内存管理 | 虚拟地址与物理地址映射、段错误SIGSEGV
  7. 微信小程序 canvas 绘图问题
  8. [转载] python模板字符串和格式化字符串
  9. WinForm 实例教程 通讯录 视频教程 入门教程
  10. anaconda 安装包 超时_vs2010nuget安装包时 操作超时
  11. eplan图纸怎么发给别人_如何保护你的EPLAN图纸
  12. 对于长沙互联网发展,一个外来两年Java程序员的所见所感所愿
  13. Gauss-Seidel迭代法解线性方程组
  14. 碱性溶液中HER动力学分析
  15. CentOS7+VMware 14的安装教程
  16. CNN模型之DenseNet总结
  17. python3 模拟 ajax post请求
  18. offsetLeft与style.left区别
  19. Java文件/文件夹 加密解密工具(Swing版)
  20. 树莓派3B+配置WiFi(基于raspbian系统)

热门文章

  1. c# dataset 和DataGridView的绑定详细
  2. php实现支付宝对账单打通
  3. 猪八戒让网赚国人再也不用看外国人…
  4. 解决出租屋网络故障的步骤及最佳组网方案
  5. python音乐播放器以及美观化_Python3.4的标准库
  6. 为什么python叫爬虫_python为什么叫爬虫
  7. xingtai -斗罗大陆图片下载
  8. 荒野大镖客2显示服务器离线,《荒野大镖客2》PC版进入离线模式方法
  9. java基础,鼠标拖动拼图_使用UGUI实现拖拽功能(拼图小游戏)
  10. 危机四伏,卡士酸奶的高端人设还立得住吗?