Unity Shader 所需要的数学基础浅讲

       这篇文章是给想做3D游戏的同学们一个基础的数学性讲解,内容也是一年之前做的一篇PPT的内容。也不光是Shader中所能用到的

过于基础的我就不讲了,比如向量加减,矩阵的加减乘等基本运算。笛卡尔坐标系(左右手坐标系)(可以先搞明白这些再看)     

向量篇:

重要的有这几个

点乘(点积):

a·b=|a|·|b|cos<a,b>     float c = Vector3.Dot (a, b);

|a|和|b|表示向量的模<a,b>表示两个向量的夹角。<a,b>和<b,a> 夹角是不分顺序的。通过点积可以计算两个向量的夹角,这便是点乘的价值所在。如果两个向量a,b均 为单位 向量 ,那么a·b等于向量b在向量a方向上的投影的长度。

叉乘(叉积):

c =a x b    Vector3 c = Vector3.Cross (a, b);

其中a,b,c均为向量。即两个向量的叉积得到的还是向量!

性质1:c⊥a,c⊥b,即向量c垂直与向量a,b所在的平面。

性质2:模长|c|=|a||b|sin<a,b>

性质3:满足右手法则。从这点我们有axb ≠ bxa,而axb = – bxa。所以我们可以使用叉积的正负值来判断向量a,b的相对位置,即向量b是处于向量a的顺时针方向还是逆时针方向。

总的来说点乘得到角度叉乘得到法线。

坐标系篇:

左右手坐标系不做细说,每个引擎都会有自己的坐标系法则,这里简单的说明一下Unity中的坐标系转换,Unity的坐标转化其实已经封装的很充分了,不需要你再去矩阵之间乘来乘去了:

说一下这个几个坐标系之间的转换

首先Unity有四种坐标系 1WorldSpace 世界的绝对坐标,transform.position可以获得该位置坐标。LocalSpace 本地坐标(通常以模型自身锚点为准)transform.localposition可以获得该位置坐标

2 Screen Space (屏幕坐标):以像素来定义的,以屏幕的左下角(0,0)点,右上角为(Screen.Width,Screen.height),Z的位置是以相机的世界单位来衡量的。注:鼠标位置坐标属于屏幕坐标,Input.mousePosition可获得该位置坐标,手指触摸屏幕坐标,Input.GetTouch(0).postion可获得单个手指触摸屏幕坐标

Screen.width = Camera.pixelWidth  Screen.height = Camera.pixelHeigth

3 ViewPort Space(视口坐标):视口坐标是标准的和相对于相机的。相机的左下角为(0,0)点,右上角为(1,1)Zdenka位置是以相机的世界单位来衡量的。

4.绘制GUI界面的坐标系:这个坐标系与屏幕坐标系相似,不同的是该坐标系以屏幕的左上角为(0,0)点,右下角为(Screen.width,Screen.height);

四种坐标系的转换

1、世界坐标→屏幕坐标:camera.WorldToScreenPoint(transform.position);这样可以将世界坐标转换为屏幕坐标。其中camera为场景中的camera对象。

2、屏幕坐标→视口坐标:camera.ScreenToViewportPoint(Input.GetTouch(0).position);这样可以将屏幕坐标转换为视口坐标。其中camera为场景中的camera对象。

3、视口坐标→屏幕坐标:camera.ViewportToScreenPoint();

4、视口坐标→世界坐标:camera.ViewportToWorldPoint();

下面讲下矩阵:

为什么要将矩阵呢那是因为描述一个三维的物体通常使用的是矩阵的边换来操作的,矩阵的变换指的是我们把一些数据,如点,方向矢量甚至是颜色等,通过某种方式进行转换的过程。在计算机图形学领域,变换非常重要。尽管通过变换我们能够进行的操作是有限的,但是这些操作已经足以支持我们工作了。

线性变换是一种非常常见的变换类型,物体的缩放旋转可以通过一个三维的矢量进行变换,那么仅仅用3x3的矩阵就可以表示所有的线性变换。线性变换还包括了错切,镜像,正交投影等,但是仅仅线性变换是不够的。物体的平移就不是一个线性变换,它既不满足标量乘法,也不满足矢量加法,因此,我们不能用一个3x3的矩阵来表示一个平移变换,这样就有了仿射变换。仿射变换就是合并线性变换和平移变换的类型,可以使用一个4x4的矩阵来表示,这就是齐次坐标空间:

这个基础变换矩阵我们可以分解4个部分左上角的矩阵M3x3表示旋转和缩放,t3x1用于表示平移,01x3是零矩阵,右下角的元素就是标量1。

接下来是如何用这样一个矩阵来表示平移旋转缩放

平移:

缩放:

绕x轴旋转:

绕y轴旋转

绕z轴旋转

当然矩阵的变换是有有顺序的,先缩放,再旋转,最后平移,至于为什么可以使用矩阵变换自己求证一下,由于我们经常用的是列矩阵因此阅读顺序是从右向左。

至于下一篇我会一起推导下 View Matrix 如何推导的,了解如何将世界坐标点如何对应到屏幕坐标的,以及BillBoard的如何制作。

你可能感兴趣的:(Unity Shader 所需要的数学基础浅讲)