本篇文章主要介绍了利用Unity中的mesh 实时生成圆环的过程以及思想,我会在开头直接放出源码。如若有任何疑问,可向后继续观看详细解说~~~

(PSPSPS:Mesh生成的顺序,方式等有很多,当前代码中部分逻辑若不理解,可自行推导一下圆的方程,即可得出解答   //顺带说一下,代码中的英文是我锻炼英文用的。。。。遇见语法错误不准笑……)

首先 放上效果图:

代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;[RequireComponent(typeof(MeshFilter) , typeof(MeshRenderer))]
public class CylinderGenerateScript : MonoBehaviour {//the outside radius must lager than the inside one[Range(0, 100)] public float innerRadius;[Range(1, 100)] public float outsideRadius;public int blockCounts = 80;          //how many blocks that the obj will be split into?public float height = 10;             //the height of the obj.private float increment;private float currentAngle = 0;private MeshFilter meshFilter;void Start () {meshFilter = transform.GetComponent<MeshFilter>();GenerateMesh();//show the order we generate the obj.StartCoroutine(SequenceTest());}private void GenerateMesh(){//declare all the array we needList<Vector3> vertices = new List<Vector3>();List<Vector2> uvs = new List<Vector2>();List<int> triangles = new List<int>();//initialize the parametersincrement = 2 * Mathf.PI / blockCounts;//Generate the vertex we needvertices = GenerateVertics();//Fill the triangles in ordertriangles = FillTriangles(vertices.Count);meshFilter.mesh.vertices = vertices.ToArray();meshFilter.mesh.triangles = triangles.ToArray();}private List<Vector3> GenerateVertics(){//The order to Generate the vertics :   choose the left bottom as the first point, and assign the id by clockwise, inside circle generate first//顶点标号顺序  : 以左下角为起点,以顺时针顺序给各顶点标号,从内层圆环开始List<Vector3> vertices = new List<Vector3>();//used to load the radius we have    [Use Array to help us expand the plies]float[] radiuses = {innerRadius , outsideRadius };//For now this code will generate the inner circle firstfor (int i = 0; i < radiuses.Length; i++){for (int j = 0; j < blockCounts * 4; j += 4){//TODO : for now ,this script will generate 4 more verticesVector3 v1 = new Vector3(radiuses[i] * Mathf.Sin(currentAngle), 0, radiuses[i] * Mathf.Cos(currentAngle));Vector3 v2 = new Vector3(radiuses[i] * Mathf.Sin(currentAngle), height, radiuses[i] * Mathf.Cos(currentAngle));//Generate next two verticescurrentAngle += increment;Vector3 v3 = new Vector3(radiuses[i] * Mathf.Sin(currentAngle), height , radiuses[i] * Mathf.Cos(currentAngle));Vector3 v4 = new Vector3(radiuses[i] * Mathf.Sin(currentAngle), 0 , radiuses[i] * Mathf.Cos(currentAngle));vertices.Add(v1);vertices.Add(v2);vertices.Add(v3);vertices.Add(v4);}}return vertices;}private List<int> FillTriangles( int vertCount ){List<int> triangles = new List<int>();//1.fill the inner && outside surface for (int i = 0; i < vertCount - 2; i+=2){if (i == vertCount - 2 || i == vertCount - 1)     //connect with the origin points{triangles.AddRange(GetTriangleOrder(i , i + 1 , i - (blockCounts - 2) , i - (blockCounts - 3)));}else if(i < vertCount / 2){//inner circle only needs to see the inside surfacetriangles.AddRange(GetTriangleOrder(i, i + 1, i + 2 , i + 3));}else{//outside surfacetriangles.AddRange(GetTriangleOrder(i + 3, i + 2, i + 1, i));}}//2.fill the top && bottom surfacefor (int i = 0 , j = vertCount/2 ; i < vertCount/2; i+=4 , j+=4){if(i >= vertCount/2 - 2){triangles.AddRange(GetTriangleOrder(0, vertCount/2 , j , i));triangles.AddRange(GetTriangleOrder(i + 1, j + 1, vertCount / 2 + 1, 1));}else{triangles.AddRange(GetTriangleOrder(i + 3, j + 3, j , i ));triangles.AddRange(GetTriangleOrder(i + 1, j + 1, j + 2, i + 2));}}return triangles;}private List<int> GetTriangleOrder(int p1 , int p2 , int p3 , int p4)     //the input must be from the left bottom corner && sort by clockwise{//use this code to return a particular orderList<int> output = new List<int>();//Add first triangleoutput.Add(p1);output.Add(p2);output.Add(p3);//Add the second oneoutput.Add(p3);output.Add(p4);output.Add(p1);return output;}IEnumerator SequenceTest(){float interval = 0.01f;for (int i = 0; i < meshFilter.mesh.triangles.Length; i += 3){Debug.DrawLine(meshFilter.mesh.vertices[meshFilter.mesh.triangles[i]], meshFilter.mesh.vertices[meshFilter.mesh.triangles[i + 1]], Color.red, 100f);yield return new WaitForSeconds(interval);Debug.DrawLine(meshFilter.mesh.vertices[meshFilter.mesh.triangles[i + 1]], meshFilter.mesh.vertices[meshFilter.mesh.triangles[i + 2]], Color.yellow, 100f);yield return new WaitForSeconds(interval);Debug.DrawLine(meshFilter.mesh.vertices[meshFilter.mesh.triangles[i + 2]], meshFilter.mesh.vertices[meshFilter.mesh.triangles[i]], Color.blue, 100f);yield return new WaitForSeconds(interval);}}
}

Mesh的生成过程说白了就是生成点,然后再将各点连接成为一个个的小三角形的过程,以上的代码也都是基于这个思想的。

在Mesh的生成过程中,先说一些基本的东西:

  • Mesh的组成分为几个部分:

              vertices :mesh中的顶点集,mesh所有的顶点位置信息都存储在这里,其类型为vertex。

triangles : mesh中存储连接顺序的集合,在mesh生成中,unity会依照此集合中的标号依次连接vertices中的顶点,在Unity中,由于mesh都是由一个个的小三角形组成的,因此,这个集合使用时将是每三个顶点号为一组,然后以此往复向后。(请注意在给triangles 赋值时,标号一定不要超过vertices中记录的标号,否则会导致错误出现。)

uvs :mesh中存储材质的集合,类型为vector3的数组,这个数组提供的参数将会用于贴图在物体表面的匹配。

  • 添加此脚本(所有自动生成Mesh的脚本)需要先在物体上添加MeshFilter 以及 MeshRenderer组件,然后才能正常生成物体,否则会报错

解说在此解说在此解说在此::::::

  •     首先需要说的就是各个变量的定义----》

innerRadius,outsideRadius:内层以及外层环形的半径,内层圆半径请勿大于外层,本文代码中,并未提供判断此项的方法。

blockCounts                          :规定圆环会被划分为多少份来生成,此项越小,环形的边界也会相应的慢慢变为多边形的样子,同时,此项不宜过大,否则生成的效果一样,但是需要花费更多的CPU资源来生成,请自行斟酌。

height                                      : 规定生成的圆环的高度。

increment                                :划分这么多份,每一份的角度。后面生成各个点时,需要用到。

其余的~~~~~~~~~~~~~~~~~~:略!

  • 然后就是我们的生成思想了~~~

角度计算:在这里,我们首先要求出分了这么多块,每一块的角度,也就是基本的圆的公式:2 * PI / blockCounts  , 算出这个值以后,我们通过GenerateVertics函数就可以开始生成顶点信息了,

顶点生成:我这里采用的是先生成内层顶点,然后依次向外延伸,生成外层顶点的顺序,在自己生成顶点时请注意,一定要记好自己生成顶点的顺序,否则后面填充triangles数组时会产生混乱。

各边连接(填充triangles):这里就是连接各个顶点的过程,一般情况下,一个小的面(四边形)需要填充两个三角形,这也就意味着我们每四个顶点,要互相连接,形成两个三角形。(PSPSPS:大写的强调:三角形不可重叠 &&& 三角形的连接顺序为你所需要看见的面的方向的顺时针,否则是看不见的。当然你可以将顺时针和逆时针都加进去,这样可以做到双面可见)

  • 最后的话,就是我们的调试程序了~~:

这里是用了一个协程操作,来向我们一步一步的展示了这个三角形的具体生成过程,这一小段代码取自这里这里这里。

到这里也就没什么了,其实主要就是计算顶点,以及判断生成顺序的一个问题而已~~,希望大家喜欢~~

本帅哥乃小白界中的一员,难免有错,发现的话,请评论啥玩意的~~大家一起学习啊~~~

Unity 在代码中利用Mesh实时生成圆环/空心圆柱相关推荐

  1. 在Unreal引擎中利用实现实时动作捕捉

    在Unreal引擎中利用实现实时动作捕捉 前言: 准备的软件: 准备工作: 为motionbuilder安装livelink插件: 演员及Motionbuilder准备: 捕捉流程 将Motionbu ...

  2. Excel中利用宏批量生成md5加密

    ** Excel中利用宏批量生成md5加密 一.下载宏文件 点击下载md5宏.xla 二.找到excle并加载宏 1.依次打开[文件]-[选项]-[自定义功能区] 选中[开发工具] 2.这样在Exce ...

  3. Unity 在代码中 动态改变RectTransform位置及宽高 的方法整理

    原文链接(尊重原著):[100个 Unity实用技能] | Unity 在代码中 动态改变RectTransform位置及宽高 的方法整理_unity 修改recttransform_呆呆敲代码的小Y ...

  4. Unity中利用柏林噪音生成随机地图

    利用柏林噪音生成随机地图<2/2/2018> 什么是柏林噪音?(请自行百度)Perlin噪声 ( Perlin noise )指由Ken Perlin发明的自然噪声生成算法 . 原理学习可 ...

  5. unity 在代码中创建spine动画组件

    项目中用到了spine动画,使用Assetbundle打包后,在手机上运行会出现丢材质的情况.如果不进行打包,直接放到Resources目录下是可以正常加载的,但是,这样包就会很大,而且也不能进行热更 ...

  6. ArcGIS中利用DEM数据生成地形图既视感的等高线;利用掩膜进行等高线注记;DEM的可视化表达总结

    文章目录 前言 一.效果图展示 二.地形(DEM)可视化表达 1.一维可视化 2.二维可视化 3.三维可视化 二.ArcGIS中利用DEM数据制作等高线 1.DEM数据下载 2.镶嵌 3.提取出需要的 ...

  7. python灰度图生成g代码_Artcam2009利用灰度图生成雕刻机所需的G代码

    双击桌面的artcam快捷方式图标打开软件首先看到如下 的界面.点击"通过图像产生模型" 利用ART CAM 软件制作浮雕刀路的方法 Artcam2009利用灰度图生成雕刻机所需的 ...

  8. 查找unity工程代码中中文字符

    游戏本地化的时候可能需要搜索工程代码中的中文字符. 这个可以通过加载文件一行一行读取后,通过正则来查询. 下面的代码LoadFile函数通过流加载文件,FindFile通过递归病使用Directory ...

  9. android在代码中利用Spinner控件设置联动地区的解决办法

    需求就是地区选择可以弹出来,因为百度地图一般是获取当前的地址,我们需要的是他的家庭地址  所以才有了三级Spinner解决 地区问题  就是当用户填写了之后,下次再修改,你要给他显示出来上次填写的值, ...

最新文章

  1. php绘图技术加水印,PHP图片添加水印功能示例小结
  2. python小项目实例流程-《Python编程:从入门到实践》DEMO实例代码
  3. php smarty 限制显示字数,smarty现在显示字数的各种写法
  4. 树形结构:递归转化为迭代,万能通用方法,分治策略基于栈的实现
  5. wordpress如何屏蔽wp-json(禁用REST API)
  6. 背景图片-密度屏幕(移动端)
  7. docker+MySQL+读写分离
  8. 机器人程序设计——之如何正确入门ROS | 硬创公开课(附视频/PPT)【转】
  9. View Horizon Mirage安装手册(四)——Mirage Management Console安装
  10. VAAI 工作原理及存储阵列支持
  11. 【论文笔记】Joint Cascade Face Detection and Alignment
  12. 气象数据源-要素、数据集、空间分辨率、网址
  13. php中adodb中文手册,[转载]ADODB中文手册(4)
  14. MATLAB之GUI界面介绍与搭建
  15. vue 利用科大讯飞实现实时语音转写
  16. seo如何做外链(做seo外链建设有哪些原则)
  17. zlib库介绍一:zlib简介
  18. 程序猿真的觉得写代码比女朋友重要吗?
  19. 抽象类和接口的相同点和不同点
  20. 相关系数之皮尔逊pearson相关系数和斯皮尔曼spearman等级相关系数(评价线性关系的相关系数)(第一部分)

热门文章

  1. 2019年全国职业技能大赛-软件测试赛项国赛总结-西安航空职业技术学院
  2. pandas mysql 合并_pandas的合并、连接、去重、替换
  3. Thymeleaf基础学习之路
  4. 中学教学常用计算机软件,中学计算机教学法
  5. HbuilderX工程突然运行不起来?发布失败?没有报错?
  6. 2. 安装MySQL
  7. Java 通过经纬度获取地理位置
  8. 基于Cesium使高德地图、百度地图、腾讯地图与天地图无偏移叠加
  9. 最新E4A抖音互关源码+含数据库后台/搭建可用
  10. Huey 和celery 的区别