什么是网格?

Unity Mesh

首先了解一下Unity官方对Mesh的解释:网格包含顶点和多个三角面数组,三角面数组只是顶点数组的下标,一个三角面对应三个下标。对于每一个顶点对会有法线,UV纹理坐标,颜色和切线。这些可以根据意愿增减。所有顶点信息都会保存在单独的同样大小的数组中,所以如果你的网格有10个顶点,那么你需要大小为10的数组来保存法线和其他属性。

  1. 介绍: Mesh是Unity中的一个组件,称为网格组件,一般来说,Mesh指模型的网格,3D模型是由多边形拼接而成的,而一个复杂的多边形实际上是由多个三角面拼接而成的。所以一个3D模型的表面是由多个彼此相连的三角面构成的,三维空间中,构成这些三角面的点以及三角形的边的集合就是Mesh:如图1

图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个点的顺序。

  1. Mesh是Unity内的一个组件(网格组件),3D网格是Unity中最重要的图形元素,在Unity中存在多种组件用于渲染标准网格或蒙皮网格、拖尾、3D线条 。(Mesh Filter   网格过滤器

Text Mesh    网格渲染器

Mesh Renderer  文本渲染器

Skinned Mesh Renderer 蒙皮网格渲染器)

  1. 比较通俗的理解是:Mesh是指模型的网格,建模就是建网格。Mesh包含几个主要属性(顶点坐标、法线、纹理坐标、三角形绘制序列等),因此建网格就是画三角形,画三角形就是定位三个点。

而Mesh Filter组件内包含一个Mesh组件,可以根据MeshFilter获得模型网格的组件,也可以为MeshFilter设置Mesh内容。

Mesh Renderer是用于把网格渲染出来的组件,MeshFilter的作用是把Mesh扔给MeshRenderer将模型或几何体绘制显示

  1. UV:  (1)百度解释:这里是指u,v纹理贴图坐标(和空间模型的X,Y,Z轴类似),他定义了图片上每个点的位置信息,这些点与3D模型是相互联系的,以决定表面纹理贴图的位置,UV就是将图像上的每一个点精确对应到模型物体的表面。
  2. 材质、贴图、纹理的区别: (知乎回答)

整个CG领域中这三个概念差不多,在一般的实践中,大致上的层级关系是:材质(Material)包含贴图(Map),贴图包含纹理(Texture)

纹理是最基本的数据输入单位,游戏领域基本上都用的是位图,此外还有程序化生成的纹理(Procedural Texture)

贴图(Map)其实包含了另一层含义:映射,其功能是把纹理通过UV坐标映射到3D物体表面。贴图包含了除了纹理以外其他很多信息,比如说:UV坐标,贴图输入输出控制等。

材质是一个数据集,主要功能就是给渲染器提供数据和光照算法,贴图就是其中数据的一部分,根据用途不同,贴图也会被分成不同的类型,比如:Diffuse,Map,Specular Map,Normal Map,Gloss Map等,另一个重要部分就是光照模型shader,用于实现不同的效果。

  1. 如果导入的模型的网格具有蒙皮信息,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

时间: 2024-10-16 10:10:24

什么是网格?的相关文章

CSS3 网格布局(grid-layout)基础知识 - 网格模板属性(grid-template)使用说明

