這片文章其實是綜合了我之前看過的幾篇文章,然後彙總了一下。參看文章貼在文末。涉獵到相關的內容是之前學習換裝的時候,作者將skinmeshrenderer中的mesh數據顯示到了ui上,從而實現了在UI上顯示模型的需求。
Unity中想要顯示一個3D模式,必須要知道該模式的形狀,這個形狀其實就是mesh數據。有了mesh數據後,再通過Mesh Filter組件將mesh數據發送給Mesh Renderer組件進行渲染。Mesh Filter組件不一定每個gameObject對象都有,但是Mesh Rnderer組件是一定有的。那麼我們就可以自定義mesh的數據,然後掛上一個Mesh Renderer組件從而渲染出我們想要的效果。
Mesh:是指模型的網格,建模就是建網格。細看Mesh,可以知道Mesh的主要屬性內容包括頂點座標,法線,紋理座標,三角形繪製序列等其他有用屬性和功能。因此建網格,就是畫三角形;畫三角形就是定位三個點。
下面是一個cube的mesh,可以看到,每個面有兩個三角形。6個面一個12個三角形。每個面是4個頂點座標,6個面一共24個
頂點座標 。注意,這裏的頂點座標和我們通常理解的正方體頂點(8個)是不一樣的。可能的原因是,每個面的渲染都需要單獨記錄4個頂點,然後就24的頂點了。。。
自定義渲染一個mesh,只需要制定頂點數據,由頂點構成的三角形序列,最後還要指定uv數據。
public void InitMesh()
{
// 指定頂點數據
_mesh.vertices = new Vector3[4]{
new Vector3(-1, -1, 0),
new Vector3(1, -1, 0),
new Vector3(-1, 1, 0),
new Vector3(1, 1, 0),
};
// 通過頂點爲網格創建三角形。頂點必須要順時針存放!!!!!
int[] triangles = new int[6]{0, 3,1, 0, 2, 3};
_mesh.triangles = triangles;
// 指定uv座標
_mesh.uv = new Vector2[4]{
new Vector2(0.5f, 0),
new Vector2(1, 0),
new Vector2(0.5f, 0.5f),
new Vector2(1, 0.5f),
};
}
這裏指定了4個在同一個平面的頂點數據。然後從任意一個頂點開始,順時針指定兩個三角形序列。最後指定uv座標數據。如下圖所示:
兩個三角形,按照順時針方向,排好頂點即可。
uv數據是指的將貼圖座標投影到模型的mesh表面。它定義了貼圖上每個點的位置的信息.,這些點與3D模型是相互聯繫的, 以決定表面紋理貼圖的位置。UV就是將圖像上每一個點精確對應到模型物體的表面.,在點與點之間的間隙位置由軟件進行圖像光滑插值處理, 這就是所謂的UV貼圖.。
下面看下在android平臺下Opengl紋理系統座標,左下角爲原點。
我們現在討論怎樣使用這些紋理座標。當我們指定頂點數組中的頂點時,我們需要在另一個數組中提供紋理座標,它稱爲紋理座標數組。這裏需要注意定義座標數組順序,這很關鍵。
如果,uv順序的指定,相對於貼圖來說,是一個倒“Z”的順序。 我的實驗代碼中,就是取的貼圖的右下角一部分。
最後,將mesh對象指定給MeshFilter組件即可顯示該自定義的mesh了。
參考文章:
1、《uv紋理座標設定與貼圖規則》
2、《Unity裏的Mesh屬性》