目录

1.绘制一个圆角正方体

2.代码


unity---Mesh网格编程(三)这里说了Mesh绘制一个正方体或立方体

1.绘制一个圆角正方体

2.代码

//X、Y、Z轴正方体数量足够多的偶数 半径取X的一半。 也可绘制出圆形using System.Collections;
using UnityEngine;//脚本挂载到物体时自动添加 MeshFilter 与 MeshRenderer 组件
[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]
public class Mesh4 : MonoBehaviour
{//x轴正方体数量、y轴正方体数量、Z轴正方体数量public int xGridCount, yGridCount, zGridCount;//圆角半径public float _r;private Vector3[] _vertices;private int[] _triangles;private int _t = 0, _v = 0;private Vector3[] _normals;void Start(){Mesh mesh = new Mesh();MeshFilter filter = GetComponent<MeshFilter>();filter.mesh = mesh;mesh.name = "Mesh4";StartCoroutine(GenerateMesh(mesh));}private IEnumerator GenerateMesh(Mesh mesh){yield return StartCoroutine(GenerateVextex());_normals = new Vector3[_vertices.Length];Vector3 inner;for (int i = 0; i < _vertices.Length; i++){inner = SetNormal(i);ResetVextexPos(i, inner);}mesh.vertices = _vertices;yield return StartCoroutine(GenerateTriange(mesh));}//计算顶点数private int GetVextexCount(){//公共-顶点数int connerVertexCount = 8;//边--顶点数int edgeVertexCount = (xGridCount + yGridCount + zGridCount - 3) * 4;//内部顶点数int faceVertexCount = (xGridCount - 1) * (yGridCount - 1) * 2+ (zGridCount - 1) * (yGridCount - 1) * 2+ (xGridCount - 1) * (zGridCount - 1) * 2;return connerVertexCount + edgeVertexCount + faceVertexCount;}//生成顶点private IEnumerator GenerateVextex(){_vertices = new Vector3[GetVextexCount()];int index = 0;//循环生成左右前后4个面的顶点for (int y = 0; y < yGridCount + 1; y++){//循环生成左右前后4个面的顶点for (int x = 0; x < xGridCount + 1; x++, index++){_vertices[index] = new Vector3(x, y, 0);yield return null;}//底部正方形-第二条边的顶点for (int z = 1; z < zGridCount + 1; z++, index++){_vertices[index] = new Vector3(xGridCount, y, z);yield return null;}//底部正方形-第三条边的顶点for (int x = xGridCount - 1; x >= 0; x--, index++){_vertices[index] = new Vector3(x, y, zGridCount);yield return null;}//底部正方形-第四条边的顶点for (int z = zGridCount - 1; z > 0; z--, index++){_vertices[index] = new Vector3(0, y, z);yield return null;}}//生成上面的顶点for (int z = 1; z < zGridCount; z++){for (int x = 1; x < xGridCount; x++, index++){_vertices[index] = new Vector3(x, yGridCount, z);yield return null;}}//生成下面的顶点for (int z = 1; z < zGridCount; z++){for (int x = 1; x < xGridCount; x++, index++){_vertices[index] = new Vector3(x, 0, z);yield return null;}}}//计算顶点序列下标数private int GetTriangeCount(){return xGridCount * yGridCount * 4 + xGridCount * zGridCount * 4 + yGridCount * zGridCount * 4;}//顶点绘制三角面序列private IEnumerator GenerateTriange(Mesh mesh){_triangles = new int[GetTriangeCount() * 3];int circleVextexCount = 2 * xGridCount + 2 * zGridCount;yield return StartCoroutine(GenerateSide(mesh, circleVextexCount));yield return StartCoroutine(GenerateTop(mesh, circleVextexCount));yield return StartCoroutine(GenerateBottom(mesh, circleVextexCount));}private IEnumerator GenerateSide(Mesh mesh, int circleVextexCount){for (int y = 0; y < yGridCount; y++){for (int i = 0; i < circleVextexCount; i++, _v++, _t += 6){SetQuad(_triangles, _t, _v, _v + 1, _v + circleVextexCount, _v + 1 + circleVextexCount, circleVextexCount);mesh.triangles = _triangles;yield return null;}}}private IEnumerator GenerateTop(Mesh mesh, int circleVextexCount){//第一行前三个面for (int x = 0; x < xGridCount - 1; x++, _v++, _t += 6){SetQuad(_triangles, _t, _v, _v + 1, _v + circleVextexCount - 1, _v + circleVextexCount);mesh.triangles = _triangles;yield return null;}//第一行第四个面SetQuad(_triangles, _t, _v, _v + 1, _v + circleVextexCount - 1, _v + 2);mesh.triangles = _triangles;_t += 6;yield return null;int vMin = circleVextexCount * (yGridCount + 1) - 1;int vMid = vMin + 1;int vMax = _v + 2;//中间行所有面for (int z = 0; z < zGridCount - 2; z++, vMin--, vMid++, vMax++){//第一个面SetQuad(_triangles, _t, vMin, vMid, vMin - 1, vMid + xGridCount);mesh.triangles = _triangles;_t += 6;yield return null;//中间面片for (int i = 0; i < xGridCount - 2; i++, _t += 6, vMid++){SetQuad(_triangles, _t, vMid, vMid + 1, vMid + xGridCount - 1, vMid + xGridCount);mesh.triangles = _triangles;yield return null;}//最后一个面SetQuad(_triangles, _t, vMid, vMax, vMid + xGridCount - 1, vMax + 1);mesh.triangles = _triangles;_t += 6;yield return null;}int vTop = vMin - 2;//第一个面SetQuad(_triangles, _t, vMin, vMid, vMin - 1, vTop);mesh.triangles = _triangles;_t += 6;yield return null;for (int i = 0; i < xGridCount - 2; i++, vMid++, vTop--){//中间面SetQuad(_triangles, _t, vMid, vMid + 1, vTop, vTop - 1);mesh.triangles = _triangles;_t += 6;yield return null;}//最后一行最后一个面SetQuad(_triangles, _t, vMid, vTop - 2, vTop, vTop - 1);mesh.triangles = _triangles;_t += 6;yield return null;}private IEnumerator GenerateBottom(Mesh mesh, int circleVextexCount){int vMin = circleVextexCount - 1;int vMid = _vertices.Length - (xGridCount - 1) * (zGridCount - 1);//第一行,第一面SetQuad(_triangles, _t, vMin, vMid, 0, 1);_t += 6;mesh.triangles = _triangles;yield return null;int vMax = 1;//第一行,中间面for (int i = 0; i < xGridCount - 2; i++, _t += 6, vMax++, vMid++){SetQuad(_triangles, _t, vMid, vMid + 1, vMax, vMax + 1);mesh.triangles = _triangles;yield return null;}//第一行,最后面SetQuad(_triangles, _t, vMid, vMax + 2, vMax, vMax + 1);_t += 6;mesh.triangles = _triangles;yield return null;vMid++;vMax += 2;for (int z = 0; z < zGridCount - 2; z++, vMin--, vMid++, vMax++){//第一面SetQuad(_triangles, _t, vMin - 1, vMid, vMin, vMid - xGridCount + 1);_t += 6;mesh.triangles = _triangles;yield return null;//中间面for (int i = 0; i < xGridCount - 2; i++, _t += 6, vMid++){SetQuad(_triangles, _t, vMid, vMid + 1, vMid - xGridCount + 1, vMid - xGridCount + 2);mesh.triangles = _triangles;yield return null;}//最后面SetQuad(_triangles, _t, vMid, vMax + 1, vMid - xGridCount + 1, vMax);_t += 6;mesh.triangles = _triangles;yield return null;}vMid = vMid - xGridCount + 1;//最后行,第一面SetQuad(_triangles, _t, vMin - 1, vMin - 2, vMin, vMid);_t += 6;mesh.triangles = _triangles;yield return null;int vBottom = vMin - 2;//最后行,中间面for (int i = 0; i < xGridCount - 2; i++, _t += 6, vBottom--, vMid++){SetQuad(_triangles, _t, vBottom, vBottom - 1, vMid, vMid + 1);mesh.triangles = _triangles;yield return null;}//最后行,最后面SetQuad(_triangles, _t, vBottom, vBottom - 1, vMid, vBottom - 2);_t += 6;mesh.triangles = _triangles;yield return null;}private void SetQuad(int[] triangles, int i, int v00, int v10, int v01, int v11, int circleVextexCount){v10 = (v00 / circleVextexCount) * circleVextexCount + v10 % circleVextexCount;v11 = (v01 / circleVextexCount) * circleVextexCount + v11 % circleVextexCount;SetQuad(triangles, i, v00, v10, v01, v11);}//每个面片 6个顶点下标序列private void SetQuad(int[] triangles, int i, int v00, int v10, int v01, int v11){//第1个三角面triangles[i] = v00;triangles[i + 1] = v01;triangles[i + 2] = v10;//第2个三角面triangles[i + 3] = v01;triangles[i + 4] = v11;triangles[i + 5] = v10;}//圆角四边形部分逻辑private Vector3 SetNormal(int i){var vextex = _vertices[i];var inner = vextex;if (vextex.x < _r){inner.x = _r;}else if (vextex.x > xGridCount - _r){inner.x = xGridCount - _r;}if (vextex.y < _r){inner.y = _r;}else if (vextex.y > yGridCount - _r){inner.y = yGridCount - _r;}if (vextex.z < _r){inner.z = _r;}else if (vextex.z > zGridCount - _r){inner.z = zGridCount - _r;}_normals[i] = (vextex - inner).normalized;return inner;}private void ResetVextexPos(int i, Vector3 inner){_vertices[i] = _normals[i] * _r + inner;}
}

