Unity 制作一个简单的Mesh网格

为了渲染出我们自制的Mesh,我们首先在一个空组件上增加MeshFilter和MeshRenderer。


Mesh1.png

MeshFilter是针对我们这个GameObject存储的Mesh,Mesh Renderer组件就是读取自身的MeshFilter来获得mesh进行渲染,所以这两个组件是配套使用的。

0.啥子是网格

网格就如字面意思一样就是由点和线组成的东西。


Mesh2.png
Mesh3.png

图2是一个平面网格,图3就是我们常见的cube网格。

而我们常见的网格的最小单元是一个三角形,也就是3个顶点组成的最小单元。

1.制作一个Mesh

制作一个Mesh非常的简单,我们只需要new一个Mesh然后赋值给我们的MeshFilter组件就可以拉。

 Mesh CurMesh = new Mesh();
 GetComponent<MeshFilter>().mesh = CurMesh;
 CurMesh.name = "createTempMesh";

但是这样我们还是看不出个什么来因为网格没有其他的一些信息,也没有顶点信息。


Mesh4.png

2.为Mesh增加顶点

到这一步我们就要开始正式的为我们制作的Mesh增加顶点啦,首先尝试加3个点。

 Vector3 vectices = new Vector3[3];
vectices[0].x = 0;
 vectices[0].y = 0;

 vectices[1].x = 1;
 vectices[1].y = 0;

 vectices[2].x = 2;
 vectices[2].y = 0;
 CurMesh.vertices = vectices;

这样我们的顶点坐标就成功的加到了我们Mesh里拉。
这里的坐标点对应的是世界坐标的坐标点。

3.连接Mesh里的顶点

int[] TriangleIndexs = new int[3];
TriangleIndexs[0] = 0;
TriangleIndexs[1] = 2;
TriangleIndexs[2] = 1;
CurMesh.triangles = TriangleIndexs;

这里的0是顶点坐标信息下标里的0,是和vertices对应上的。存储的就是顶点坐标的下标。
但是设置到这你就发现没用啊,场景里没有生成东西啊什么反应都没有。
因为我们需要连接的是一个最小单元也就是一个三角形,所以从连接上来看我们是一条线,不能形成一个面啦,所以我们只需要稍作调整就可以得到一个三角面啦。


MeshLine.png
 Vector3 vectices = new Vector3[3];
 vectices[0].x = 0;
 vectices[0].y = 0;

 vectices[1].x = 1;
 vectices[1].y = 0;

 vectices[2].x = 0;
 vectices[2].y = 1;
 CurMesh.vertices = vectices;

int[] TriangleIndexs = new int[3];
TriangleIndexs[0] = 0;
TriangleIndexs[1] = 2;
TriangleIndexs[2] = 1;
CurMesh.triangles = TriangleIndexs;

这时候点击Mesh查看就能看到一个三角面的网格啦;


Mesh5.png

场景中也对应的出现了一个紫色的没有材质的三角面。

Mesh6.png

但是有的朋友可能生成之后看不到场景里的三角面,如下图。


Mesh7.png

这是为什么会这样呢?首先需要确认你的MeshRenderer组件的materials size大于0


Mesh8.png

排除这个问题就到了一个需要注意的点triangles,Mesh的三角下标信息。
仔细对比图6 和 图7的坐标系发现 图6显示出来的三角面试是在z轴的正方向,而不显示的图7是在z轴的反方向。
这是因为我们只渲染了一个面,所以背面信息没有渲染。
那是什么信息决定了正面渲染的呢?
其实就是我们的三角面下标顺序。
我们这里的顺序是 0 2 1是一个顺时针旋转。所以是z轴正面渲染。


Mesh10.png

当我们使用 0 1 2点顺序 也就是 逆时针顺序渲染 看到的 三角面应该是在z轴反面渲染


Mesh9.png

Mesh11.png

4.为Mesh增加UV坐标

当我们给MeshRenderer里添加材质你会发现变黑了,为什么是变黑呢?是因为材质没有对应上这个Mesh,这个Mesh的没有uv坐标信息。那么uv坐标到底是什么?

uv坐标

uv坐标就是横坐标为u,纵坐标为v的一个坐标系,一般取值范围是在(0,1)之间。它代表贴图信息的位置关系,贴图每个像素点对应上的具体位置。

添加uv坐标
Vector2[] uvs = new Vector2[3];
uvs[0] = new Vector2(0, 0);
uvs[1] = new Vector2(0.5f, 0);
uvs[2] = new Vector2(0, 0.5f);
CurMesh.uv = uvs;
Mesh12.png

如果你加载出来的贴图是一个纯黑的图,就要考虑是不是Auto Greerate lighting 没有设置为on。


MeshTest.png

5.为Mesh增加法线

在了解什么是法线的前提下,我们先来看看法线对Mesh有什么影响。


Mesh12.png
Mesh13.png
Mesh14.png

效果是不是显而易见的,当没有法线的时候图片没有光照信息,不反射光照看起来灰蒙蒙的。
而图13 14是加了法线的,它就会受到光线信息的影响,从不同的角度去看都有不一样的效果。

那法线是什么呢?

法线分为顶点法线和面法线。在这个三角面上有三个顶点 和一个三角面,对应的也就有3个顶点法线和一个面法线,法线垂直于点、面,方向朝外是一个向量。
在这里简单的添加法线信息可以使用unity带的

CurMesh.RecalculateNormals();

当然你也可以自己为它添加法线信息。

Vector3[] tempNormals = new Vector3[3];
tempNormals[0] = new Vector3(0, 0, -1);
tempNormals[1] = new Vector3(0, 0, -1);
tempNormals[2] = new Vector3(0, 0, -1);
CurMesh.normals = tempNormals;

这里为什么是-1,不是正1。 我们刚刚说过了法线的方向朝外,当我们灯光照射方向和法线方向相同就看不出光照信息的效果,而相反的话就能很好的反应出受光照的反射效果。

这里只是简单的介绍Mesh网格的一些基础的信息,肯定有很多地方有歧义 也是不好意思啦,如果有不正确的地方欢迎指出。谢谢大家。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,783评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,360评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,942评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,507评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,324评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,299评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,685评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,358评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,652评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,704评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,465评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,318评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,711评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,991评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,265评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,661评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,864评论 2 335