來自https://www.cnblogs.com/JLZT1223/p/6086191.html
1、
總的來說繪制平面的思想十分簡單,就是將需要的平面拆分成幾個三角形然后進行繪制就可以啦,主要的思路就在於三角形的拆分。如果說一個平面有7個頂點,我們把它們分別編號0到6,拆分情況如圖所示:
即:如果用n來表示頂點的個數,那么在同一個平面內,可以分割的三角形個數是:n-2;
2、
在這里,我們選擇應用Mesh Filter組件來進行繪制,Mesh Filter組件里的Mesh屬性就是我們這次主要操作的對象,在這里,我們用到:
mesh.vertices數組 和 mesh.triangles數組,第一個是vector3的數組,第二個是int的數組。
其中mesh.vertices存儲的就是平面的頂點信息,對應上圖就是0到6號這六個點的坐標。
mesh.triangles存儲的是平面繪制時,繪制三角形的頂點順序,對應上圖應該是:
061 651 521 542 432(順時針)
每三個一組代表一個三角形,但是大家在這里要注意一下,就是最終繪制出的小三角形是單向圖,就是一面可以看到,另一面是看不到的,所以,為了保證所有的小三角形朝向一至,要對mesh.triangles數組在進行調整,調整結果如下:
016 156 125 245 234(逆時針)
就是保證小三角形頂點都是按順時針或者逆時針讀取~大家想想就明白了~
故:基本算法思想就是:
入口參數:vector3[] vertices,儲存平面定點信息,頂點需按順序儲存
算法思想:從數組首尾向中間遍歷,生成triangles頂點ID數組(下列代碼中注釋的部分)
步驟:
1、創建一個empty 的gameobject;
2、添加一個腳本給這個game object;
算法實現代碼如下:
using UnityEngine; using System.Collections; [RequireComponent(typeof(MeshRenderer), typeof(MeshFilter))] public class quad : MonoBehaviour { /* creat a triangle by using Mesh 2016/11/21 ————Carl */ void Start() { creatPolygon(); } private void creatPolygon() { /* 1. 頂點,三角形,法線,uv坐標, 絕對必要的部分只有頂點和三角形。 如果模型中不需要場景中的光照,那么就不需要法線。如果模型不需要貼材質,那么就不需要UV */ Vector3[] vertices = { new Vector3 (2f,0,0), new Vector3(4f, 0, 0), new Vector3(6f, 0, 0), new Vector3(10f, 0, 0), new Vector3(10f, 20f, 0), new Vector3(6f,10f, 0), new Vector3(4f, 4f, 0) }; Vector3[] normals = { Vector3.up, Vector3.up, Vector3.up, Vector3.up, Vector3.up, Vector3.up, Vector3.up }; Vector2[] uv = { Vector2.zero, -Vector2.left, Vector2.one, Vector2.right, Vector2.zero, -Vector2.left, Vector2.one }; /*2. 三角形,頂點索引: 三角形是由3個整數確定的,各個整數就是角的頂點的index。 各個三角形的頂點的順序通常由下往上數, 可以是順時針也可以是逆時針,這通常取決於我們從哪個方向看三角形。 通常,當mesh渲染時,"逆時針" 的面會被擋掉。 我們希望保證順時針的面與法線的主向一致 */ int[] indices = new int[15]; indices[0] = 0; indices[1] = 6; indices[2] = 1; indices[3] = 6; indices[4] = 2; indices[5] = 1; indices[6] =6; indices[7] = 5; indices[8] = 2; indices[9] = 5; indices[10] = 4; indices[11] = 2; indices[12] = 4; indices[13] = 3; indices[14] = 2; //int numberOfTriangles = vertices.Length - 2;//三角形的數量等於頂點數減2 //int[] indices = new int[numberOfTriangles * 3];//triangles數組大小等於三角形數量乘3 此時是15 //int f = 0, b = vertices.Length - 1;//f記錄前半部分遍歷位置,b記錄后半部分遍歷位置 即0-7 //for (int i = 1; i <= numberOfTriangles; i++)//每次給 triangles數組中的三個元素賦值,共賦值 //{ //numberOfTriangles次 // if (i % 2 == 1) // { // indices[3 * i - 3] = f++; // indices[3 * i - 2] = f; // indices[3 * i - 1] = b;//正向賦值,對於i=1賦值為:0,1,2 // } // else // { // indices[3 * i - 1] = b--; // indices[3 * i - 2] = b; // indices[3 * i - 3] = f;//逆向賦值,對於i=2賦值為:1,5,6 // } Mesh mesh = new Mesh(); mesh.vertices = vertices; mesh.normals = normals; mesh.uv = uv; mesh.triangles = indices; MeshFilter meshfilter = this.gameObject.GetComponent<MeshFilter>(); meshfilter.mesh = mesh; } }
效果圖: