【Unity】Mesh网格编程(一)正二十面体
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【Unity】Mesh网格编程(一)正二十面体
本文以自定义编译器菜单的方式,实现了Unity创建正二十面体的功能扩展。本文分享自蓝鸥科技杜老师。
Mesh类是Unity用脚本创建和修改3D模型的重要脚本类。
添加了各种Shader材质球+Halo的效果图:
关于Mesh编程相关内容网上有很多资料,这里就不再赘述了。
步骤一:
创建Editor文件夹(若有就不用),将以下源代码保存为MyEditor.cs文件,存入文件夹中。
源代码:
1.///
2./// Mesh网格编程——点击拓展菜单,创建正二十面体
3./// Created by 杜子兮() 2015.2.20
4./// All Rights Reserved.
5.///
6.
ing UnityEngine;
ing UnityEditor; // 使用编译器类
ing System.Collections;
10.
11.public class MyEditor : EditorWindow {
12.
13.// 注意:该类继承EditorWindow,只能包含静态成员
14.
15.static Mesh mesh; // 网格
16.static Vector3[] Vs; // 模型顶点坐标数组
17.static Vector2[] UVs; // UV贴图坐标
18.static Vector3[] normals; // 法线
19.static Vector4[] tangents; // 切线
20.static int[] Ts; // 三角形的点序列
21.
22.// 添加菜单项,并放置最顶端
23. [MenuItem("GameObject/Create Other/正二十面体", false, -30)]
24.static void CreateRegular(){
25.// 先按12个顶点开辟顶点数组
26. Vs = new Vector3[12];
27.
28.// 正二十面体顶点公式(度娘可查)
29.float m = Mathf.Sqrt(50 - 10 * Mathf.Sqrt(5)) / 10;
30.float n = Mathf.Sqrt(50 + 10 * Mathf.Sqrt(5)) / 10;
31.
32.// 按公式顺序对顶点坐标赋值
33. Vs[0] = new Vector3( m, 0, n);
34. Vs[1] = new Vector3( m, 0,-n);
35. Vs[2] = new Vector3(-m, 0, n);
36. Vs[3] = new Vector3(-m, 0,-n);
37. Vs[4] = new Vector3( 0, n, m);
38. Vs[5] = new Vector3( 0,-n, m);
39. Vs[6] = new Vector3( 0, n,-m);
40. Vs[7] = new Vector3( 0,-n,-m);
41. Vs[8] = new Vector3( n, m, 0);
42. Vs[9] = new Vector3(-n, m, 0);
43. Vs[10] = new Vector3( n,-m, 0);
44. Vs[11] = new Vector3(-n,-m, 0);
45.
46.// 正二十面体三角形的点序列
47. Ts = new int[] {6,4,8, 9,4,6, 6,3,9, 6,1,3, 6,8,1,
48. 8,10,1, 8,0,10, 8,4,0, 4,2,0, 4,9,2,
49. 9,11,2, 9,3,11, 3,1,7, 1,10,7, 10,0,5,
50. 0,2,5, 2,11,5, 3,7,11, 5,11,7, 10,5,7};
51.
52.// 根据面的顺序,重新创建新的顶点数组,用于计算顶点法线
53. Vector3[] newVs = new Vector3[Ts.Length];
54.for (int i = 0; i < newVs.Length; i++) {
55. Debug.Log(Vs[Ts[i]]);
56. newVs[i] = Vs[Ts[i]];
57. }
58. Vs = newVs;
59. UVs = new Vector2[Vs.Length];
60. normals = new Vector3[Vs.Length];
61. tangents = new Vector4[Vs.Length];
62.
63.// 根据新的点,设置三角面的顶点ID并计算点法线
64.for (int i = 0; i < Ts.Length - 2; i+=3) {
65. Vector3 normal = Vector3.Cross(Vs[i + 1] - Vs[i], Vs[i + 2] - Vs
[i]); // 计算点的法线
66.for (int j = 0; j < 3; j++) {
67. Ts[i + j] = i + j; // 重新设置面的顶点ID