来自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(四)绘制多边形的更多相关文章

  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. SpringBoot笔记十六:ElasticSearch

    目录 ElasticSearch官方文档 ElasticSearch安装 ElasticSearch简介 ElasticSearch操作数据,RESTful风格 存储 检查是否存在 删除 查询 更新 ...

  2. 14.命令模式(Command Pattern)

    耦合与变化:    耦合是软件不能抵御变化灾难的根本性原因.不仅实体对象与实体对象之间存在耦合关系,实体对象与行为操作之间也存在耦合关系.                                ...

  3. cocos-2dx 3.17 环境搭建 与 新建工程

    由于上次在ubuntu中安装了cocos2dx的时候环境被破坏了,所以本文是基于 Windows 编写的 平台: OS : windows 10 compiler   : VS 2015 下载 coc ...

  4. javascript的作用域和闭包(三)闭包与模块

    一些很重要的说明:前面三篇博客详细的介绍了,引擎与编译器和作用域的关系,重点需要理解的是编译器中的分词与词法分析,JavaScript的特有的“赋值操作的左右侧”引用操作:编译阶段的词法作用域的工作原 ...

  5. 项目thymeleaf

    官方文档:https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html#link-urls 定义和引用片段 在我们的模板中,我们经常需 ...

  6. 2018牛客网暑期ACM多校训练营(第一场)A Monotonic Matrix(LGV)

    题意 分析 考虑01和12的分界线是(n, 0)到(0,m)的两条不相交(可重合)路径分界线以及分界线以上的点是一种,分界线下是一种平移其中一条变成(n-1, -1)到(-1,m-1); 此时起点为{ ...

  7. Linux 三剑客 -- awk sed grep

    本文由本人收集整理自互联网供自己与网友参考,参考文章均已列出,如有侵权,请告知! 顶配awk,中配sed,标配grep awk 参考 sed 参考 grep 参考 在线查看linux命令速记表 app ...

  8. [Java JNI] [Windows] [Visual Studio] [DLL] [UnsatisfiedLinkError]

    有时候使用 GCC for Windows 生成 DLL 动态链接库时, 由于各种原因, 即使加载了动态链接库, JVM 仍然找不到符号, 从而产生 java.lang.UnsatisfiedLink ...

  9. 二十一、Linux 进程与信号---进程查看和进程状态、进程调度和进程状态变化、进程标识

    21.1 进程查看和进程状态 21.1.1 ps 指令 ps 指令通常可以查看到进程的 ID.进程的用户 ID.进程状态和进程的 Command ps:查看当前用户启动的进程 ps -ef:详细查看后 ...

  10. Coursera, Machine Learning, Unsupervised Learning, K-means, Dimentionality Reduction

    Clustering  K-means: 基本思想是先随机选择要分类数目的点,然后找出距离这些点最近的training data 着色,距离哪个点近就算哪种类型,再对每种分类算出平均值,把中心点移动到 ...