Unity3D之Mesh(四)绘制多边形

前言:

依然如故,由於之前的基本介紹,所以有關的知識點不做贅述,只上案例,知識作爲自己做試驗的記錄,便於日後查看。



一些知识点的说明记录与补充:

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;
        }

    }

效果图:



【欢迎转载】

转载请表明出处: 乐学习

时间: 2024-10-14 18:14:50

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

Unity3D之Mesh(七)绘制长方体

前言: 从现在开始,终于感觉进入一点点正题了!动态创建三维立体模型mesh!依然从简单入手:长方体. 一.基本思路 由于是创建长方体mesh,由之前的研究得知,两个数据必须要有,即:顶点的数据:vertices与索引的三角形(即负责管理每个三角形的三点的索引顺序):triangles.长方体:一般会得知:长宽高:即今天我们由长宽高为参数得到vertices与triangles. 二.基本程序框架 创建一个empty的gameobject,挂在脚本. 由基本思路可得基本框架,之后,实现函数功能即可

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

注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中如果有我的额外说明,我会加上[lufy:],另外,鄙人webgl研究还不够深入,一些专业词语,如果翻译有误,欢迎大家指正. 这是本次的demo的运行结果 绘制流程 这次终于该绘制多边形了,之前的文章(十一,着色器的编译和连接)中介绍了HTML,顶点着色器和片段着色器,这次看一下javascript从开始到最终的全部处理.如果前两篇文章介绍的内容完全理解的话,这次的内容也应该不难了.或许会有不容易理解的地方,不要着急

Unity3D之Mesh(五)绘制圆

前言: Unity3D中Mesh的基本单位是三角形,而圆形就是由许许多多的三角形组成的.那么我们就知道了绘制圆形的Mesh需要两个变量:圆的半径  以及分割数: 一.实现过程 基本过程与之前的类似,最基本的依然是顶点以及三角形索引数组,即:我们需要根据圆的半径以及预备的分割数,通过算法得到:顶点的Vector3数组 以及对应的三角形索引数组: 1.基本的程序实现架构如下: using UnityEngine; [RequireComponent(typeof(MeshRenderer), typ

百度地图实现鼠标绘制多边形并获取所有点坐标

百度地图开放平台http://lbsyun.baidu.com/ 这里使用的是Javascript API http://lbsyun.baidu.com/index.php?title=jspopular 实现鼠标绘制多边形主要用到百度地图JavaScript开源库鼠标绘制工具条库(http://lbsyun.baidu.com/index.php?title=open/library),提供鼠标绘制点.线.面.多边形(矩形.圆)的编辑工具条的开源代码库.且用户可使用JavaScript AP

怎么在CAD中绘制多边形

现在加入CAD行业的小伙伴们也越来越多了,但是对于才刚刚了解CAD的小伙伴们来说要想学好CAD,光有理论基础肯定是不行的,还是要经过不断的练习才可以的,那对于CAD小白来说,怎么在CAD中绘制多边形?小伙伴们都知道吗?如果不知道的小伙伴们就可以看看一下操作步骤,希望能够帮助到你们. 第一步:首先,打开电脑如果没有在电脑中打开一个浏览器,搜索框中搜索迅捷CAD编辑器,接着点击进入官网,点击下载安装最新版本的CAD编辑器.安装完成之后,将该软件进行启动进入到该软件的操作界面中. 第二步:进入到编辑器

用线框模式绘制多边形 glPolygonMode

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glBegin(GL_TRIANGLES);//开始以g_ViewMode模式绘制 glColor3ub(182.0f,88.0f,157.0f); for(int j = 0; j < objAndRoofIndex.size(); j+=2) // 遍历所有的面 { for(int tex = 0; tex < 3; tex++) // 遍历三角形的所有点 { int index = pLoadModel

canvas绘制多边形

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>canvas绘制多边形</title> </head> <body> <canvas id="canvas" style="border: 1px solid darkcyan;" wid

Unity3D之Mesh(六)绘制扇形、扇面、环形

前言: 绘制了圆,就想到绘制与之相关的几何图形,以便更灵活的掌握Mesh动态创建模型的机制与方法. 一.分析: 首先,结合绘制圆的过程绘制环形: 圆形是由segments个等腰三角形组成的(上一篇中,将圆分为segments份,即segments个等腰三角形),圆环就是有segments个等腰梯形组成的. 那么等腰梯形由什么组成?两个三角形(多个也是可以的). 故:添加一个变量,内圆半径. 即:到此时此刻,我们需要根据:外半径.内半径.分割的数目(  当然如果是扇形或扇面,我们还需要一个角度an

Unity 绘制多边形

最近工程需要用到一个多边形用来查看角色属性,于是就研究了下Mesh用网格做了一个.遗憾的的 UGUI 渲染不了 3D 物体,然后又用了一段时间研究了下UGUI的网格绘制. 不过终于还是完成了,虽然有些瑕疵…… 好吧 有很大的问题 UV 需要自己计算.(如果有朋友精通这一块,希望能帮忙改进一下) 下边是5.2以下版本使用 的 5.2(包括)以上的 请点击这个连接 在Unity中一个Mesh使用3个顶点就能画出来,但是UGUI需要使用四个顶点才行,所以在画一些特殊模型的时候就会产生一些废点(对图形没