前言

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

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

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

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

步骤一:

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

步骤二:

在菜单中选择

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

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

步骤三:

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

/// <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; // 添加网格}}

后语

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

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

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

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

Mesh网格编程(三) 正12面体相关推荐

  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. C语言图形编程(绘图函数部分),C语言图形编程(三、绘图函数-02)12

    C语言图形编程(三.绘图函数-02)12 } 84. putimage() 输出图像函数 功能: 函数putimage()将一个先前保存在内存中的图像输出到屏幕上. 用法: 此函数调用方式为void ...

  6. 网格编程基础--01

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

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

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

  8. EtherCAT运动控制器的PLC编程(三) 电子齿轮

    EtherCAT运动控制器的PLC编程(三) 电子齿轮 电子齿轮模式能够将两轴或多轴联系起来,实现精确的同步运动,从而替代传统的机械齿轮连接. 被跟随的轴称为主轴,跟随的轴为从轴,通过将跟随轴按照某个 ...

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

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

  10. 直线或线段与mesh网格相交的计算

    引言 在采样二指夹爪与mesh网格的抓取点时使用的点接触模型,抽象二指夹爪为一个线段,那么寻找夹爪与物体的接触点就抽象为直线与mesh网格的交点问题,而在mesh中物体表面是以空间三角形保存的,在进一 ...

最新文章

  1. 怎么去控制浏览器对资源文件的处理行为
  2. 设计包含min函数的栈
  3. 易宝典文章——用ISA 2006标准版发布Exchange 2010的OWA系列之申请Excha
  4. @RequestParam的作用
  5. 软著申请时的软件说明书如何制作
  6. 【SQL Server中SMO的简单使用】 (装载)
  7. docker centos7 安装ssh
  8. 8个前端技术学习网站
  9. ppt太大怎么变小,ppt如何压缩变小
  10. python断言使用方法
  11. 生物信息相关岗位及任职要求整理
  12. centos8修改主机名称
  13. 有趣!用太极拳讲分布式理论,真舒服!
  14. 越狱Season 1-Season 1, Episode 3: Cell Test
  15. 如何利用Spring Boot框架开发一个全球化的应用程序
  16. python中有没有switch_为什么python没有switch/case
  17. ssd的smt_联合评测: Optane SSD 在SmartX 超融合 Oracle 场景下的性能表现
  18. 一个朋友椰子 blog上的文章
  19. Foxit PDF Editor 1.5 build 2911 (官方版) 下载
  20. python3 爬虫技巧_用 python 爬虫抓站的一些技巧总结

热门文章

  1. Android基础教程学习(一)
  2. Android 开发系列教程之(一)Android基础知识
  3. 测试@Test启动报错解决方案
  4. 华为vlan简单配置
  5. 如何下载邢台市卫星地图高清版大图
  6. 计算机 服装生产管理的变化,服装生产与管理服装生产管理概述.ppt
  7. zotero中的标准和规范应该用什么类型
  8. 学术期刊英文标点符号使用规范
  9. ROS与Arduino:ros_arduino_bridge功能包的使用解读
  10. php机器人聊天对话框,PHP实现QQ聊天机器人