关于绘制网格, 雨松前辈 已经解释的非常的到位,这里我只是搬运工,实在是感觉自己去描述的话不会有雨松大神描述的清楚,该文章循序渐进,一步步引导读者去理解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. [转]Windows与Linux系统下的库文件介绍

    什么是库   库文件是一些预先编译好的函数的集合,那些函数都是按照可再使用的原则编写的.它们通常由一组互相关联的用来完成某项常见工作的函数构成,从本质上来说库是一种可执行代码的二进制形式,可以被操作系 ...

  2. window下Slik SVN的安装配置

    我相信各位都应该对SVN不会陌生吧,我相信绝大多数人都使用过,但是并不是人人都自己配置过SVN服务器.下面就是我配置SVN服务器的步骤,以及在配置过程中碰见的一些问题,在此记录,希望对你有所帮助. 安 ...

  3. php 之 数据访问 增删改查练习题

    练习题内容: 一.查看新闻页面-----主页面: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...

  4. Vim的snipMate插件

    介绍终于发现了一个插件,对于Vim下代码块的自动补全支持的很好.给大家推荐snipMate. snipMate可以帮助您在vim上实现类似Textmate的功能,自动代码块的能力非常强大,而且代码块是 ...

  5. Android再学习-20141022-Activity的生命周期

    20141022-Android再学习 如何在一个应用程序当中定义多个Activity 定义一个类,继承Activity 在该类当中,复写Activity当中的onCreate方法.onCreate( ...

  6. 类和对象:面向对象编程 - 零基础入门学习Python037

    类和对象:面向对象编程 让编程改变世界 Change the world by program 经过上节课的热身,相信大家对类和对象已经有了初步的认识,但似乎还是懵懵懂懂:好像面向对象编程很厉害,但不 ...

  7. Ubuntu-Java-Scala-Spark-IEDA-configure

    最近要接触数据分析,需要快速入门,就想在Ubuntu下配置IDEA和Spark编程环境. 1.下载jdk #java /etc/profile .zshrc, 或者直接在终端输入export JAVA ...

  8. 自制单片机之七……RS232串口

    在我的板子上其它的部分都已完成了,现在就剩下RS232串口了.串口对于单片机很重要,有了它就可以和PC通信了,可以用PC来控制你的单片机,也可以将你单片机上采集的数据传到PC上. 留的位置好像有点挤. ...

  9. expect 批量监控主机

    [oracle@OAPRIMARY shell]$ cat expect.sh while read line do user=`echo $line | awk '{print $1}'` ip=` ...

  10. BZOJ1978: [BeiJing2010]取数游戏 game

    1978: [BeiJing2010]取数游戏 game Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 650  Solved: 400[Submit] ...