CSS3引入了新的网格布局(grid layout),以适应显示和设计技术的发展(尤其是移动设备优先的响应式设计). 主要目标是建立一个稳定可预料且语义正确的网页布局模式,用来替代过往表现不稳定且繁琐的table.flow以及JS脚本混合技术来实现的网页动态布局. 本文将简单而准确的介绍网格布局属性的基本概念和使用方法(摘自踏得网在线HTML5教程). 1. 概述 网格模板区域(grid-template-areas).网格模板行(grid-template-rows)和网格模板列(grid-t

在SOUI中使用网格布局

在实现网格布局前,SOUI支持两种布局形式:相对布局,和线性布局,其中线性布局是2017年2月份才支持的布局. 这两年工作都在Android这里,Android里有号称5大布局(RelativeLayout, LinearLayout, FrameLayout, GridLayout,TableLayout). FrameLayout很简单,在SOUI里一般用TabCtrl就实现了.RelativeLayout和SOUI自己的相对布局功能类似,线性布局也有了,但是一直没有实现GridLayout

[UOJ#220][BZOJ4651][Noi2016]网格

试题描述 跳蚤国王和蛐蛐国王在玩一个游戏. 他们在一个 n 行 m 列的网格上排兵布阵.其中的 c 个格子中 (0≤c≤nm),每个格子有一只蛐蛐,其余的格子中,每个格子有一只跳蚤. 我们称占据的格子有公共边的两只跳蚤是相邻的. 我们称两只跳蚤是连通的,当且仅当这两只跳蚤相邻,或存在另一只跳蚤与这两只跳蚤都连通. 现在,蛐蛐国王希望,将某些(0 个,1 个或多个)跳蚤替换成蛐蛐,使得在此之后存在至少两只跳蚤不连通. 例如:我们用图表示一只跳蚤,用图表示一只蛐蛐,那么图 1 描述了一个 n=4,m

任务八:响应式网格(栅格化)布局

任务目的 使用 HTML 与 CSS 实现类似 BootStrap 的响应式 12 栏网格布局,根据屏幕宽度,元素占的栏数不同. 任务描述 需要实现如 效果图 所示,调整浏览器宽度查看响应式效果,效果图中的红色的文字是说明,不需要写在 HTML 中. 任务注意事项 网格布局的作用在于更有效地控制元素在网页中所占比例的大小.比如,博客中有一个留言板模块,在比较大的屏幕上,我们希望它占了右边 25% 的宽度,在手机等比较小的屏幕上,我们希望它占 100% 的宽度,出现在博客文章下方.网格布局是一种实

GridView网格控件

一.GridView控件用于显示一个网格图像, GridView主要是用在一些相册的布局显示图片.GridView采用的是二维表的方式显示单元格,就需要设置二维表的行和列.设置GridView的列可以使用<GridView>标签的columnWidth属性.也可以使用GridView类的setColumnWidth方法来设置列数,GridView中的单元格会根据列数自动拆行显示,因此不需要设置GridView的行数,但是需要设置android:numColumns属性.否则GridView只会

CSS多列布局Multi-column、伸缩布局Flexbox、网格布局Grid详解

新css属性为我们提供了更加便捷的网页布局方式.来自微软的thomas lewis将带你认识去Grid Alignment,Flexibox Box以及Multi-column Layout这三大领域. 这篇文章最早出现在the April 2012 issue (226)这期的.net杂志上-这杂志是面向网页设计者以及开发者,全球销量最高的杂志. 按照以往来说,用CSS来布局看起来总是一样非常繁杂的工作.然而,随着一个个新标准的推出,网页设计者已经能够实现非常轻松地进行布局工作了. 主流的浏览

初学WebGL引擎-BabylonJS:第8篇-阴影网格与活动

[playground]-shadows(阴影) 源码 var createScene = function () { var scene = new BABYLON.Scene(engine); // Setup environment var camera = new BABYLON.ArcRotateCamera("Camera", 0, 0.8, 90, BABYLON.Vector3.Zero(), scene); camera.lowerBetaLimit = 0.1; c

第7章(4) GridLayout(网格布局)

分类:C#.Android.VS2015: 创建日期:2016-02-10 一.简介 Android 4.0(API 14)开始提供的GridLayout布局使用虚细线将布局划分为行.列和单元格,也支持一个控件在行.列上都有交错排列. GridLayout使用与LinearLayout类似的API,只不过是修改了一下相关的标签而已. 1.默认布局方式-先行后列 GridLayout默认按先行后列的方式依次显示,子元素默认按照wrap_content的方式显示.如果不希望子元素显式指定其所在的行列

JAVA 网格布局管理器

//网格布局管理器 import java.awt.*; import javax.swing.*; public class Jiemian3 extends JFrame{ //定义组件 JButton[] an = {null,null,null,null,null,null,null,null}; public static void main(String[] args){ //运行本类的构造方法 Jiemian3 jiemian = new Jiemian3(); } public

android的布局-----GridLayout(网格布局)

学习导图 (一)简介 网格布局由GridLayout所代表,在android4.0之后新增加的布局管理器,因此需要android4.0之后的版本中使用,如果在更早的平台使用该布局管理器,则需要导入相应的支持库<android.support.v7.widget.GridLayout> (二)案列----计算器 <?xml version="1.0" encoding="utf-8"?> <GridLayout xmlns:android