Mesh网格编程(二) 万能网格几何体
来源:互联网 发布:交换机网络风暴 编辑:程序博客网 时间:2024/06/11 21:21
开头:
用一个通用代码,实现各种锥、柱、管状体的网格创建。
非原创的同系列。虽然总觉得代码上可以再优化,但是实现的功能已经超级屌了。
真是没有不能做的,只有想不到的。
具体思路:
通过Mesh网格编程实现几何体的多种变化。以立体五角星为例,大边长和小边长分别设置长度为5的数组,数组控制几何体顶层空心,顶层大小,中间层大小,底层大小,底层空心。通过循环构建上层与下层之间的网格。
代码:
using UnityEngine;using System.Collections;public class Star3 : MonoBehaviour {Mesh mesh;public bool sophisticated = false;//圆滑曲面public bool star = true;//星形public int line = 5;//边数public float[] maxsize = {0,0,5,0,0};//外角大小public float[] minSize = {0,0,1,0,0};//内角大小public float high = 1;//高度public float low = -1;//低度private Vector3[] vs;//顶点坐标private int[] ts;//顶点序列private Vector2[] newUVs;//UV贴图private Vector3[] newNormals;//法线// Update is called once per framevoid Update () {//变量约束line = Mathf.Clamp (line, 2, 300);high = Mathf.Clamp (high, low, high);low = Mathf.Clamp (low, low, high);if (!star) {for (int i = 0; i < 5; i++) {minSize[i] = Mathf.Cos(Mathf.PI / line) * maxsize[i];}}for (int i = 1; i < 4; i++) {maxsize[i] = Mathf.Clamp (maxsize[i], 0, maxsize[i]);minSize[i] = Mathf.Clamp (minSize[i], 0, maxsize[i]);}maxsize[0] = Mathf.Clamp (maxsize[0], 0, maxsize[1]);minSize[0] = Mathf.Clamp (minSize[0], 0, minSize[1]);maxsize[4] = Mathf.Clamp (maxsize[4], 0, maxsize[3]);minSize[4] = Mathf.Clamp (minSize[4], 0, minSize[3]);//角度计算float corner = 2 * Mathf.PI / line;//确定顶点数量int temp = 5 * 4 * 3 * line;vs = new Vector3[temp];ts = new int[temp];newUVs = new Vector2[temp];newNormals = new Vector3[temp];int count = 0;float h = 0;float l = 0;for (int i = 0; i < 5; i++) {switch (i) {case 0: h = high;l = high;break;case 1:h = high;l = 0;break;case 2:h = 0;l = low;break;case 3:h = low;l = low;break;case 4:h = low;l = high;break;}for (int k = 0; k < line; k++) {//确定顶点坐标vs[count] = new Vector3(Mathf.Sin(k * corner) * maxsize[i],Mathf.Cos(k * corner) * maxsize[i],h);vs[count + 1] = new Vector3(Mathf.Sin((k + 0.5f) * corner) * minSize[(i + 1) % 5],Mathf.Cos((k + 0.5f) * corner) * minSize[(i + 1) % 5],l);vs[count + 2] = new Vector3(Mathf.Sin(k * corner) * maxsize[(i + 1) % 5],Mathf.Cos(k * corner) * maxsize[(i + 1) % 5],l);vs[count + 3] = new Vector3(Mathf.Sin(k * corner) * maxsize[i],Mathf.Cos(k * corner) * maxsize[i],h);vs[count + 4] = new Vector3(Mathf.Sin((k + 0.5f) * corner) * minSize[i],Mathf.Cos((k + 0.5f) * corner) * minSize[i],h);vs[count + 5] = new Vector3(Mathf.Sin((k + 0.5f) * corner) * minSize[(i + 1) % 5],Mathf.Cos((k + 0.5f) * corner) * minSize[(i + 1) % 5],l);vs[count + 6] = new Vector3(Mathf.Sin(k * corner) * maxsize[i],Mathf.Cos(k * corner) * maxsize[i],h);vs[count + 7] = new Vector3(Mathf.Sin(k * corner) * maxsize[(i + 1) % 5],Mathf.Cos(k * corner) * maxsize[(i + 1) % 5],l);vs[count + 8] = new Vector3(Mathf.Sin((k - 0.5f) * corner) * minSize[(i + 1) % 5],Mathf.Cos((k - 0.5f) * corner) * minSize[(i + 1) % 5],l);vs[count + 9] = new Vector3(Mathf.Sin(k * corner) * maxsize[i],Mathf.Cos(k * corner) * maxsize[i],h);vs[count + 10] = new Vector3(Mathf.Sin((k - 0.5f) * corner) * minSize[(i + 1) % 5],Mathf.Cos((k - 0.5f) * corner) * minSize[(i + 1) % 5],l);vs[count + 11] = new Vector3(Mathf.Sin((k - 0.5f) * corner) * minSize[i],Mathf.Cos((k - 0.5f) * corner) * minSize[i],h);//确定法线if (sophisticated) {newNormals[count] = Vector3.Normalize(vs[count] - new Vector3(0,0,h));newNormals[count + 1] = Vector3.Normalize(vs[count + 1] - new Vector3(0,0,l));newNormals[count + 2] = Vector3.Normalize(vs[count + 2] - new Vector3(0,0,l));newNormals[count + 3] = Vector3.Normalize(vs[count + 3] - new Vector3(0,0,h));newNormals[count + 4] = Vector3.Normalize(vs[count + 4] - new Vector3(0,0,h));newNormals[count + 5] = Vector3.Normalize(vs[count + 5] - new Vector3(0,0,l));newNormals[count + 6] = Vector3.Normalize(vs[count + 6] - new Vector3(0,0,h));newNormals[count + 7] = Vector3.Normalize(vs[count + 7] - new Vector3(0,0,l));newNormals[count + 8] = Vector3.Normalize(vs[count + 8] - new Vector3(0,0,l));newNormals[count + 9] = Vector3.Normalize(vs[count + 9] - new Vector3(0,0,h));newNormals[count + 10] = Vector3.Normalize(vs[count + 10] - new Vector3(0,0,l));newNormals[count + 11] = Vector3.Normalize(vs[count + 11] - new Vector3(0,0,h));} else {for (int j = 0; j < 4; j++) {Vector3 newNormal = Vector3.Cross(vs[count + 3 * j + 1] - vs[count + 3 * j + 0],vs[count + 3 * j + 2] - vs[count + 3 * j + 0]);for (int z = 0; z < 3; z++) {newNormals[count + 3 * j + z] = Vector3.Normalize(newNormal);}}}count += 12;}}//确定顶点序列for (int i = 0; i < ts.Length; i++) {ts[i] = i;}//创建网格mesh = new Mesh();GetComponent<MeshFilter>().mesh = mesh;mesh.vertices = vs;mesh.uv = newUVs;mesh.triangles = ts;mesh.normals = newNormals;}}
通过调节变量图中几何体均可实现。Mesh编程步骤见 Mesh网格编程(一)。
原文转载:http://blog.csdn.net/qq_18408937/article/details/44181489
0 0
- Mesh网格编程(二) 万能网格几何体
- Mesh网格编程(二) 万能网格几何体
- 【Unity】Mesh网格编程(三)万能网格几何形体
- 【Unity】Mesh网格编程(二)流体
- [基本数据结构]网格(Mesh)和几何体(Geometry)
- 【Unity】Mesh网格编程(一)正二十面体
- 【Unity】Mesh网格编程(一)正二十面体
- Mesh网格篇(二)网格的快速切割
- Mesh网格编程(一) 流体
- Mesh网格编程(一) 流体水
- Mesh网格编程(一) 流体
- 网格(mesh)简化
- 【Unity】Mesh网格编程(四)麦比乌斯环
- Mesh网格编程(三) 正12面体
- Mesh网格编程(四) 正6面体
- unity3d网格(mesh)编程的研究
- Mesh网格编程 正6面体
- Mesh网格篇(三)绘制交互网格
- 【Shiro】Apache Shiro架构之实际运用(整合到Spring中)
- jenkins安装配置
- codeforces 229 D Towers 贪心+DP
- 研读《基于flume网络安全可视化系统》----小结
- 素材的多样性
- Mesh网格编程(二) 万能网格几何体
- Spring4 Retrofit2 整合
- 网站收藏
- Vysor:可以直接在 Chrome 中通过鼠标操作 Android 设备
- 关于使用cocoaPods,import导入时第三方库头文件没有提示问题的解决办法
- 分区格式化挂载
- 最全面的 DNS 原理入门
- 利用Scrapy爬取糗事百科段子
- xml parsing fatal error:Invalid document struture,line 1,