Unity Mesh
首先了解一下Unity官方对Mesh的解释:网格包含顶点和多个三角面数组,三角面数组只是顶点数组的下标,一个三角面对应三个下标。对于每一个顶点对会有法线,UV纹理坐标,颜色和切线。这些可以根据意愿增减。所有顶点信息都会保存在单独的同样大小的数组中,所以如果你的网格有10个顶点,那么你需要大小为10的数组来保存法线和其他属性。
- 介绍: Mesh是Unity中的一个组件,称为网格组件,一般来说,Mesh指模型的网格,3D模型是由多边形拼接而成的,而一个复杂的多边形实际上是由多个三角面拼接而成的。所以一个3D模型的表面是由多个彼此相连的三角面构成的,三维空间中,构成这些三角面的点以及三角形的边的集合就是Mesh:如图1
图1
- 所以建模就是要画一系列的三角形,而定位一个三角形就只需要三个顶点。比如要画一个五边形:
它有五个顶点,但在Unity中是通过它转换成一系列的三角形来绘制的,所以现在想一想要用几个三角形和通过什么样的组合才能拼成上面的五边形呢?
(1) 第一种:由(1,2,3),(1,3,4)和(1,4,5)三个三角形组成
(2)第二种:由(2,1,5),(2,4,5)和(2,3,4)三个三角形组成
当然,组成同一个形状的三角形的排列方案有很多种,但不是所有的方案都能组合成我们希望的图形,比如:
在Unity Mesh类中,数组mesh.vertices就是用于存储三角形顶点坐标。当顶点数超过三个时,连接点的顺序不同就会绘制出不同形状的图形,数组mesh.triangles就是用来记录三角形的顺序的,由于每绘制一个三角形都需要知道其三个顶点的顺序,那么绘制n个三角形就需要知道3*n个点的顺序。
- Mesh是Unity内的一个组件(网格组件),3D网格是Unity中最重要的图形元素,在Unity中存在多种组件用于渲染标准网格或蒙皮网格、拖尾、3D线条 。(Mesh Filter 网格过滤器
Text Mesh 网格渲染器
Mesh Renderer 文本渲染器
Skinned Mesh Renderer 蒙皮网格渲染器)
- 比较通俗的理解是:Mesh是指模型的网格,建模就是建网格。Mesh包含几个主要属性(顶点坐标、法线、纹理坐标、三角形绘制序列等),因此建网格就是画三角形,画三角形就是定位三个点。
而Mesh Filter组件内包含一个Mesh组件,可以根据MeshFilter获得模型网格的组件,也可以为MeshFilter设置Mesh内容。
Mesh Renderer是用于把网格渲染出来的组件,MeshFilter的作用是把Mesh扔给MeshRenderer将模型或几何体绘制显示
- UV: (1)百度解释:这里是指u,v纹理贴图坐标(和空间模型的X,Y,Z轴类似),他定义了图片上每个点的位置信息,这些点与3D模型是相互联系的,以决定表面纹理贴图的位置,UV就是将图像上的每一个点精确对应到模型物体的表面。
- 材质、贴图、纹理的区别: (知乎回答)
整个CG领域中这三个概念差不多,在一般的实践中,大致上的层级关系是:材质(Material)包含贴图(Map),贴图包含纹理(Texture) 纹理是最基本的数据输入单位,游戏领域基本上都用的是位图,此外还有程序化生成的纹理(Procedural Texture) 贴图(Map)其实包含了另一层含义:映射,其功能是把纹理通过UV坐标映射到3D物体表面。贴图包含了除了纹理以外其他很多信息,比如说:UV坐标,贴图输入输出控制等。 材质是一个数据集,主要功能就是给渲染器提供数据和光照算法,贴图就是其中数据的一部分,根据用途不同,贴图也会被分成不同的类型,比如:Diffuse,Map,Specular Map,Normal Map,Gloss Map等,另一个重要部分就是光照模型shader,用于实现不同的效果。 |
- 如果导入的模型的网格具有蒙皮信息,Unity会自动创建一个Skinned Mesh Renderer
注意:在使用Mesh Filter时,必须同时提供一个MeshRenderer组件,因为需要将其渲染出来,
Text Mesh:文本过滤器,用于显示3D文字的
Mesh Renderer:网格渲染器,用于渲染网格显示游戏对象
Mesh Renderer的Material可以放置多张贴图,用于显示游戏对象的外表
private void GetTriangle() { MeshFilter filter = gameObject.AddComponent<MeshFilter>(); Mesh mesh=new Mesh(); filter.sharedMesh = mesh; //构建三角形的三个顶点,并赋值给mesh.vertices mesh.vertices=new Vector3[]{new Vector3(0,0,1),new Vector3(0,2,0),new Vector3(2,0,5),}; //构建三角形的顶点顺序 mesh.triangles=new int[]{0,1,2}; mesh.RecalculateNormals(); mesh.RecalculateBounds(); //使用shader构建一个材质,并设置材质颜色 Material mat=new Material(Shader.Find("Diffuse")); mat.SetColor("_Color",Color.yellow); //构建一个MeshRenderer并把上面的材质赋值给renderer.sharedMaterial //使其把上面构造的mesh渲染到屏幕上 MeshRenderer renderer = gameObject.AddComponent<MeshRenderer>(); renderer.sharedMaterial = mat; } private void GetPentagon() { MeshFilter filter = gameObject.AddComponent<MeshFilter>(); Mesh mesh = new Mesh(); filter.sharedMesh = mesh; mesh.vertices = new Vector3[] { new Vector3(1, 0, 0), new Vector3(3, 0, 0), new Vector3(0, 2, 0), new Vector3(4, 2, 0), new Vector3(2, 4, 0), }; mesh.triangles = new int[] {0, 3, 1, 0, 2, 3, 2, 4, 3}; mesh.RecalculateNormals(); mesh.RecalculateBounds(); Material mat = new Material(Shader.Find("Diffuse")); mat.SetColor("_Color",Color.blue); MeshRenderer renderer = gameObject.AddComponent<MeshRenderer>(); renderer.sharedMaterial = mat; } |
原文地址:https://www.cnblogs.com/DevMi/p/mesh.html