关于绘制网格, 雨松前辈 已经解释的非常的到位,这里我只是搬运工,实在是感觉自己去描述的话不会有雨松大神描述的清楚,该文章循序渐进,一步步引导读者去理解unirty 绘图机制,真的是没有比这个再好得了,下面是文章原文:

首先创建Unity工程,接着创建一个空的游戏对象,然后给该游戏对象绑定Mesh Filter组件 与 Mesh Renderer组件。

Mesh Filter组件:表示网格面,这个网格面是由我们使用代码将所有三角形拼接起来生成的面。

Mesh Renderer组件:表示表示网格的渲染,可设置一个渲染的材质,它包括贴图与颜色。

       如下图所示,我说说里面比较重要的属性。Mesh Renderer中,Materials下拉列表中可设置网格模型的材质,此时我们设置了一个红色的材质。 Mesh Filter:目前为None,也不用再编辑器中为它赋值,因为这个网格模型我们会在代码中生成并且赋值。在下面就是方刚我们设置红色的材质资源,Shader中设置了贴图的属性,目前是GUI/ TextShader。它表示这个材质的渲染级别在GUI上,就是优先级是最一层的。举个例子无论在这个网格模型的前面绘制多少模型,它永远都会在最前面显示。就这个例子而言它的存在并不是必需的,其实Shader的选项还有很多,可透明、不可透明、镜面、反射等等,后期我会向大家详细道来。

 using UnityEngine;
using System.Collections.Generic;
using System; public class Test : MonoBehaviour { void Start ()
{
//得到MeshFilter对象,目前是空的。
MeshFilter meshFilter = (MeshFilter)GameObject.Find("face").GetComponent(typeof(MeshFilter));
//得到对应的网格对象
Mesh mesh = meshFilter.mesh; //三角形顶点的坐标数组
Vector3[] vertices = new Vector3[];
//三角形顶点ID数组
int[] triangles = new int[]; //三角形三个定点坐标,为了显示清楚忽略Z轴
vertices[] = new Vector3(,,);
vertices[] = new Vector3(,,);
vertices[] = new Vector3(,,); //三角形绘制顶点的数组
triangles[] =;
triangles[] =;
triangles[] =; //注释1
mesh.vertices = vertices; mesh.triangles = triangles; } }

 代码中有两个非常重要的概念,就是三角形顶点数组与坐标数组。先说说坐标数组,假设需要绘制一个四边形,此时三角形坐标数组的长度应当是4,它保存着四边形四个顶点的坐标。然后是顶点数组,四边形是由两个三角形组成,然而一个三角形是由3个顶点组成,两个三角形就应当是6个顶点组成,无论多少个三角形它们的结构都应当是以此类推。

注解1:这里是将模型的顶点数组与坐标数组赋值给网格模型,还记得刚刚在创建Mesh Filter时,当时没有在编辑器中给网格模型赋值,实际上代码走到这里就会重新为网格模型MeshFilter赋值,接着我们在代码中绘制的三角形就会显示在屏幕当中。

如图所示,三角形已经绘制在屏幕当中。 图中数组 0 1 2 表示该三角形的三个顶点的ID。这个ID对应代码中对应vertices数组索引顶点的坐标。

下面我们修改一下代码,让屏幕中一共绘制4个三角形。

 根据上面的逻辑,我们修改一下算法。假设三角形的顶点坐标为任意数量,我们需要更根据顶点坐标数量来计算对应顶点ID的数组内容。在for循环中start =0 与end =3的含义是绘制从顶点坐标数组中索引为0的顶点开始绘制到数组索引为3的顶点,也就说是这里从0到3绘制了3个三角形。

 using UnityEngine;
using System.Collections.Generic;
using System; public class Test : MonoBehaviour { //网格模型顶点数量
private int VERTICES_COUNT = ; void Start ()
{
//得到MeshFilter对象,目前是空的。
MeshFilter meshFilter = (MeshFilter)GameObject.Find("face").GetComponent(typeof(MeshFilter));
//得到对应的网格对象
Mesh mesh = meshFilter.mesh; //三角形顶点的坐标数组
Vector3[] vertices = new Vector3[VERTICES_COUNT]; //得到三角形的数量
int triangles_count = VERTICES_COUNT - ; //三角形顶点ID数组
int[] triangles = new int[triangles_count *]; //三角形三个定点坐标,为了显示清楚忽略Z轴
vertices[] = new Vector3(,,);
vertices[] = new Vector3(,,);
vertices[] = new Vector3(,,);
vertices[] = new Vector3(,,);
vertices[] = new Vector3(,,);
vertices[] = new Vector3(,,); //绘制三角形
mesh.vertices = vertices; //起始三角形顶点
int start = ; //结束三角形的顶点
int end = ; for(int i = start; i <end; i++)
{
for(int j = ; j < ; j++)
{
if( i% ==)
{
triangles[*i + j] = i +j;
}else
{
triangles[*i + j] = i + -j;
} }
} mesh.triangles = triangles;
}
}

如下图所示,根据上面的逻辑算法,共绘制了3个三角形,并且顶点坐标ID是由 0 到3 。 说到这里请大家仔细想想本文的标题内容,其实两个动态轨迹的点就是在维护triangles顶点坐标数组。triangles[0]、triangles[2]、triangles[4]……表示一个轨迹点的值,triangles[1]、triangles[3]、triangles[5]……就表示另一个轨迹点的值,最终将它们通过上面的算法将三角形面连接起来那么就是动态的两个点轨迹绘制面了。

以上内容引用了雨松前辈的文章,其中开篇处去掉了一些引导性的内容,另外,为便于理解使用的图片有所不同。

