日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【Unity】Mesh网格编程(四)麦比乌斯环

發(fā)布時(shí)間:2024/3/12 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Unity】Mesh网格编程(四)麦比乌斯环 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言


事隔四個(gè)多月,第二篇網(wǎng)格編程原創(chuàng),本次獻(xiàn)給大家的是麥比烏斯環(huán)。

其實(shí)這個(gè)早就想做了,還是輕松下來(lái)的時(shí)候思緒轉(zhuǎn)的快。

不廢話,先看效果:





博文首發(fā):http://blog.csdn.net/duzixi


工程資源準(zhǔn)備:

1. 本腳本要放在Editor文件夾下

2. 在資源中有一個(gè)空對(duì)象,作為頂點(diǎn)預(yù)設(shè)體,創(chuàng)建時(shí)要引入

3. 在Resources文件夾下有一個(gè)材質(zhì),叫"M"


源代碼:

using UnityEngine; using UnityEditor; using System.Collections; using System.Collections.Generic; /// <summary> /// 腳本功能:擴(kuò)展Unity編輯器,在GameObject目錄下添加“麥比烏斯帶”目錄以向?qū)Х绞缴甥湵葹跛箮?D模型對(duì)象 /// 添加對(duì)象:無(wú)(在Editor文件夾中) /// 創(chuàng)建時(shí)間:2015年6月27日14:16:16 /// 創(chuàng)建人員:杜子兮 /// 版權(quán)聲明:2015 www.duzixi.com /// 技術(shù)要點(diǎn): /// 1. 通過(guò)生成,父子化和旋轉(zhuǎn)空對(duì)象確認(rèn)各個(gè)頂點(diǎn)位置 /// 2. 根據(jù)幾何頂點(diǎn)位置生成網(wǎng)格頂點(diǎn)位置 /// </summary> public class CreateMesh : ScriptableWizard {public int n = 50; // 切割數(shù)public float r = 5; // 半徑public float h = 0.2f; // 半高public GameObject point; // 頂點(diǎn)的預(yù)設(shè)體(選擇適當(dāng)?shù)膱D標(biāo)可顯示頂點(diǎn)號(hào))[MenuItem("GameObject/麥比烏斯帶")]static void Create() {DisplayWizard<CreateMesh>("創(chuàng)建麥比烏斯帶", "創(chuàng)建");}void OnWizardCreate() {// Step 1: 確定頂點(diǎn)位置List<Vector3> vList = new List<Vector3>();GameObject obj = new GameObject(); // 實(shí)例化要生成的目標(biāo)對(duì)象obj.name = "麥比烏斯帶";float angle = 2 * Mathf.PI / n; // 計(jì)算單位弧度f(wàn)or (int i = 0; i < n; i++){// 分別計(jì)算帶子上中下三個(gè)頂點(diǎn)位置并保存到數(shù)組中Vector3 center = new Vector3(Mathf.Cos(angle * i), 0, Mathf.Sin(angle * i));Vector3[] vs = new Vector3[3] { center, center + h * Vector3.down, center + h * Vector3.up };// 計(jì)算中心點(diǎn)的角度,使之朝向坐標(biāo)原點(diǎn)Quaternion rot = Quaternion.Euler(new Vector3(0, -90 - 360 / n * i, 0));// 生成頂點(diǎn)對(duì)象GameObject p0 = Instantiate(point, vs[0], rot) as GameObject ;GameObject p1 = Instantiate(point, vs[1], Quaternion.identity) as GameObject;GameObject p2 = Instantiate(point, vs[2], Quaternion.identity) as GameObject;// 設(shè)置頂點(diǎn)名字(用于調(diào)試)p0.name = "c" + i;p1.name = 2 * i + "";p2.name = 2 * i + 1 + "";// 讓上下邊緣的點(diǎn)認(rèn)中心點(diǎn)為父對(duì)象p0.transform.parent = obj.transform;p1.transform.parent = p0.transform;p2.transform.parent = p0.transform;// 通過(guò)旋轉(zhuǎn)中心點(diǎn),改變上下邊緣頂點(diǎn)的位置p0.transform.Rotate(Vector3.right, 360 / n * i);// 將上下邊緣頂點(diǎn)添加到頂點(diǎn)列表中vList.Add(p1.transform.position);vList.Add(p2.transform.position);}// Step 2: 生成頂點(diǎn)數(shù)組Vector3[] Vs = new Vector3[6 * n];int index = 0;for (int i = 0; i < 2 * n - 2; i += 2){Vs[index++] = vList[i];Vs[index++] = vList[i + 1];Vs[index++] = vList[i + 2];Vs[index++] = vList[i + 2];Vs[index++] = vList[i + 1];Vs[index++] = vList[i + 3];}// 結(jié)合處頂點(diǎn)Vs[index++] = vList[2 * n - 2];Vs[index++] = vList[2 * n - 1];Vs[index++] = vList[0];Vs[index++] = vList[1];Vs[index++] = vList[0];Vs[index++] = vList[2 * n - 1];// Step 3: 締造三角形索引int[] Ts = new int[Vs.Length];for (int i = 0; i < Vs.Length; i++){Ts[i] = i;}// Step 4: 給目標(biāo)對(duì)象添加網(wǎng)格組件obj.AddComponent<MeshFilter>();obj.AddComponent<MeshRenderer>();Mesh mesh = new Mesh();mesh.vertices = Vs;mesh.triangles = Ts;obj.GetComponent<MeshFilter>().mesh = mesh;// Step 5: 載入材質(zhì)資源,添加給目標(biāo)對(duì)象Material m = Resources.Load<Material>("M");obj.renderer.sharedMaterial = m;}}



后記:

形狀不是嚴(yán)格的麥比烏斯環(huán),渲染只渲染了一面,目前沒(méi)有加法線和切線。

總結(jié)

以上是生活随笔為你收集整理的【Unity】Mesh网格编程(四)麦比乌斯环的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。