unity通過(guò)Mesh網(wǎng)格繪制圖形球體
本文實(shí)例為大家分享了unity通過(guò)Mesh網(wǎng)格繪制球體的具體代碼,供大家參考,具體內(nèi)容如下
接著上一篇文章說(shuō):
球體
public class 球體 : MonoBehaviour
{
MeshRenderer meshRenderer;
MeshFilter meshFilter;
List<Vector3> verts;
List<int> indices;
int N = 10;
void Start()
{
verts = new List<Vector3>();
indices = new List<int>();
meshRenderer = GetComponent<MeshRenderer>();
meshFilter = GetComponent<MeshFilter>();
BuildModel();
}
void BuildModel()
{
for(float i = -N / 2f; i <= N / 2f; i++)
{
for(float j = -N / 2f; j <= N / 2f; j++)
{
verts.Add(new Vector3(i, j, -N / 2f));
}
}
for (float i = -N / 2f; i <= N / 2f; i++)
{
for (float j = -N / 2f; j <= N / 2f; j++)
{
verts.Add(new Vector3(N / 2f, j, i));
}
}
for (float i = -N / 2f; i <= N / 2f; i++)
{
for (float j = -N / 2f; j <= N / 2f; j++)
{
verts.Add(new Vector3(i, N / 2f, j));
}
}
for (float i = -N / 2f; i <= N / 2f; i++)
{
for (float j = -N / 2f; j <= N / 2f; j++)
{
verts.Add(new Vector3(-N / 2f, j, i));
}
}
for (float i = -N / 2f; i <= N / 2f; i++)
{
for (float j = -N / 2f; j <= N / 2f; j++)
{
verts.Add(new Vector3(i, j, N / 2f));
}
}
for (float i = -N / 2f; i <= N / 2f; i++)
{
for (float j = -N / 2f; j <= N / 2f; j++)
{
verts.Add(new Vector3(i, -N / 2f, j));
}
}
//真正控制球體成型的部分
for (int i = 0; i < verts.Count; i++)
{
verts[i] = verts[i].normalized;
}
//繪制
MakePos(0);
MakePos(1);
MakePos(2);
OtherMakePos(3);
OtherMakePos(4);
OtherMakePos(5);
Draw();
}
public void MakePos(int num)
{
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
int index = j * (N + 1) + (N + 1) * (N + 1)* num + i;
int up = (j + 1) * (N + 1) + (N + 1) * (N + 1)* num + i;
indices.AddRange(new int[] { index, index + 1, up + 1 });
indices.AddRange(new int[] { index, up + 1, up });
}
}
}
public void OtherMakePos(int num)
{
for (int i = 0; i < N + 1; i++)
{
for (int j = 0; j < N + 1; j++)
{
if (i != N && j != N)
{
int index = j * (N + 1) + (N + 1) * (N + 1) * num + i;
int up = (j + 1) * (N + 1) + (N + 1) * (N + 1) * num + i;
indices.AddRange(new int[] { index, up + 1, index + 1 });
indices.AddRange(new int[] { index, up, up + 1 });
}
}
}
}
public void Draw()
{
Mesh mesh = new Mesh();
mesh.vertices = verts.ToArray();
mesh.triangles = indices.ToArray();
mesh.RecalculateNormals();
mesh.RecalculateBounds();
meshFilter.mesh = mesh;
}
}
原理
假設(shè)手里有個(gè)空的正方體牛奶盒,我們拿習(xí)慣向里吹起,會(huì)讓牛奶盒的六個(gè)面都鼓起來(lái)。牛奶盒夠軟并且氣體足夠多的話(huà),它就會(huì)越逼近球體。
即:先創(chuàng)建一個(gè)正方體/長(zhǎng)方體/正八面體等等等等,只要是個(gè)閉合的圖形并且頂點(diǎn)的數(shù)量夠多分布的夠均勻,效果應(yīng)該就不錯(cuò)。
然后將所有的頂點(diǎn)和物體中心連線(xiàn)并截取同樣的長(zhǎng)度,保證所有頂點(diǎn)到中心點(diǎn)的距離相等。
調(diào)整所有三角形頂點(diǎn)的坐標(biāo)和物體中心的距離相等:
取正方體的中心點(diǎn)作為球的中心點(diǎn),也是為了讓各個(gè)頂點(diǎn)分布的比較均勻。
以下是設(shè)定球的半徑為1并且中心點(diǎn)剛好在(0,0,0)的情況:
for (int i = 0; i < verts.Count; i++)
{
verts[i] = verts[i].normalized;
}
若中心點(diǎn)不在(0,0,0)的話(huà)
for (int i = 0; i < verts.Count; i++)
{
Vector3 vec3 = verts[i];
Vector3 o = new Vector3(1, 2, 3);//例如中心點(diǎn)在(1,2,3)
verts[i] = o + (vec3 - o).normalized;
}
效果:

原來(lái)正方體的接縫處變成球體之后仍存在:
原因請(qǐng)參考上一章討論繪制正方體的部分:鏈接: 繪制正方體.

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
操作XML文檔遇到的XMLNS問(wèn)題及解決方法 (C# 和 PHP)
不管是用 PHP 還是 C#, 在操作 XML 的時(shí)候我們除了一個(gè)節(jié)點(diǎn)一個(gè)節(jié)點(diǎn)去取值之外, 還有一個(gè)非常方便的表達(dá)式, 就是 XPATH2011-05-05
基于Unity Line Renderer組件的常用屬性說(shuō)明
這篇文章主要介紹了基于Unity Line Renderer組件的常用屬性說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04
C#實(shí)現(xiàn)寫(xiě)系統(tǒng)日志的方法
這篇文章主要介紹了C#實(shí)現(xiàn)寫(xiě)系統(tǒng)日志的方法,涉及C#針對(duì)系統(tǒng)日志的創(chuàng)建、寫(xiě)入及刪除等技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-08-08
C#動(dòng)態(tài)對(duì)象(dynamic)詳解(實(shí)現(xiàn)方法和屬性的動(dòng)態(tài))
下面小編就為大家?guī)?lái)一篇C#動(dòng)態(tài)對(duì)象(dynamic)詳解(實(shí)現(xiàn)方法和屬性的動(dòng)態(tài))。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02