比如要绘制4个三角形,那么会有4+2= 6个关键点,每个三角形有三个顶点。那么需要3*4=12个三角形顶点,但只有6个点,实际上是有些点需要被用2次,有的点被用了三次;

三点确定一个面。这三个点按顺时针连接在一起,如下图:

案例中列举了比较规则的只是为了便于理解,道理算是讲明白了。

看了前辈的博客,我感受到了算法是多么的牛逼,不得不服。只最后那个脚本的双层for 循环的内容就让我理解了很久,才弄明白,算法很是精妙。不知道是不是前辈原创的,哈哈~~~。

关于那个for循环内部if else 的算法我算是佩服的不行。。。现在还在花痴崇拜中、、、、、

欢迎各位和我一起学习,一起进步,~~摸摸大,该睡觉了,明天还要上班~~

untiy绘制网格mesh的更多相关文章

  1. Direct2D开发:绘制网格

    转载请注明出处:http://www.cnblogs.com/Ray1024 一.引言 最近在使用Direct2D进行绘制工作中,需要实现使用Direct2D绘制网格的功能.在网上查了很多资料,终于实 ...

  2. [Direct2D开发] 绘制网格

    转载请注明出处:http://www.cnblogs.com/Ray1024 一.引言 最近在使用Direct2D进行绘制工作中,需要实现使用Direct2D绘制网格的功能.在网上查了很多资料,终于实 ...

  3. Matlab-Octave中绘制网格图和等高线:mesh 和 surf

    x=linspace(-50, 50, 50); % 在x轴上取50点y=linspace(-25, 25, 25); % 在y轴上取25点[xx,yy]=meshgrid(x, y); % xx和y ...

  4. 保存网格(mesh)到磁盘上

    Unity提供了很方便的工具来保存mesh之类的,下面的代码挂在GameObject上后,按下F键能把mesh(该GameObject必须有mesh组件)保存到磁盘的Assets目录下.在磁盘上是.a ...

  5. QGraphicsScene绘制网格背景

    博客转载自:https://blog.csdn.net/u010177010/article/details/51496038 //两条轴线QPolygonF myPolygon1; myPolygo ...

  6. 关于Unity中Mesh网格的详解

    3D模型 通过3D建模软件所建出来的点和面,如以三角形为主的点和面,比如人的脑袋一个球,就是由各种各样的三角形组成的点和面. 点和面以及纹理坐标都是通过3D建模软件建模出来的. Unity会帮我们把模 ...

  7. Gizmos绘制塔防游戏网格

    1.画线脚本写法及地面调整 首先,新建脚本GridMap 新建绘制网格方法(初始数值为10*10) 在类中创建变量 //定义地图宽度 public int m_mapWidth = 10; //地图高 ...

  8. Unity3D之Mesh(四)绘制多边形

    来自https://www.cnblogs.com/JLZT1223/p/6086191.html 1. 总的来说绘制平面的思想十分简单,就是将需要的平面拆分成几个三角形然后进行绘制就可以啦,主要的思 ...

  9. 快速上手 Linkerd v2 Service Mesh(服务网格)

    在本指南中,我们将引导您了解如何将 Linkerd 安装到您的 Kubernetes 集群中. 然后我们将部署一个示例应用程序来展示 Linkerd 的功能. 安装 Linkerd 很容易.首先,您将 ...

随机推荐

  1. spring 学习 AOP和IOC

    自11开始接触三大框架,至今已俞5载, 当时风光无限的ssh,现在还在被广泛使用,并有扩大之势的只有spring了 spring主要特性,是广为使用的AOP(面向切面)和IOC(控制反转) 1.其中, ...

  2. 《Hadoop权威》学习笔记五:MapReduce应用程序

    一.API的配置---Configuration类 API的配置:Hadoop提供了专门的API对资源进行配置,Configuration类的实例(在org.apache.hadoop.conf包)包 ...

  3. C++ 知识点 2

    基本类型常量 const int a; int const a; const int *a; int * const a; int const * a const; 之间的区别? const int ...

  4. PHP扩展开发(2) - VS2013环境搭建

    1. 安装VS2013 2. Cygwin安装 3. 下载Windows的PHP源码 4. 修改~/ext/ext_skel_win32.php     加上 $cygwin_path = 'c:\c ...

  5. 一个简单的redis调用类

    能只能判断函数的调用规则,容错规则, 例如set函数 set($key, $value, $time = false) 根据time的真假来判断是否使用set,或者是setex函数 get函数 get ...

  6. C程序设计语言练习题1-11

    练习1-11 你准备如何测试单词计数程序?如果程序中存在某种错误,那么什么样的输入最可能发现这类错误呢? 代码如下: #include <stdio.h> // 包含标准库的信息. #de ...

  7. tomcat文件夹与文件解析

    今天看到一篇不错的文章,如下: /bin:存放启动和关闭tomcat的脚本文件: /conf:存放tomcat的各种配置文件,比如:server.xml/ server/lib:存放tomcat服务器 ...

  8. iOS开发 - 不进入待机(屏幕保持唤醒)---UIApplication学习

    iOS开发 - 不进入待机(屏幕保持唤醒)---UIApplication学习 如果你不希望应用运行时 iPhone 进入锁屏待机状态,加入下面这行代码即可 [[UIApplication share ...

  9. CSS中cursor的pointer 与 hand-备

    cursor:hand 与 cursor:pointer 的效果是一样,都像手形光标(在浏览器上时   鼠标会显示成 小手 ).但用FireFox浏览时才注意到使用cursor:hand在FireFo ...

  10. 如何用js检测手机是否安装某个app

    问题描述 如果本地安装了app那么直接打开,否则苹果要跳转到app-store,安卓则要跳到对应的市场 解决方案 一 //html代码中 的 a 标签,以微信为例,默认的是调用weixin schem ...