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ì)越逼近球體。
即:先創(chuàng)建一個(gè)正方體/長(zhǎng)方體/正八面體等等等等,只要是個(gè)閉合的圖形并且頂點(diǎn)的數(shù)量夠多分布的夠均勻,效果應(yīng)該就不錯(cuò)。
然后將所有的頂點(diǎ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)的話
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)文章
C#中的三種定時(shí)計(jì)時(shí)器Timer用法介紹
這篇文章介紹了C#中的三種定時(shí)計(jì)時(shí)器Timer的用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03
C#開發(fā)Windows服務(wù)實(shí)例之實(shí)現(xiàn)禁止QQ運(yùn)行
這篇文章主要介紹了通過(guò)C#開發(fā)Windows服務(wù),查殺qq進(jìn)程的服務(wù)功能,需要的朋友可以參考下2013-10-10
.net中前臺(tái)javascript與后臺(tái)c#函數(shù)相互調(diào)用問(wèn)題
.net中前臺(tái)javascript與后臺(tái)c#函數(shù)相互調(diào)用問(wèn)題...2007-12-12
C#基于SerialPort類實(shí)現(xiàn)串口通訊詳解
這篇文章主要為大家詳細(xì)介紹了C#基于SerialPort類實(shí)現(xiàn)串口通訊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
Unity實(shí)現(xiàn)ScrollView滑動(dòng)吸附功能
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)ScrollView滑動(dòng)吸附功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-09-09
C#讀取txt文件數(shù)據(jù)的方法實(shí)例
讀取txt文本數(shù)據(jù)的內(nèi)容,是我們開發(fā)中經(jīng)常會(huì)遇到的一個(gè)功能,這篇文章主要給大家介紹了關(guān)于C#讀取txt文件數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2021-05-05
解析C#中委托的同步調(diào)用與異步調(diào)用(實(shí)例詳解)
本篇文章是對(duì)C#中委托的同步調(diào)用與異步調(diào)用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05

