前言

事隔四个多月,第二篇网格编程原创,本次献给大家的是麦比乌斯环。

其实这个早就想做了,还是轻松下来的时候思绪转的快。

不废话,先看效果:

博文首发:http://blog.csdn.net/duzixi

工程资源准备:

1. 本脚本要放在Editor文件夹下

2. 在资源中有一个空对象,作为顶点预设体,创建时要引入

3. 在Resources文件夹下有一个材质,叫"M"

源代码:

using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Collections.Generic;
/// <summary>
/// 脚本功能:扩展Unity编辑器,在GameObject目录下添加“麦比乌斯带”目录以向导方式生成麦比乌斯带3D模型对象
/// 添加对象:无(在Editor文件夹中)
/// 创建时间:2015年6月27日14:16:16
/// 创建人员:杜子兮
/// 版权声明:2015 www.duzixi.com
/// 技术要点:
/// 1. 通过生成,父子化和旋转空对象确认各个顶点位置
/// 2. 根据几何顶点位置生成网格顶点位置
/// </summary>
public class CreateMesh : ScriptableWizard {public int n = 50;       // 切割数public float r = 5;      // 半径public float h = 0.2f;   // 半高public GameObject point; // 顶点的预设体(选择适当的图标可显示顶点号)[MenuItem("GameObject/麦比乌斯带")]static void Create() {DisplayWizard<CreateMesh>("创建麦比乌斯带", "创建");}void OnWizardCreate() {// Step 1: 确定顶点位置List<Vector3> vList = new List<Vector3>();GameObject obj = new GameObject();  // 实例化要生成的目标对象obj.name = "麦比乌斯带";float angle = 2 * Mathf.PI / n;     // 计算单位弧度for (int i = 0; i < n; i++){// 分别计算带子上中下三个顶点位置并保存到数组中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 };// 计算中心点的角度,使之朝向坐标原点Quaternion rot = Quaternion.Euler(new Vector3(0, -90 - 360 / n * i, 0));// 生成顶点对象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;// 设置顶点名字(用于调试)p0.name = "c" + i;p1.name = 2 * i + "";p2.name = 2 * i + 1 + "";// 让上下边缘的点认中心点为父对象p0.transform.parent = obj.transform;p1.transform.parent = p0.transform;p2.transform.parent = p0.transform;// 通过旋转中心点,改变上下边缘顶点的位置p0.transform.Rotate(Vector3.right, 360 / n * i);// 将上下边缘顶点添加到顶点列表中vList.Add(p1.transform.position);vList.Add(p2.transform.position);}// Step 2: 生成顶点数组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];}// 结合处顶点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: 给目标对象添加网格组件obj.AddComponent<MeshFilter>();obj.AddComponent<MeshRenderer>();Mesh mesh = new Mesh();mesh.vertices = Vs;mesh.triangles = Ts;obj.GetComponent<MeshFilter>().mesh = mesh;// Step 5: 载入材质资源,添加给目标对象Material m = Resources.Load<Material>("M");obj.renderer.sharedMaterial = m;}}

后记:

形状不是严格的麦比乌斯环,渲染只渲染了一面,目前没有加法线和切线。

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

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

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

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

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

  3. unity中Mesh网格编程

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

  4. Unity Mesh网格合并

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

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

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

  6. unity---Mesh网格编程(四)

    目录 1.绘制一个圆角正方体 2.代码 unity---Mesh网格编程(三)这里说了Mesh绘制一个正方体或立方体 1.绘制一个圆角正方体 2.代码 //X.Y.Z轴正方体数量足够多的偶数 半径取X ...

  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. php伪类型,解密PHP伪类型和伪变量的含义
  2. sklearn(五)计算acc:使用metrics.accuracy_score()计算分类的准确率
  3. java程序实验总结_Java Socket 编程实验总结
  4. 韦恩图——帮助你更好地表达多个数据集合之间的相交关系
  5. (需求实战_进阶_02)SSM集成RabbitMQ 关键代码讲解、开发、测试
  6. 关于extern C
  7. VS2013 生成sqlite3动态连接库
  8. 英雄联盟微信登录服务器怎么回事,英雄联盟微信怎么登陆 lol微信登录功能开放大区一览...
  9. poi excel 导入导出
  10. excelexportentity中设置null不显示的方法_学习笔记-Java中的$符
  11. php微信分享 无图标,PHP+微信分享自定义小图标
  12. linux 之pvs磁盘报错
  13. 小程序 打开地图导航
  14. 你是否同意放开二胎政策
  15. 精尽 Dubbo 原理与源码专栏( 已经完成 69+ 篇,预计总共 75+ 篇 )
  16. EAGLE 电路板编辑器中的“层”概念
  17. Origin与OriginPro 版本一览图
  18. 【360安全卫士显示界面异常解决】
  19. 中文编程专栏月报:2017年12月
  20. 今日收获 --- 场景中大量集合体的优化

热门文章

  1. 永中(Evermore)之梦
  2. Temporal action localization in untrimmed videos via Multi-stage CNNs SCNN论文阅读笔记
  3. Android -- 购物车
  4. BFC、IFC、GFC 和 FFC 的区别?
  5. Linux账号与群组系统介绍
  6. 硬件设计38之什么是MCASP?
  7. 【硬件】常见芯片封装技术
  8. 凯文·米特尼克被称为世界上“头号电脑黑客”(百度搜索)
  9. scikit-learn学习笔记-bili莫烦
  10. next在java什么意思_Java中,一个类里面的关键字 next 是什么意思