初识Unity Mesh
Mesh概念:Mesh是Unity中的一个组件,称为网格组件。通俗的讲,Mesh是指模型的网格,3D模型是由多边形拼接而成,而多边形实际上是由多个三角形拼接而成的。所以一个3D模型的表面其实是由多个彼此相连的三角面构成。三维空间中,构成这些三角形的点和边的集合就是Mesh。
Mesh组成:
1、顶点坐标数组vertexes
2、顶点在uv坐标系中的位置信息数组uvs
3、三角形顶点顺时针或者逆时针索引数组triangles
4、MeshFiler组件,用于增加mesh属性
5、MeshRender组件,增加材质并渲染出来。
6、可能还需要每个顶点的法线的数组normals
using UnityEngine;
using UnityEditor;
using System.Collections; public class GenMesh
{
[MenuItem("GameEditor/scene/Weather/GenMesh")]
static public void GenMeshM()
{
Mesh m1 = CreateRect();
AssetDatabase.CreateAsset(m1, "Assets/_Resource/model/prefab/weather/m1.asset");
} public static Mesh CreateRect()
{
Mesh mesh = new Mesh(); int particleNum = ;
//顶点坐标
Vector3[] verts = new Vector3[ * particleNum];
//uv坐标
Vector2[] uvs = new Vector2[ * particleNum];
//三角形索引
int[] tris = new int[ * * particleNum]; Vector3 position;
for (int i = ; i < particleNum; i++)
{
int i4 = i * ;
int i6 = i * ; position.x = * i;
position.y = * i;
position.z = ; //顶点坐标
verts[i4 + ] = position;
verts[i4 + ] = position + new Vector3(, , );
verts[i4 + ] = position + new Vector3(, , );
verts[i4 + ] = position + new Vector3(, , ); //四个顶点在UV坐标系中的位置
uvs[i4 + ] = new Vector2(0.0f, 0.0f);
uvs[i4 + ] = new Vector2(1.0f, 0.0f);
uvs[i4 + ] = new Vector2(1.0f, 1.0f);
uvs[i4 + ] = new Vector2(0.0f, 1.0f); //顺时针绘制三角形0 1 2 / 0 2 3
tris[i6 + ] = i4 + ;
tris[i6 + ] = i4 + ;
tris[i6 + ] = i4 + ;
tris[i6 + ] = i4 + ;
tris[i6 + ] = i4 + ;
tris[i6 + ] = i4 + ;
} mesh.vertices = verts;
mesh.triangles = tris;
mesh.uv = uvs;
mesh.RecalculateBounds(); return mesh;
} public static Mesh CreateCircle()
{
Mesh mesh = new Mesh(); int particleNum = ;
Vector3[] verts = new Vector3[ * particleNum];
Vector2[] uvs = new Vector2[ * particleNum];
int[] tris = new int[ * * particleNum]; Vector3 position;
for (int i = ; i < particleNum; i++)
{
int i4 = i * ;
int i6 = i * ; position.x = * i;
position.y = * i;
position.z = ; verts[i4 + ] = position;
verts[i4 + ] = position + new Vector3(, , );
verts[i4 + ] = position + new Vector3(, , );
verts[i4 + ] = position + new Vector3(, , ); uvs[i4 + ] = new Vector2(0.0f, 0.0f);
uvs[i4 + ] = new Vector2(1.0f, 0.0f);
uvs[i4 + ] = new Vector2(1.0f, 1.0f);
uvs[i4 + ] = new Vector2(0.0f, 1.0f); //顺时针绘制三角形0 1 2 / 0 2 3
tris[i6 + ] = i4 + ;
tris[i6 + ] = i4 + ;
tris[i6 + ] = i4 + ;
tris[i6 + ] = i4 + ;
tris[i6 + ] = i4 + ;
tris[i6 + ] = i4 + ;
} mesh.vertices = verts;
mesh.triangles = tris;
mesh.uv = uvs;
mesh.RecalculateBounds(); return mesh;
}
}
代码示例生成的mesh是这个样子,未添加MeshRender,即没有材质和渲染的情况:
添加MeshRender,即有材质和渲染的情况:
using UnityEngine;
using System.Collections; /*仅仅创建Mesh
*
*
*/
public class CreatMesh : MonoBehaviour
{ private GameObject mMesh;
private Material mMaterial; /* Mesh属性
* 长宽
* 段数
* 高度
* 高度差
*/
private Vector2 size;//长度和宽度
private float minHeight = -;//最小高度
private float maxHeight = ;//最大高度
private Vector2 segment;//长度的段数和宽度的段数
private float unitH;//最小高度和最大高度只差,值为正 /* 顶点属性
* 顶点
* uv
* 三角形
*/
private Vector3[] vertexes;//顶点数
private Vector2 uvs;//uvs坐标
private int[] triangles;//三角形索引 void Start()
{
creatMesh(, , , , -, );
} private void creatMesh(float width, float height, uint segmentX, uint segmentY, int min, int max)
{
size = new Vector2(width, height);
maxHeight = max;
minHeight = min;
unitH = maxHeight - minHeight;
segment = new Vector2(segmentX, segmentY); if (mMesh != null)
{
Destroy(mMesh);
}
mMesh = new GameObject();
mMesh.name = "CreateMesh"; computeVertexes();
DrawMesh();
} private void computeVertexes()
{
int sum = Mathf.FloorToInt((segment.x + ) * (segment.y + ));//顶点总数
float w = size.x / segment.x;//每一段的长度
float h = size.y / segment.y; GetTriangles(); int index = ;
vertexes = new Vector3[sum];
for (int i = ; i < segment.y + ; i++)
{
for (int j = ; j < segment.x + ; j++)
{
float tempHeight = ;
vertexes[index] = new Vector3(j * w, , i * h);
index++;
}
}
} private void DrawMesh()
{
Mesh mesh = mMesh.AddComponent<MeshFilter>().mesh;//网格
mMesh.AddComponent<MeshRenderer>();//网格渲染器 mMaterial = new Material(Shader.Find("Diffuse"));//材质 mMesh.GetComponent<Renderer>().material = mMaterial; /*设置mesh*/
mesh.Clear();//更新
mesh.vertices = vertexes;
//mesh.uv
mesh.triangles = triangles; mesh.RecalculateNormals();
mesh.RecalculateBounds(); } private int[] GetTriangles()
{
int sum = Mathf.FloorToInt(segment.x * segment.y * );//三角形顶点总数
triangles = new int[sum];
uint index = ;
for (int i = ; i < segment.y; i++)
{
for (int j = ; j < segment.x; j++)
{
int role = Mathf.FloorToInt(segment.x) + ;
int self = j + (i * role);
int next = j + ((i + ) * role);
//顺时针
triangles[index] = self;
triangles[index + ] = next + ;
triangles[index + ] = self + ;
triangles[index + ] = self;
triangles[index + ] = next;
triangles[index + ] = next + ;
index += ;
}
}
return triangles;
}
}
初识Unity Mesh的更多相关文章
- Unity Mesh 初体验
什么是Mesh Mesh是Unity中的一个组件,称为网格组件.通俗的讲,Mesh是指模型的网格,3D模型是由多边形拼接而成,而一个复杂的多边形,实际上是由多个三角面拼接而成.所以一个3D模型的表面是 ...
- 【原创翻译】初识Unity中的Compute Shader
一直以来都想试着自己翻译一些东西,现在发现翻译真的很不容易,如果你直接把作者的原文按照英文的思维翻译过来,你会发现中国人读起来很是别扭,但是如果你想完全利用中国人的语言方式来翻译,又怕自己理解的不到位 ...
- unity, mesh Collider
关闭mesh Renderer以便查看mesh Collider "For Unity 5, we must also select "Convex" on the Me ...
- Unity mesh 合并
簡介: 基本上就是把 很多物體結合成一個物體 的作法,這種做法有很多優點,例如:1. 提高效能2. 統一材質 (只要建立一個材質,就能控制.分配給所有物體)3. 動畫控制方便 (像是你要在 Unity ...
- unity Mesh(网格)的使用
创建两个三角形合成的矩形网格: GameObject obj= new GameObject(); MeshRenderer meshRenderer=obj.AddComponent<Mesh ...
- Unity MMORPG游戏开发教程(一)——初识Unity
五邑隐侠,本名关健昌,10年游戏生涯,现隐居五邑.本系列文章以C#为介绍语言,基于Unity2017.4.x. 一.环境搭建 我使用的是Unity+VSCode,用的是mac系统,windows的自己 ...
- 【Unity】2.1 初识Unity编辑器
分类:Unity.C#.VS2015 创建日期:2016-03-26 一.简介 本节要点:了解Unity编辑器的菜单和视图界面,以及最基本的操作,这是入门的最基础部分,必须掌握. 二.启动界面 双击桌 ...
- 介绍用C#和VS2015开发基于Unity架构的2D、3D游戏的技术
[Unity]13.3 Realtime GI示例 摘要: 分类:Unity.C#.VS2015 创建日期:2016-04-19 一.简介 使用简单示例而不是使用实际示例的好处是能让你快速理解光照贴图 ...
- 【Unity】2.0 第2章 Unity编辑器和基本操作
分类:Unity.C#.VS2015 创建日期:2016-03-26 本章要点: 1.掌握Unity 5.3.4编辑器视图和菜单项及其含义,这是入门的最基础部分,必须掌握. 2.了解最基本的操作,先学 ...
随机推荐
- 升级Xcode 10 后报错问题记录([CP] Copy Pods Resources)
1.升级Xcode到Version 10.0 (10A255)后,运行已有项目,报如下错误: error: Multiple commands produce '/Users/galahad/Libr ...
- PHP中 post方法 与 get方法 的区别
1.Get 方法通过 URL 请求来传递用户的数据,将表单内各字段名称与其内容,以成对的字符串连接,置于 action 属性所指程序的 url 后,如[url]http://www.domain.co ...
- Daily Scrum4 11.6
昨天的任务按时完成了,但是通过不到两周的时间,我们的工作依旧停留在修改上届学长代码中.今天上课和老师提出了这样的问题,助教在TFS上重新加载了10级学长的代码. 从上届学长代码那里我们发现,他们没有实 ...
- 2-Tenth Scrum Meeting20151210
任务分配 闫昊: 今日完成:请假.(编译) 明日任务:参加会议讨论,安排任务分工. 唐彬: 今日完成:请假.(编译) 明日任务:参加会议讨论,安排任务分工. 史烨轩: 今日完成:请假.(编译) 明日任 ...
- Struts2 核心流程
1.Struts2架构图 这是Struts2官方站点提供的Struts 2 的整体结构. 执行流程图 2.Struts2部分类介绍 这部分从Struts2参考文档中翻译就可以了. ActionM ...
- Software-Defined Networking A Comprehensive Survey(一)
传统网络:1 复杂,难于管理 2 很难实现根据之前定义的方案进行配置,3 对于缺陷.变化不能够再次进行配置 4 控制和数据平面绑定在一起,使许多缺陷难于解决 SDN网络:通过打破传统网络垂直整合,从底 ...
- 利用Hibernate子查询(in) 得到部分字段(实体类的构造函数)
感人= = 终于弄好了 String hql="select new Shop(s.strid,s.shopname,s.tradearea,s.discountinfo,s.beginti ...
- delphi 删除字符串的回车、空格、Tab键
myStr:=StringReplace(myStr, chr(13)+chr(10), '', [rfReplaceAll]);//删除回车 myStr:=StringReplace(my ...
- js中的extend,可实现浅拷贝深拷贝
js中的extend 1. JS中substring与substr的区别 之前在项目中用到substring方法,因为C#中也有字符串的截取方法Substring方法,当时也没有多想就误以为 ...
- SQL中MAX()和MIN()函数的使用(比较字符串的大小)
在SQL数据库中,最大/最小值函数—MAX()/MIN()是经常要用到的,下面就将为您分别介绍MAX()函数和MIN()函数的使用,供您参考,希望对您学习SQL数据库能有些帮助. 当需要了解一列中的最 ...