前言

Mesh类是Unity用脚本创建和修改3D模型的重要脚本类。

本文以自定义编译器菜单的方式,实现了Unity创建正二十面体的功能扩展。

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

添加了各种Shader材质球+Halo的效果图:

关于Mesh编程相关内容网上有很多资料,这里就不再赘述了。

步骤一:

创建Editor文件夹(若有就不用),将以下源代码保存为MyEditor.cs文件,存入文件夹中。

源代码:

/// <summary>
/// Mesh网格编程 —— 点击拓展菜单,创建正二十面体
/// Created by 杜子兮(duzixi.com) 2015.2.20
/// www.lanou3g.com All Rights Reserved.
/// </summary>using UnityEngine;
using UnityEditor;          // 使用编译器类
using System.Collections;public class MyEditor : EditorWindow {// 注意:该类继承EditorWindow,只能包含静态成员static Mesh mesh;            // 网格static Vector3[] Vs;         // 模型顶点坐标数组static Vector2[] UVs;        // UV贴图坐标static Vector3[] normals;    // 法线static Vector4[] tangents;   // 切线static int[] Ts;             // 三角形的点序列// 添加菜单项,并放置最顶端[MenuItem("GameObject/Create Other/正二十面体", false, -30)]static void CreateRegular(){// 先按12个顶点开辟顶点数组Vs = new Vector3[12];// 正二十面体顶点公式(度娘可查)float m = Mathf.Sqrt(50 - 10 * Mathf.Sqrt(5)) / 10;float n = Mathf.Sqrt(50 + 10 * Mathf.Sqrt(5)) / 10;// 按公式顺序对顶点坐标赋值Vs[0] = new Vector3( m, 0, n);Vs[1] = new Vector3( m, 0,-n);Vs[2] = new Vector3(-m, 0, n);Vs[3] = new Vector3(-m, 0,-n);Vs[4] = new Vector3( 0, n, m);Vs[5] = new Vector3( 0,-n, m);Vs[6] = new Vector3( 0, n,-m);Vs[7] = new Vector3( 0,-n,-m);Vs[8] = new Vector3( n, m, 0);Vs[9] = new Vector3(-n, m, 0);Vs[10] = new Vector3( n,-m, 0);Vs[11] = new Vector3(-n,-m, 0);// 正二十面体三角形的点序列Ts = new int[] {6,4,8, 9,4,6, 6,3,9, 6,1,3, 6,8,1, 8,10,1, 8,0,10, 8,4,0, 4,2,0, 4,9,2,9,11,2, 9,3,11, 3,1,7, 1,10,7, 10,0,5,0,2,5, 2,11,5, 3,7,11, 5,11,7, 10,5,7};// 根据面的顺序,重新创建新的顶点数组,用于计算顶点法线Vector3[] newVs = new Vector3[Ts.Length];for (int i = 0; i < newVs.Length; i++) {Debug.Log(Vs[Ts[i]]);newVs[i] = Vs[Ts[i]];}Vs = newVs;UVs = new Vector2[Vs.Length];normals = new Vector3[Vs.Length];tangents = new Vector4[Vs.Length];// 根据新的点,设置三角面的顶点ID并计算点法线for (int i = 0; i < Ts.Length - 2; i+=3) {Vector3 normal = Vector3.Cross(Vs[i + 1] - Vs[i], Vs[i + 2] - Vs[i]);  // 计算点的法线for (int j = 0; j < 3; j++) {Ts[i + j] = i + j;        // 重新设置面的顶点IDnormals[i + j] = normal;  // 点的法线赋值}}// 设置每个点的切线和UVfor (int i = 0; i < Vs.Length; i++) {tangents[i] = new Vector4(-1, 0, 0, -1);    // 切线UVs[i] = new Vector2(Vs[i].x, Vs[i].y);     // UV坐标}// 调用创建对象函数CreateObjectByMesh("Icosahedron");}// 创建对象函数(这个功能提出来,方便以后扩展)static void CreateObjectByMesh(string name) {GameObject regular = new GameObject();  // 创建游戏对象regular.name = name;                    // 根据参数命名regular.AddComponent<MeshFilter>();     // 添加MeshFilter组件regular.AddComponent<MeshRenderer>();   // 添加MeshRenderer组件mesh = new Mesh();                      // 创建网格mesh.vertices = Vs;                     // 网格的顶点mesh.triangles = Ts;                    // 网格的三角形mesh.uv = UVs;                          // 网格的UV坐标mesh.normals = normals;                 // 网格的法线mesh.tangents = tangents;               // 网格的切线regular.GetComponent<MeshFilter>().mesh = mesh; // 添加网格}}

步骤二:

在菜单中选择

GameObject -> Create Other -> 正二十面体

创建正二十面体游戏对象。

步骤三:

可根据喜好添加材质,选择Shander以及其他效果。

后语

正二十面体的实现有一个比较特别的地方,就是顶点数组创建了两次。

因为空间上的规律比较难搞,所以第一次是手动录入的。

但是考虑到要计算好多点法线,第二次顶点数组是根据第一次三角形顶点序列自动生成的。

此外,本例的UV坐标和切线没有太多的处理,贴图相关的功能还有待改善。

【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/) 创建网格点 使用协程分析网格点的布局 定义三角面 自动生成法线 添加 ...

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

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

最新文章

  1. 软件包管理 之 软件在线升级更新yum 图形工具介绍
  2. list group by java_Java List集合实现MySQL Group By功能
  3. 比较两个文件夹图像相似度
  4. 2019年安徽高考最高分出炉:文科681分 理科710分
  5. 九江学院计算机主任黄冬久,陈春生副校长到实验中间调研引导工作
  6. SpringBoot+Thymeleaf+DataTables实现数据的查询与显示
  7. 4.3.7 基于类的访问权限
  8. oracle诊断,Oracle 诊断事件列表
  9. (一)Eureka搭建服务注册中心
  10. JSP 中的几种注释
  11. 定义域是取交集吗_高中数学;函数定义域秒解技巧(学好函数突破数学)
  12. sqoop2 mysql导入hdfs_Sqoop2入门之导入关系型数据库数据到HDFS上(sqoop2-1.99.4版本)
  13. 日月如梭,玩转JavaScript日期
  14. 2021年六级翻译:云南
  15. 春天最美的成语,都在古诗词里!
  16. 提问的力量四:提问的艺术-体验学习中提问的技巧
  17. java爬取查询四六级成绩_GitHub - Frank17/cet-grade: 英语四六级成绩查询工具
  18. 详细解读Latent Diffusion Models:原理和代码
  19. 动手创建docker镜像
  20. MSSQL中间库对接MySQL

热门文章

  1. 锁定计算机后如何显示文字,我的电脑图标和文字后面有拖影怎么去掉
  2. nero 8注册码 Nero Burning Rom V8
  3. C语言学习(一)C语言能干什么?为什么要学习C语言?
  4. 机械专业热门选题 论文+图纸+PPT
  5. 发包Byte速率和发包个数速率和带宽的关系
  6. 渲染巨匠(lightscape) 3.2 SP1 汉化版
  7. N70常用软件大集合
  8. 联想笔记本摄像头故障处理方法
  9. 快速提示:如何在Word 2003中打开.DOCX文件
  10. 比较流行的日志分析软件