【Unity】Mesh网格编程(一)正二十面体
前言
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网格编程(一)正二十面体相关推荐
- 【Unity】Mesh网格编程(三)万能网格几何形体
用一个通用代码,实现各种锥.柱.管状体的网格创建. 非原创的同系列.虽然总觉得代码上可以再优化,但是实现的功能已经超级屌了. 真是没有不能做的,只有想不到的. 原文: Mesh网格编程(二) 万能网格 ...
- Mesh网格编程(一) 流体水
通过Mesh网格随Sin函数实时变化模拟液体的流动,从而达到动态水的效果. Mesh网格编程步骤: 一:确定数量 确定该几何图形应有多少个三角形面,顶点坐标.顶点序列.UV贴图.法线向量皆为三角形面数 ...
- 【Unity】Mesh网格编程(四)麦比乌斯环
前言 事隔四个多月,第二篇网格编程原创,本次献给大家的是麦比乌斯环. 其实这个早就想做了,还是轻松下来的时候思绪转的快. 不废话,先看效果: 博文首发:http://blog.csdn.net/duz ...
- unity中Mesh网格编程
上图是效果 一.关于mesh的意义 有了mesh网格,物体才能被渲染出来. (1)mesh中包含顶点, mesh.vertices (2)顶点对应的uv(一张图的uv左下角00,右上角11) mesh ...
- Unity Mesh网格合并
Mesh网格合并通常是优化中常用的小手段,目的是为了减少drawcall,大量的drawcall会造成CPU的性能瓶颈.例如下图中船只里的钢材货物,由诸多钢材模型堆砌而成. 我们将其放在一个空场景里查 ...
- [Unity] Mesh网格位置偏移
需求: 在一个绘制好的mesh上面,在鼠标所指的那个六边形处,再画出来一个红色的六边形. 问题: 鼠标的位置是A,gameobject也被设置在A,但是六边形Mesh却画在了B 代码: private ...
- 学习笔记:unity通过Mesh网格绘制图形:三角形正方体圆柱
一,介绍 Mesh类:通过脚本创建或是获取网格的类,网格包含多个顶点和三角形数组.顶点信息包含坐标和所在面的法线. unity中3D的世界的所有图形全部都是由三角形构成的. 比如unity已经装配好的 ...
- Unity Mesh基础系列(一)生成网格(程序生成)
目录 1 渲染事物 2 创建顶点网格 3 创建Mesh 4 生成附加顶点数据 本文主要内容: 1.创建一个点阵网格 2.用协程分析点阵网格的位置 3.用三角形定义表面 4.自动生成法线 5.增加纹理坐 ...
- 网格编程基础--01
(原文链接:https://catlikecoding.com/unity/tutorials/procedural-grid/) 创建网格点 使用协程分析网格点的布局 定义三角面 自动生成法线 添加 ...
- unity---Mesh网格编程(四)
目录 1.绘制一个圆角正方体 2.代码 unity---Mesh网格编程(三)这里说了Mesh绘制一个正方体或立方体 1.绘制一个圆角正方体 2.代码 //X.Y.Z轴正方体数量足够多的偶数 半径取X ...
最新文章
- 软件包管理 之 软件在线升级更新yum 图形工具介绍
- list group by java_Java List集合实现MySQL Group By功能
- 比较两个文件夹图像相似度
- 2019年安徽高考最高分出炉:文科681分 理科710分
- 九江学院计算机主任黄冬久,陈春生副校长到实验中间调研引导工作
- SpringBoot+Thymeleaf+DataTables实现数据的查询与显示
- 4.3.7 基于类的访问权限
- oracle诊断,Oracle 诊断事件列表
- (一)Eureka搭建服务注册中心
- JSP 中的几种注释
- 定义域是取交集吗_高中数学;函数定义域秒解技巧(学好函数突破数学)
- sqoop2 mysql导入hdfs_Sqoop2入门之导入关系型数据库数据到HDFS上(sqoop2-1.99.4版本)
- 日月如梭,玩转JavaScript日期
- 2021年六级翻译:云南
- 春天最美的成语,都在古诗词里!
- 提问的力量四:提问的艺术-体验学习中提问的技巧
- java爬取查询四六级成绩_GitHub - Frank17/cet-grade: 英语四六级成绩查询工具
- 详细解读Latent Diffusion Models:原理和代码
- 动手创建docker镜像
- MSSQL中间库对接MySQL