(Cube的)UV映射
这篇文章将会带你了解如何将2D图片映射到3D物体表面

简单的说UV就是2D坐标,3D应用程序(这里就是Unity3D)会将这些二维坐标映射到模型身上的贴图中去。之所以选用字母U和V,是因为XYZ已经被用于表示3D空间中物体的轴向了。U坐标代表2D贴图的横轴,V表示纵轴。下图是一张展开的骰子图,上面的数字就是UV坐标。
通常,UV映射是由3D工具完成,手动的完成这项工作是极其困难的,所以,我选择了一个顶点较少的立方体作为示例,下图中有一个展开的立方体,其中0-13的数字是顶点索引。
mesh包含了一个称之为UV数组的Vector2类型的数组,UV数组的大小必须和顶点数组等大(例子中的cube是14)。每个三角形中的箭头表示逆时针的绕线顺序,这是因为我们正在观察立方体的内部,从外部是看不到的,需要注意的是,Unity3D使用的是顺时针的绕线顺序来确定正面三角形的

下面的代码展示了如何声明顶点,三角形和UV,使用这些代码,Unity3D可以将展开一张展开的骰子贴图渲染到立方体网格的表面:
using UnityEngine;
using System.Collections;
[RequireComponent(typeof (MeshFilter))]
[RequireComponent(typeof (MeshRenderer))]
public class UVMapping : MonoBehaviour {
void Start () {
float size = 1f;
Vector3[] vertices = {
new Vector3(0, size, 0),
new Vector3(0, 0, 0),
new Vector3(size, size, 0),
new Vector3(size, 0, 0),
new Vector3(0, 0, size),
new Vector3(size, 0, size),
new Vector3(0, size, size),
new Vector3(size, size, size),
new Vector3(0, size, 0),
new Vector3(size, size, 0),
new Vector3(0, size, 0),
new Vector3(0, size, size),
new Vector3(size, size, 0),
new Vector3(size, size, size),
};
int[] triangles = {
0, 2, 1, // front
1, 2, 3,
4, 5, 6, // back
5, 7, 6,
6, 7, 8, //top
7, 9 ,8,
1, 3, 4, //bottom
3, 5, 4,
1, 11,10,// left
1, 4, 11,
3, 12, 5,//right
5, 12, 13
};
Vector2[] uvs = {
new Vector2(0, 0.66f),
new Vector2(0.25f, 0.66f),
new Vector2(0, 0.33f),
new Vector2(0.25f, 0.33f),
new Vector2(0.5f, 0.66f),
new Vector2(0.5f, 0.33f),
new Vector2(0.75f, 0.66f),
new Vector2(0.75f, 0.33f),
new Vector2(1, 0.66f),
new Vector2(1, 0.33f),
new Vector2(0.25f, 1),
new Vector2(0.5f, 1),
new Vector2(0.25f, 0),
new Vector2(0.5f, 0),
};
Mesh mesh = GetComponent<MeshFilter> ().mesh;
mesh.Clear ();
mesh.vertices = vertices;
mesh.triangles = triangles;
mesh.uv = uvs;
mesh.Optimize ();
mesh.RecalculateNormals ();
}
}