来自https://www.cnblogs.com/JLZT1223/p/6086191.html

1、

总的来说绘制平面的思想十分简单,就是将需要的平面拆分成几个三角形然后进行绘制就可以啦,主要的思路就在于三角形的拆分。如果说一个平面有7个顶点,我们把它们分别编号0到6,拆分情况如图所示:

即:如果用n来表示顶点的个数,那么在同一个平面内,可以分割的三角形个数是:n-2;

2、

在这里,我们选择应用Mesh Filter组件来进行绘制,Mesh Filter组件里的Mesh属性就是我们这次主要操作的对象,在这里,我们用到:

  mesh.vertices数组 和 mesh.triangles数组,第一个是vector3的数组,第二个是int的数组。

  其中mesh.vertices存储的就是平面的顶点信息,对应上图就是0到6号这六个点的坐标。

  mesh.triangles存储的是平面绘制时,绘制三角形的顶点顺序,对应上图应该是:

  061 651 521 542 432(顺时针)

  每三个一组代表一个三角形,但是大家在这里要注意一下,就是最终绘制出的小三角形是单向图,就是一面可以看到,另一面是看不到的,所以,为了保证所有的小三角形朝向一至,要对mesh.triangles数组在进行调整,调整结果如下:

  016 156 125 245 234(逆时针)

  就是保证小三角形顶点都是按顺时针或者逆时针读取~大家想想就明白了~

  故:基本算法思想就是:

  入口参数:vector3[] vertices,储存平面定点信息,顶点需按顺序储存

  算法思想:从数组首尾向中间遍历,生成triangles顶点ID数组(下列代码中注释的部分)


步驟:

1、創建一個empty 的gameobject;

2、添加一個脚本給這個game object;

算法实现代码如下:

  1. using UnityEngine;
  2. using System.Collections;
  3. [RequireComponent(typeof(MeshRenderer), typeof(MeshFilter))]
  4. public class quad : MonoBehaviour
  5. {
  6. /*
  7. creat a triangle by using Mesh
  8. 2016/11/21
  9. ————Carl
  10. */
  11. void Start()
  12. {
  13. creatPolygon();
  14. }
  15.  
  16. private void creatPolygon()
  17. {
  18. /* 1. 顶点,三角形,法线,uv坐标, 绝对必要的部分只有顶点和三角形。
  19. 如果模型中不需要场景中的光照,那么就不需要法线。如果模型不需要贴材质,那么就不需要UV */
  20. Vector3[] vertices =
  21. {
  22. new Vector3 (2f,0,0),
  23. new Vector3(4f, 0, 0),
  24. new Vector3(6f, 0, 0),
  25. new Vector3(10f, 0, 0),
  26. new Vector3(10f, 20f, 0),
  27. new Vector3(6f,10f, 0),
  28. new Vector3(4f, 4f, 0)
  29.  
  30. };
  31.  
  32. Vector3[] normals =
  33. {
  34. Vector3.up,
  35. Vector3.up,
  36. Vector3.up,
  37. Vector3.up,
  38. Vector3.up,
  39. Vector3.up,
  40. Vector3.up
  41.  
  42. };
  43.  
  44. Vector2[] uv =
  45. {
  46. Vector2.zero,
  47. -Vector2.left,
  48. Vector2.one,
  49. Vector2.right,
  50. Vector2.zero,
  51. -Vector2.left,
  52. Vector2.one
  53.  
  54. };
  55. /*2. 三角形,顶点索引:
  56. 三角形是由3个整数确定的,各个整数就是角的顶点的index。 各个三角形的顶点的顺序通常由下往上数, 可以是顺时针也可以是逆时针,这通常取决于我们从哪个方向看三角形。 通常,当mesh渲染时,"逆时针" 的面会被挡掉。 我们希望保证顺时针的面与法线的主向一致 */
  57. int[] indices = new int[15];
  58. indices[0] = 0;
  59. indices[1] = 6;
  60. indices[2] = 1;
  61.  
  62. indices[3] = 6;
  63. indices[4] = 2;
  64. indices[5] = 1;
  65.  
  66. indices[6] =6;
  67. indices[7] = 5;
  68. indices[8] = 2;
  69.  
  70. indices[9] = 5;
  71. indices[10] = 4;
  72. indices[11] = 2;
  73.  
  74. indices[12] = 4;
  75. indices[13] = 3;
  76. indices[14] = 2;
  77. //int numberOfTriangles = vertices.Length - 2;//三角形的数量等于顶点数减2
  78. //int[] indices = new int[numberOfTriangles * 3];//triangles数组大小等于三角形数量乘3 此时是15
  79. //int f = 0, b = vertices.Length - 1;//f记录前半部分遍历位置,b记录后半部分遍历位置 即0-7
  80. //for (int i = 1; i <= numberOfTriangles; i++)//每次给 triangles数组中的三个元素赋值,共赋值
  81. //{ //numberOfTriangles次
  82. // if (i % 2 == 1)
  83. // {
  84. // indices[3 * i - 3] = f++;
  85. // indices[3 * i - 2] = f;
  86. // indices[3 * i - 1] = b;//正向赋值,对于i=1赋值为:0,1,2
  87. // }
  88. // else
  89. // {
  90. // indices[3 * i - 1] = b--;
  91. // indices[3 * i - 2] = b;
  92. // indices[3 * i - 3] = f;//逆向赋值,对于i=2赋值为:1,5,6
  93. // }
  94.  
  95. Mesh mesh = new Mesh();
  96. mesh.vertices = vertices;
  97. mesh.normals = normals;
  98. mesh.uv = uv;
  99. mesh.triangles = indices;
  100.  
  101. MeshFilter meshfilter = this.gameObject.GetComponent<MeshFilter>();
  102. meshfilter.mesh = mesh;
  103. }
  104.  
  105. }

