凡客軟件網(wǎng)站關(guān)鍵詞免費優(yōu)化
序
詳見官方文檔:Unity - Manual: Mesh data (unity3d.com)
Topology:拓?fù)浣Y(jié)構(gòu)
翻譯:
拓?fù)涿枋鼍W(wǎng)格具有的面類型。
網(wǎng)格的拓?fù)涠x了索引緩沖區(qū)的結(jié)構(gòu),索引緩沖區(qū)又描述了頂點位置如何組合成面。每種類型的拓?fù)涠际褂盟饕龜?shù)組中不同數(shù)量的元素來定義單個面。
Unity支持以下網(wǎng)格拓?fù)?#xff1a;
三角形
Quad
線
LineStrip
積分?
index data:索引數(shù)據(jù)
翻譯:
索引數(shù)組包含引用頂點位置數(shù)組中元素的整數(shù)。這些整數(shù)稱為索引。
Unity使用索引將頂點位置連接到面中。組成每個面的索引數(shù)量取決于網(wǎng)格的拓?fù)浣Y(jié)構(gòu)。
在Mesh類中,您可以使用Mesh.GetIndices獲取此數(shù)據(jù),并使用Mesh.SetIndices進行設(shè)置。Unity也將此數(shù)據(jù)存儲在Mesh.triangles中,但此舊屬性的效率和用戶友好性較差。
注意:“點”拓?fù)洳粫?chuàng)建面;相反,Unity在每個位置渲染一個點。所有其他網(wǎng)格拓?fù)涠际褂枚鄠€索引來創(chuàng)建面或邊。
例如,對于具有包含以下值的索引數(shù)組的網(wǎng)格:
0,1,2,3,4,5
如果網(wǎng)格具有三角形拓?fù)?#xff0c;則前三個元素(0,1,2)標(biāo)識一個三角形,隨后的三個單元(3,4,5)標(biāo)識另一個三角形。頂點可以參與的面數(shù)沒有限制。這意味著同一個頂點可以多次出現(xiàn)在索引數(shù)組中。例如,索引數(shù)組可以包含以下值:
0,1,2,1,2,3
如果網(wǎng)格具有三角形拓?fù)?#xff0c;則前三個元素(0,1,2)標(biāo)識一個三角形,隨后的三個元件(1,2,3)標(biāo)識與第一個共享頂點的另一個三角形。
winding order:繞序
翻譯:
索引數(shù)組中每組頂點的順序稱為纏繞順序。Unity使用纏繞順序來確定面是面向前還是面向后,進而確定是應(yīng)該渲染面還是剔除面(將其從渲染中排除)。默認(rèn)情況下,Unity渲染正面多邊形并剔除背面多邊形。Unity使用順時針纏繞順序,這意味著Unity認(rèn)為索引沿順時針方向連接的任何面都是正面的。

上圖展示了Unity如何使用纏繞順序。每個面的頂點順序決定了該面的法線方向【左手坐標(biāo)系下,叉乘的方向用左手判斷】,Unity將其與當(dāng)前攝影機透視的正向進行比較。如果法線指向遠(yuǎn)離當(dāng)前攝影機的前進方向,則它是向后的。較近的三角形頂點順序為(1,2,3),從當(dāng)前的角度來看,這是順時針方向,因此三角形是面向攝像機的,保留。另一個三角形的頂點順序是(4,5,6),從當(dāng)前角度來看,這是逆時針方向,所以這個三角形是背向攝像機的,剔除。
關(guān)于forward direction
Unity - Scripting API: Vector3.forward (unity3d.com)
實踐
前期準(zhǔn)備?
添加一個空物體:
給這個空物體添加mesh filter,mesh render組件;mesh render組件的materials項選擇default-material。然后新建一個腳本拖給它。?
腳本里的代碼
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Draw : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){List<Vector3> verts = new List<Vector3>(); // 頂點坐標(biāo)List<int> indices = new List<int>(); // 頂點索引// 設(shè)置繪制一個三角形需要的相關(guān)數(shù)據(jù)// 從世界坐標(biāo)系的z軸負(fù)無窮處向z軸正無窮處看,這3個頂點是順時針排列的// 反過來,從世界坐標(biāo)系的z軸正無窮處向z軸負(fù)無窮處看,這3個頂點是逆時針排列的verts.Add(new Vector3(0, 0, 0)); verts.Add(new Vector3(0, 1, 0));verts.Add(new Vector3(1, 0, 0));indices.Add(0);indices.Add(1);indices.Add(2);// 把數(shù)據(jù)賦給meshMesh mesh= GetComponent<MeshFilter>().mesh;mesh.vertices = verts.ToArray();mesh.triangles = indices.ToArray();mesh.RecalculateNormals();}
}
運行
隨著視角的變化,頂點的排列順序也不同。
當(dāng)頂點順時針排列時,三角形可見。
當(dāng)頂點逆時針排列時,三角形不可見,被剔除。?