Unity3D之Mesh(四)绘制多边形
来自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;
算法实现代码如下:

- using UnityEngine;
- using System.Collections;
- [RequireComponent(typeof(MeshRenderer), typeof(MeshFilter))]
- public class quad : MonoBehaviour
- {
- /*
- creat a triangle by using Mesh
- 2016/11/21
- ————Carl
- */
- void Start()
- {
- creatPolygon();
- }
- private void creatPolygon()
- {
- /* 1. 顶点,三角形,法线,uv坐标, 绝对必要的部分只有顶点和三角形。
- 如果模型中不需要场景中的光照,那么就不需要法线。如果模型不需要贴材质,那么就不需要UV */
- Vector3[] vertices =
- {
- new Vector3 (2f,0,0),
- new Vector3(4f, 0, 0),
- new Vector3(6f, 0, 0),
- new Vector3(10f, 0, 0),
- new Vector3(10f, 20f, 0),
- new Vector3(6f,10f, 0),
- new Vector3(4f, 4f, 0)
- };
- Vector3[] normals =
- {
- Vector3.up,
- Vector3.up,
- Vector3.up,
- Vector3.up,
- Vector3.up,
- Vector3.up,
- Vector3.up
- };
- Vector2[] uv =
- {
- Vector2.zero,
- -Vector2.left,
- Vector2.one,
- Vector2.right,
- Vector2.zero,
- -Vector2.left,
- Vector2.one
- };
- /*2. 三角形,顶点索引:
- 三角形是由3个整数确定的,各个整数就是角的顶点的index。 各个三角形的顶点的顺序通常由下往上数, 可以是顺时针也可以是逆时针,这通常取决于我们从哪个方向看三角形。 通常,当mesh渲染时,"逆时针" 的面会被挡掉。 我们希望保证顺时针的面与法线的主向一致 */
- int[] indices = new int[15];
- indices[0] = 0;
- indices[1] = 6;
- indices[2] = 1;
- indices[3] = 6;
- indices[4] = 2;
- indices[5] = 1;
- indices[6] =6;
- indices[7] = 5;
- indices[8] = 2;
- indices[9] = 5;
- indices[10] = 4;
- indices[11] = 2;
- indices[12] = 4;
- indices[13] = 3;
- indices[14] = 2;
- //int numberOfTriangles = vertices.Length - 2;//三角形的数量等于顶点数减2
- //int[] indices = new int[numberOfTriangles * 3];//triangles数组大小等于三角形数量乘3 此时是15
- //int f = 0, b = vertices.Length - 1;//f记录前半部分遍历位置,b记录后半部分遍历位置 即0-7
- //for (int i = 1; i <= numberOfTriangles; i++)//每次给 triangles数组中的三个元素赋值,共赋值
- //{ //numberOfTriangles次
- // if (i % 2 == 1)
- // {
- // indices[3 * i - 3] = f++;
- // indices[3 * i - 2] = f;
- // indices[3 * i - 1] = b;//正向赋值,对于i=1赋值为:0,1,2
- // }
- // else
- // {
- // indices[3 * i - 1] = b--;
- // indices[3 * i - 2] = b;
- // indices[3 * i - 3] = f;//逆向赋值,对于i=2赋值为:1,5,6
- // }
- Mesh mesh = new Mesh();
- mesh.vertices = vertices;
- mesh.normals = normals;
- mesh.uv = uv;
- mesh.triangles = indices;
- MeshFilter meshfilter = this.gameObject.GetComponent<MeshFilter>();
- meshfilter.mesh = mesh;
- }
- }