效果图:

Unity3D之Mesh(四)绘制多边形的更多相关文章

  1. Unity3D之Mesh(七)绘制长方体

    前言: 从现在开始,终于感觉进入一点点正题了!动态创建三维立体模型mesh!依然从简单入手:长方体. 一.基本思路 由于是创建长方体mesh,由之前的研究得知,两个数据必须要有,即:顶点的数据:ver ...

  2. Unity3D之Mesh(一)绘制三角形

    前言: Unity自带几种简单的模型,如cube等:一般情况下,其余模型有3D建模软件生成,以合适的文件格式导入unity中:而mesh(以我目前很粗浅的了解)的一般用途就是:对现有的模型进行变形,以 ...

  3. [WebGL入门]十四,绘制多边形

    注意:文章翻译http://wgld.org/.原作者杉本雅広(doxas),文章中假设有我的额外说明,我会加上[lufy:].另外,鄙人webgl研究还不够深入.一些专业词语,假设翻译有误,欢迎大家 ...

  4. Unity3D之Mesh(五)绘制圆

    前言: Unity3D中Mesh的基本单位是三角形,而圆形就是由许许多多的三角形组成的.那么我们就知道了绘制圆形的Mesh需要两个变量:圆的半径  以及分割数: 一.实现过程 基本过程与之前的类似,最 ...

  5. Unity3D学习笔记2——绘制一个带纹理的面

    目录 1. 概述 2. 详论 2.1. 网格(Mesh) 2.1.1. 顶点 2.1.2. 顶点索引 2.2. 材质(Material) 2.2.1. 创建材质 2.2.2. 使用材质 2.3. 光照 ...

  6. 【Silverlight】Bing Maps学习系列(五):绘制多边形(Polygon)图形(转)

    [Silverlight]Bing Maps学习系列(五):绘制多边形(Polygon)图形 Bing Maps Silverlight Control支持用户自定义绘制多边形(Polygon)图形, ...

  7. 用线框模式绘制多边形 glPolygonMode

    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glBegin(GL_TRIANGLES);//开始以g_ViewMode模式绘制 glColor3ub(182. ...

  8. canvas绘制多边形

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. leaflet简单例子,绘制多边形

    var crs = L.CRS.EPSG900913; var map = L.map('map', { crs: crs, width: '100%', height: '100%', maxZoo ...

  10. 浅谈使用canvas绘制多边形

    本文主要使用坐标轴的使用来绘制多边形,点位则都是在y轴上寻找,这种方法能够更好的理解图形与修改. //id为html里canvas标签的属性id: //x,y为坐标轴的起始位置,因为canvas默认坐 ...

随机推荐

  1. C#设计模式(6)——原型模式

    1.原型模式介绍 在软件系统开发中,有时候会遇到这样的情况:我们需要用到多个相同实例,最简单直接的方法是通过多次调用new方法来创建相同的实例.如下: Person person=}; Person ...

  2. Bitcoin Core钱包客户端的区块数据搬家指南

    最近在饭团(微信中的一个服务号)里教一些朋友学习比特币和区块链技术,为了让大家深刻地理解去中心化网络和钱包等概念,我推荐大家一定要安装经典的Bitcoin Core钱包软件,有些朋友在安装的时候没有留 ...

  3. build script和all projects作用和区别

    buildscript中的声明是gradle脚本自身需要使用的资源.可以声明的资源包括依赖项.第三方插件.maven仓库地址等.而在build.gradle文件中直接声明的依赖项.仓库地址等信息是项目 ...

  4. C#--IEnumerable 与 IEnumerator 的区别

    一. IEnumerator 解释:它是一个的集合访问器,使用foreach语句遍历集合或数组时,就是调用 Current.MoveNext()的结果. // 定义如下public interface ...

  5. ASP.NET MVC动态加载数据

    ASP.NET MVC动态加载数据,一般的做法是使用$.each方法来循环产生tabel: 你可以在html时先写下非动态的部分:  Source Code 上图中,有一行代码: <tbody ...

  6. 【Django】git建仓上传时遇到的小问题

    根据教程 http://tutorial.djangogirls.org/zh/deploy/,在github上建仓上传项目文件. 执行到 git push -u origin master 时,输入 ...

  7. sql -leetcode 178. Rank Scores

    Score 很好得到: select Score from Scores order by Score desc; 要得到rank, 可以通过比较比当前Score 大的Score 的个数得到: sel ...

  8. (6)设计一个TimeMap

    一.描述 设计一个TimeMap,基于key value的 支持两类操作set(string key, string value, int timestamp),get(string key, int ...

  9. lua 的语法糖

    tb = {} function tb:fun1() self ---tb end function tb.fun2() self ---->无 end tb:fun1() tb.fun2() ...

  10. 迅为IMX6核心板兼容工业级、商业扩展级、Plus版本核心板

    IMX6核心板兼容单核.双核.四核.工业级.汽车级.iMX6Q最新Plus版本,可根据用户需求更换,百变定制,高端产品无忧! iMX6Q核心板(四核商业级) iMX6DL核心板(双核商业级) iMX6 ...