unity---Mesh网格编程(四)相关推荐

  1. 【Unity】Mesh网格编程(三)万能网格几何形体

    用一个通用代码,实现各种锥.柱.管状体的网格创建. 非原创的同系列.虽然总觉得代码上可以再优化,但是实现的功能已经超级屌了. 真是没有不能做的,只有想不到的. 原文: Mesh网格编程(二) 万能网格 ...

  2. Mesh网格编程(一) 流体水

    通过Mesh网格随Sin函数实时变化模拟液体的流动,从而达到动态水的效果. Mesh网格编程步骤: 一:确定数量 确定该几何图形应有多少个三角形面,顶点坐标.顶点序列.UV贴图.法线向量皆为三角形面数 ...

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

    前言 事隔四个多月,第二篇网格编程原创,本次献给大家的是麦比乌斯环. 其实这个早就想做了,还是轻松下来的时候思绪转的快. 不废话,先看效果: 博文首发:http://blog.csdn.net/duz ...

  4. unity中Mesh网格编程

    上图是效果 一.关于mesh的意义 有了mesh网格,物体才能被渲染出来. (1)mesh中包含顶点, mesh.vertices (2)顶点对应的uv(一张图的uv左下角00,右上角11) mesh ...

  5. Unity Mesh网格合并

    Mesh网格合并通常是优化中常用的小手段,目的是为了减少drawcall,大量的drawcall会造成CPU的性能瓶颈.例如下图中船只里的钢材货物,由诸多钢材模型堆砌而成. 我们将其放在一个空场景里查 ...

  6. [Unity] Mesh网格位置偏移

    需求: 在一个绘制好的mesh上面,在鼠标所指的那个六边形处,再画出来一个红色的六边形. 问题: 鼠标的位置是A,gameobject也被设置在A,但是六边形Mesh却画在了B 代码: private ...

  7. 学习笔记:unity通过Mesh网格绘制图形:三角形正方体圆柱

    一,介绍 Mesh类:通过脚本创建或是获取网格的类,网格包含多个顶点和三角形数组.顶点信息包含坐标和所在面的法线. unity中3D的世界的所有图形全部都是由三角形构成的. 比如unity已经装配好的 ...

  8. Unity Mesh基础系列(一)生成网格(程序生成)

    目录 1 渲染事物 2 创建顶点网格 3 创建Mesh 4 生成附加顶点数据 本文主要内容: 1.创建一个点阵网格 2.用协程分析点阵网格的位置 3.用三角形定义表面 4.自动生成法线 5.增加纹理坐 ...

  9. 网格编程基础--01

    (原文链接:https://catlikecoding.com/unity/tutorials/procedural-grid/) 创建网格点 使用协程分析网格点的布局 定义三角面 自动生成法线 添加 ...

最新文章

  1. Python数据挖掘1:创建一位数组和二维数组,取最大最小值,切片
  2. c语言编程存航线,C语言编程飞机订票系统如何设计?
  3. PTA 基础编程题目集 7-17 爬动的蠕虫 C语言
  4. Peter R. Rizun:“比特币现金社区的目标是全球80亿人使用BCH”
  5. CSS3 flexbox 布局 ---- flex项目属性介绍
  6. Binder 和parcel 讲解
  7. KALI Linux中GURB安装失败如何处理
  8. DTD与XML的关系。。说的不错,拿来看看,学习了
  9. python中functools_Python中functools模块的常用函数解析
  10. OpenGL(一)二维图形的绘制:一个简单的绘制矩形程序
  11. 是男人就下100层【第二层】——帮美女更衣(2)
  12. Python问题:UnsortedIndexError: ‘MultiIndex slicing requires the index to be lexsorted: slicing on lev
  13. FRM-10102错误解决
  14. 数据服务门槛再提升,这个“TOP1玩家”凭何再度领军?
  15. 计算机表格的名次怎么弄,excel表格怎么给成绩排名
  16. C++关键段、原子锁、互斥量及信号量的实现和区别
  17. MyBatis 3.2.8 用户手册 4.1.5 Result Maps
  18. 18届大专实习生2020总结
  19. android mvvm官方demo,Android MVVM实战Demo完全解析
  20. 阿语python美多商城-商品-商品详情页之第6.6.1节商品详情页分析和准备

热门文章

  1. idea企业开发之插件推荐
  2. Delphi编程语言初学总结
  3. JESD204B接口调试记录3 - 总结
  4. win7修改mac地址的三种方法
  5. 怎么解密MD5,常见的MD5解密方法,一看就会
  6. 西门子smart200和西门子伺服V90三轴程序 包括smart200PLC 程序和西门子smart触摸屏程序
  7. java模拟post请求上传图片
  8. 教你一招解决百度网盘限速
  9. MySql-字符串拼接函数
  10. 独秀日记:刚抱了*冰冰睡觉一个星期,就开始想*子怡了