Unity3D網(wǎng)格功能生成球體網(wǎng)格模型
本文實(shí)例為大家分享了Unity3D網(wǎng)格功能生成球體網(wǎng)格模型的具體代碼,供大家參考,具體內(nèi)容如下
前面已經(jīng)講過(guò)怎樣使用mesh生成一個(gè)自己的網(wǎng)格,那么本文將會(huì)講述怎樣將這個(gè)網(wǎng)格變換成自己想要的形狀,比如一個(gè)球體。
我們需要知道一個(gè)從平面坐標(biāo)到球體坐標(biāo)的映射公式。假設(shè)平面坐標(biāo)是(x,y),球體坐標(biāo)是(x0,y0,z0),則



球體坐標(biāo)(x0,y0,z0)可以通過(guò)以下代碼得到,(x,y) 對(duì)應(yīng)vertices[i].x和vertices[i].y。
v.x = r * Mathf.Cos(vertices[i].x / width * 2 * Mathf.PI) * Mathf.Cos(vertices[i].y / height * Mathf.PI - Mathf.PI / 2); v.y = r * Mathf.Sin(vertices[i].x / width * 2 * Mathf.PI) * Mathf.Cos(vertices[i].y / height * Mathf.PI - Mathf.PI / 2); v.z = r * Mathf.Sin(vertices[i].y / height * Mathf.PI - Mathf.PI / 2);
完整代碼在最后,將完整的腳本綁定到一個(gè)空物體上,把棋盤格圖案chessboard.jpg放到Assets\Resources下,還要在場(chǎng)景中生成一個(gè)sphere作為顯示網(wǎng)格頂點(diǎn)的輔助物體。一切就緒后,運(yùn)行效果如下:


using UnityEngine;
using System.Collections;
public class BallMesh : MonoBehaviour
{
Mesh mesh;
Vector3[] vertices;
Vector2[] uv;
int[] triangles;
Vector3[] normals;
public GameObject sphere;
GameObject[] spheres;
void Start()
{
gameObject.AddComponent<MeshFilter>();
gameObject.AddComponent<MeshRenderer>();
Texture img = (Texture)Resources.Load("tm");
gameObject.GetComponent<Renderer>().material.mainTexture = img;
mesh = new Mesh();
int m = 25; //row
int n = 50; //col
float width = 8;
float height = 6;
vertices = new Vector3[(m + 1) * (n + 1)];//the positions of vertices
spheres = new GameObject[(m + 1) * (n + 1)];
uv = new Vector2[(m + 1) * (n + 1)];
normals = new Vector3[(m + 1) * (n + 1)];
triangles = new int[6 * m * n];
for (int i = 0; i < vertices.Length; i++)
{
float x = i % (n + 1);
float y = i / (n + 1);
float x_pos = x / n * width;
float y_pos = y / m * height;
vertices[i] = new Vector3(x_pos, y_pos, 0);
float u = x / n;
float v = y / m;
uv[i] = new Vector2(u, v);
}
for (int i = 0; i < 2 * m * n; i++)
{
int[] triIndex = new int[3];
if (i % 2 == 0)
{
triIndex[0] = i / 2 + i / (2 * n);
triIndex[1] = triIndex[0] + 1;
triIndex[2] = triIndex[0] + (n + 1);
}
else
{
triIndex[0] = (i + 1) / 2 + i / (2 * n);
triIndex[1] = triIndex[0] + (n + 1);
triIndex[2] = triIndex[1] - 1;
}
triangles[i * 3] = triIndex[0];
triangles[i * 3 + 1] = triIndex[1];
triangles[i * 3 + 2] = triIndex[2];
}
int r = 10;
for (int i = 0; i < vertices.Length; i++)
{
spheres[i] = Instantiate( sphere,this.transform) as GameObject;
Vector3 v ;
v.x = r * Mathf.Cos(vertices[i].x / width * 2 * Mathf.PI) * Mathf.Cos(vertices[i].y / height * Mathf.PI - Mathf.PI / 2);
v.y = r * Mathf.Sin(vertices[i].x / width * 2 * Mathf.PI) * Mathf.Cos(vertices[i].y / height * Mathf.PI - Mathf.PI / 2);
v.z = r * Mathf.Sin(vertices[i].y / height * Mathf.PI - Mathf.PI / 2);
//v = vertices[i];
vertices[i] = v;
spheres[i].transform.localPosition = v;
normals[i] = new Vector3(0,1,0);
}
mesh.vertices = vertices;
mesh.normals = normals;
mesh.uv = uv;
mesh.triangles = triangles;
this.GetComponent<MeshFilter>().mesh = mesh;
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#多線程學(xué)習(xí)之(一)多線程的相關(guān)概念分析
這篇文章主要介紹了C#多線程學(xué)習(xí)之多線程的相關(guān)概念,涉及C#中多線程的相關(guān)概念與使用技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04
使用C#自制一個(gè)Windows安裝包的詳細(xì)過(guò)程
這篇文章主要介紹了如何使用C#自制一個(gè)Windows安裝包,文中通過(guò)圖文結(jié)合的方式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-07-07
基于C#實(shí)現(xiàn)一個(gè)最簡(jiǎn)單的HTTP服務(wù)器實(shí)例
這篇文章主要介紹了基于C#實(shí)現(xiàn)一個(gè)最簡(jiǎn)單的HTTP服務(wù)器的方法,詳細(xì)分析了http服務(wù)器的實(shí)現(xiàn)原理與相關(guān)技巧,以及對(duì)應(yīng)的注意事項(xiàng),需要的朋友可以參考下2014-12-12
C#中如何自定義配置上周和本周起始日來(lái)查詢業(yè)務(wù)數(shù)據(jù)(思路詳解)
在C#中并沒(méi)有封裝的方法根據(jù)我們需要來(lái)直接獲取上一周某天到某天、本周某天到某天,所以需要我們自己封裝方法來(lái)實(shí)現(xiàn)(我們也可以按照這個(gè)思路使用其他語(yǔ)言來(lái)實(shí)現(xiàn)),感興趣的朋友跟隨小編一起看看吧2023-09-09
詳解ASP.NET中Identity的身份驗(yàn)證代碼
這篇文章主要介紹了ASP.NET Identity 的“多重”身份驗(yàn)證代碼,以及實(shí)現(xiàn)的原理講解,需要的朋友參考一下。2017-12-12
C#使用SignalR實(shí)現(xiàn)與前端vue實(shí)時(shí)通信的示例代碼
SignalR 是 ASP.NET Core 的一個(gè)庫(kù),它簡(jiǎn)化了在應(yīng)用程序中添加實(shí)時(shí)通信的過(guò)程,無(wú)論是聊天應(yīng)用、實(shí)時(shí)游戲還是協(xié)作工具,SignalR 都能提供高效且易于實(shí)現(xiàn)的解決方案,本文給大家介紹了C#使用SignalR實(shí)現(xiàn)與前端vue實(shí)時(shí)通信的實(shí)現(xiàn),需要的朋友可以參考下2024-10-10
C#調(diào)用百度地圖API根據(jù)地名獲取經(jīng)緯度geocoding
本文主要介紹了C#調(diào)用百度地圖API根據(jù)地名獲取經(jīng)緯度geocoding,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
c#實(shí)現(xiàn)圖片的平移和旋轉(zhuǎn)示例代碼
這篇文章主要給大家介紹了關(guān)于c#實(shí)現(xiàn)圖片的平移和旋轉(zhuǎn)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用c#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08