效果图:
Unity3D之Mesh(四)绘制多边形的更多相关文章
- Unity3D之Mesh(七)绘制长方体
前言: 从现在开始,终于感觉进入一点点正题了!动态创建三维立体模型mesh!依然从简单入手:长方体. 一.基本思路 由于是创建长方体mesh,由之前的研究得知,两个数据必须要有,即:顶点的数据:ver ...
- Unity3D之Mesh(一)绘制三角形
前言: Unity自带几种简单的模型,如cube等:一般情况下,其余模型有3D建模软件生成,以合适的文件格式导入unity中:而mesh(以我目前很粗浅的了解)的一般用途就是:对现有的模型进行变形,以 ...
- [WebGL入门]十四,绘制多边形
注意:文章翻译http://wgld.org/.原作者杉本雅広(doxas),文章中假设有我的额外说明,我会加上[lufy:].另外,鄙人webgl研究还不够深入.一些专业词语,假设翻译有误,欢迎大家 ...
- Unity3D之Mesh(五)绘制圆
前言: Unity3D中Mesh的基本单位是三角形,而圆形就是由许许多多的三角形组成的.那么我们就知道了绘制圆形的Mesh需要两个变量:圆的半径 以及分割数: 一.实现过程 基本过程与之前的类似,最 ...
- Unity3D学习笔记2——绘制一个带纹理的面
目录 1. 概述 2. 详论 2.1. 网格(Mesh) 2.1.1. 顶点 2.1.2. 顶点索引 2.2. 材质(Material) 2.2.1. 创建材质 2.2.2. 使用材质 2.3. 光照 ...
- 【Silverlight】Bing Maps学习系列(五):绘制多边形(Polygon)图形(转)
[Silverlight]Bing Maps学习系列(五):绘制多边形(Polygon)图形 Bing Maps Silverlight Control支持用户自定义绘制多边形(Polygon)图形, ...
- 用线框模式绘制多边形 glPolygonMode
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glBegin(GL_TRIANGLES);//开始以g_ViewMode模式绘制 glColor3ub(182. ...
- canvas绘制多边形
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- leaflet简单例子,绘制多边形
var crs = L.CRS.EPSG900913; var map = L.map('map', { crs: crs, width: '100%', height: '100%', maxZoo ...
- 浅谈使用canvas绘制多边形
本文主要使用坐标轴的使用来绘制多边形,点位则都是在y轴上寻找,这种方法能够更好的理解图形与修改. //id为html里canvas标签的属性id: //x,y为坐标轴的起始位置,因为canvas默认坐 ...
随机推荐
- C#设计模式(6)——原型模式
1.原型模式介绍 在软件系统开发中,有时候会遇到这样的情况:我们需要用到多个相同实例,最简单直接的方法是通过多次调用new方法来创建相同的实例.如下: Person person=}; Person ...
- Bitcoin Core钱包客户端的区块数据搬家指南
最近在饭团(微信中的一个服务号)里教一些朋友学习比特币和区块链技术,为了让大家深刻地理解去中心化网络和钱包等概念,我推荐大家一定要安装经典的Bitcoin Core钱包软件,有些朋友在安装的时候没有留 ...
- build script和all projects作用和区别
buildscript中的声明是gradle脚本自身需要使用的资源.可以声明的资源包括依赖项.第三方插件.maven仓库地址等.而在build.gradle文件中直接声明的依赖项.仓库地址等信息是项目 ...
- C#--IEnumerable 与 IEnumerator 的区别
一. IEnumerator 解释:它是一个的集合访问器,使用foreach语句遍历集合或数组时,就是调用 Current.MoveNext()的结果. // 定义如下public interface ...
- ASP.NET MVC动态加载数据
ASP.NET MVC动态加载数据,一般的做法是使用$.each方法来循环产生tabel: 你可以在html时先写下非动态的部分: Source Code 上图中,有一行代码: <tbody ...
- 【Django】git建仓上传时遇到的小问题
根据教程 http://tutorial.djangogirls.org/zh/deploy/,在github上建仓上传项目文件. 执行到 git push -u origin master 时,输入 ...
- sql -leetcode 178. Rank Scores
Score 很好得到: select Score from Scores order by Score desc; 要得到rank, 可以通过比较比当前Score 大的Score 的个数得到: sel ...
- (6)设计一个TimeMap
一.描述 设计一个TimeMap,基于key value的 支持两类操作set(string key, string value, int timestamp),get(string key, int ...
- lua 的语法糖
tb = {} function tb:fun1() self ---tb end function tb.fun2() self ---->无 end tb:fun1() tb.fun2() ...
- 迅为IMX6核心板兼容工业级、商业扩展级、Plus版本核心板
IMX6核心板兼容单核.双核.四核.工业级.汽车级.iMX6Q最新Plus版本,可根据用户需求更换,百变定制,高端产品无忧! iMX6Q核心板(四核商业级) iMX6DL核心板(双核商业级) iMX6 ...