U3D数学图形基础

版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/blues1021。 https://blog.csdn.net/Blues1021/article/details/78162128
向量和矩阵,四元数,欧拉角:
U3D使用的是左手坐标系
基础数学类有:Vector3类,Vector4类等。在世界坐标系中 叉乘是按照左手坐标系进行的。
旋转方向也是按照左手定则规定的
Slerp插值函数:
transform.position = Vector3.Slerp(riseRelCenter, setRelCenter, fracComplete);//Slerp插值
U3D中的矩阵是行式矩阵,通常用Matrix4x4,矩阵的运算被封装到了Vector3,Quaternion类中,只有在Transform, camera, Material, GL等几个类中需要用到矩阵操作。
3D向量中引入w维称为齐次坐标系,(x,y,z,1)表示点,(x,y,z,0)表示向量,目的是方便统一变换处理,更好表示点和向量,w=0表示无穷远的点或向量。在一些shader中需要用到它。
Quaternion类,x,y,z,w 表示为:旋转角度的a/2, x,y,z是轴大小:
q = (sin a/2, nx cos a/2, ny cos a/2, nz cos a/2); 其中a是旋转角度,(nx, ny, nz)是所绕的旋转轴
tr.rotation是相对于世界坐标系的旋转四元数,tr.localRotation是相对于父坐标系的旋转四元素。

Quaternion.LookRotation得到朝着目标方向:
var relativePos = target.position - transform.position;//计算当前位置到目标位置的方向
var rotation = Quaternion.LookRotation(relativePos);//计算四元数
transform.rotation = rotation;
Quaternion.Slerp 在开始和目标之间旋转插值:
var fracComplete = (Time.time - startTime) / tranTime;//计算用于插值的系数
transform.rotation = Quaternion.Slerp (from.rotation, to.rotation, fracComplete);//平滑插值

坐标系:
1)World Space(世界坐标): 标准的D3D左手坐标系,旋转方向是左手法则包括法向量方向,背面剔除逆时针的。
2)view Space(视图坐标系):是标准的OGL右手坐标系 ,xy不变,-z向里,旋转方向是右手法则了,背面剔除顺时针的面。
3 )cull space (perspective space投影坐标系): 视图坐标系的放大 (结果是没有除以w之前的值) x'=x*xScale, y'=y*yScale,
z'=a*z + b=(z + zn)*zf / (zn-zf) z'是比原来的|z|小一点的正数。
4)ndc space, ViewPort Space(视口坐标):视口坐标是标准的和相对于相机的。相机的左下角为(0,0)点,右上角为(1,1)点,屏幕中心为[0.5,0.5],z值保留了透视投影中的正值但是值的大小是世界坐标系的值。不同于D3D中的[-1,-1,0]到[1,1,1],也不同于OGL中的[-1,-1,-1]到[1,1,1]。
5)Screen Space(屏幕坐标,鼠标坐标):以像素来定义的,以屏幕的左下角为(0,0)点,右上角为(Screen.width,Screen.height),  
z值保留了透视投影中的正值但是值的大小是世界坐标系的值 。注:鼠标位置坐标属于屏幕坐标,Input.mousePosition可以获得该位置坐标幕也为屏幕坐标,Input.GetTouch(0).position可以获得单个手指触摸屏幕坐标。 
 6)绘制GUI界面的坐标系:这个坐标系与屏幕坐标系相似,不同的是该坐标系以屏幕的左上角为(0,0)点,右下角为( Screen.width, Screen.height) 。 
 其它坐标系:LineRender坐标:以屏幕中心为原点,向上向右增加。 
UGUI设计坐标系和Unity屏幕坐标系是一致的,左下角为(0,0)右上角为(width,height)。

点和向量在世界坐标系中的在局部和世界转换函数为:
点:Transform.TransformPoint()从局部转换到世界,Transform.InverseTransformPoint()。
向量:Transform.TransformDirection()从局部转换到世界,Transform.InverseTransformDirection()。

坐标系之间转换用camera的函数实现。

图形渲染管线:
渲染处理光照计算如果是向前渲染,那么是在视图坐标系中进行,然后再投影裁剪。
顶点着色器和片断着色器通过顶点声明来传递数据,也可以通过shader在材质中暴露出来的参数进行设置得到。
光影向后渲染是在支持MRT前提下,最后对整个屏幕处理一次像素光照的计算。
后期屏幕特效是在全部drawcall渲染完毕的一帧中,对帧缓存图像利用FBO渲染到纹理进行二次处理。

猜你喜欢

转载自blog.csdn.net/Blues1021/article/details/78162128