Unity3D图形基础笔记(1)

   1.坐标系

   (1).Unity 世界空间坐标系为左手系,Y正向向上的左手系。这一点在需要从3ds max里导入模型到Unity时需要注意,3ds max使用的是以Z正向朝上的右手系。根据坐标系手系和坐标基朝向的不同,可以很容易推导出所需要做的坐标变换。

   3DS Max -> Unity 的坐标变换为:绕着x轴旋转90度,直接使用四元数变换如下:

1 public Vector3 MaxToUnity(Vector3 v)
2 {
3     return Quaternion.Euler(90.0f,0.0f, 0.0f) * v ;
4 }

  根据旋转矩阵,可以得到一个更简单优化的版本,

  把90度代入左手系绕x轴旋转任意角度的旋转矩阵,可得到最终变换矩阵,形式如下:

  

 V = V0 * MatrixRotation = ( X0 ,-Z0 ,Y0 )

代码为

1 public Vector3 MaxToUnity(Vector3 v)
2 {
3      return new Vector3(v.x,-v.z  ,v.y);
4 }

相应的,把Unity坐标转换到Max坐标,可以简单实现如下

1 public Vector3 UnityToMax(Vector3 v)
2 {
3     return new Vector3(v.x,v.z,-v.y);
4 }

  (2).Unity的相机空间坐标系为右手系,即相机空间的基由(RightDirection,UpDirection,LookDirection)组成

  写到这儿的时候顺便吐槽一下Unity的相机实现---Unity的相机在IDE上可操控的Transform中不包含Eye‘s Position和LookAt,这种标新立异的做下让人在Unity里调相机的时候痛苦无比,想要精确定位相机时非常困难。虽然理论上来说相机空间仅包含平移和旋转,使用平移、旋转两个分量已经足够,但以往所加入LookAt点可以帮助美术在场景里迅速对焦。从完备和便捷性这一点上来说,Unity是还远不如人意的。

   使用传统的Eye‘s Position和LookAt计算Unity相机矩阵代码如下:   

 1 public static Matrix4x4 calcCameraMatrix(Vector3 eye, Vector3 lookat, Vector3 upDir)
 2         {
 3             Matrix4x4 mat = new Matrix4x4();
 4             Vector3 lookDir, rightDir;
 5             lookDir = (eye - lookat).normalized;
 6             upDir = Vector3.up;        
 7             rightDir = Vector3.Cross(upDir, lookDir);
 8             upDir = Vector3.Cross(lookDir, rightDir);
 9             mat.SetColumn(0, new Vector4(rightDir.x, rightDir.y, rightDir.z, 0.0f));
10             mat.SetColumn(1, new Vector4(upDir.x, upDir.y, upDir.z, 0.0f));
11             mat.SetColumn(2, new Vector4(lookDir.x, lookDir.y, lookDir.z, 0.0f));
12             mat.m30 = -Vector3.Dot(rightDir, eye);
13             mat.m31 = -Vector3.Dot(upDir, eye);
14             mat.m32 = -Vector3.Dot(lookDir, eye);
15             mat.m33 = 1.0f;
16         mat = mat.transpose;
17             return mat;
18         }      
View Code

  也可以简单的转换为Unity所使用的四元数和位置信息,代码如下: 

1 public static void lookatToTR(Vector3 eye ,Vector3 lookat, out Vector3 position ,out Quaternion rotation)
2 {
3     position = - eye;
4     rotation = Quaternion.LookRotation (eye - lookat);
5 }

   通过这样转换之后,之间在其它引擎既有的相机操作代码就可以简单移植过来了。

2. 雾效

   在没有特别说明的情况下,Unity在PC端实现的是像素雾,但在Mobile设备上则是顶点雾。这样超大面积三角形在使用默认的Mobile材质的时候会不受雾效影响,和周围场景会不协调。对应的处理方式为只能是把三角形切小,或自己实现相关材质在shader里自行计算雾效。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。