zoukankan      html  css  js  c++  java
  • 关于Unity底层Mesh网格绘制多边形的实现

    首先介绍一下关于自定义Mesh多边形所必须的组件:

    1.Mesh Filter组件:用于Mesh网格搭建形成形状样子

    2.Mesh Renderer组件:用于将搭建出来的形状渲染出来,通俗来讲就是给他皮肤,给他颜色等等

    我们都知道各个图形都是由很多个小的三角形组拼出来的,那么形成我们的Mesh所需要的条件就跟三角形有关

    1.顶点坐标:一个Vector3[] 数组

    2.指定三角形的顶点排序: 一个Int[] 数组

    3.UV、法线、切线的重新制定:Unity内置方法已经写好

    这里通过一个例子说明一下Mesh绘制多边形问题:

    首先,在场景中我们新建一个Plane面,并设置其标签Tag为“Ground”,用于我们手动取点检测

    然后,新建取点脚本“GetEnterPoints”,用于收集我们在Plane面上的点(挂挂载在场景中)

    接下来,新建生成多边形脚本“CreateMesh”,用于生成我们自定义的多边形

    最后,运行点击进行测试

    当然,脚本的类名根据需要自定义更改,下面附上代码与效果图

    “GetEnterPoints”脚本:

     1 using UnityEngine;
     2 using System.Collections;
     3 using System.Collections.Generic;
     4 
     5 
     6 //获取组成多变形点类
     7 public class GetEnterPoints : MonoBehaviour
     8 {
     9     //存储手动获取到的多边形点列表
    10     private List<Vector3> m_enterPoints = new List<Vector3>(); 
    11     
    12     // Update is called once per frame
    13     void Update () {
    14 
    15         //左键取点
    16         if (Input.GetMouseButtonDown(0))
    17         {
    18             //屏幕位置转射线
    19             Ray tRay = Camera.main.ScreenPointToRay(Input.mousePosition);
    20             //射线返回点信息
    21             RaycastHit tHit;
    22             //发射射线
    23             if(Physics .Raycast( tRay ,out tHit ))
    24             {
    25                 //如果打在地面上,则将点存储起来
    26                 if (tHit.transform.tag == "Ground")
    27                 {
    28                     //这里为了形成的面不与原先底板重合,提升了一个高度
    29                     m_enterPoints.Add(tHit.point + new Vector3(0, 1, 0));
    30                 }
    31             }
    32         }
    33 
    34         //右键形成面
    35         if (Input.GetMouseButtonDown(1))
    36         {
    37             //形成面至少三点
    38             if (m_enterPoints.Count > 2)
    39             {
    40                 //调用形成多变形方法
    41                 CreateMesh tCreatMesh = new CreateMesh();
    42                 tCreatMesh.DoCreatPloygonMesh(m_enterPoints.ToArray());
    43 
    44                 //每次绘制完清空手动获取的点列表
    45                 m_enterPoints.Clear();
    46 
    47             }
    48 
    49         }
    50 
    51     }
    52 }

     “CreateMesh”脚本:

     1 using UnityEngine;
     2 using System.Collections;
     3 using System.Collections.Generic;
     4 
     5 
     6 // 创建自定义Mesh类
     7 public class CreateMesh : MonoBehaviour {
     8 
     9 
    10     /// <summary>
    11     /// 生成自定义多边形方法
    12     /// </summary>
    13     /// <param name="s_Vertives">自定义的顶点数组</param>
    14     public  void DoCreatPloygonMesh(Vector3 []s_Vertives)
    15     {
    16         //新建一个空物体进行进行绘制自定义多边形
    17         GameObject tPolygon = new GameObject("tPolygon");
    18 
    19         //绘制所必须的两个组件
    20         tPolygon.AddComponent<MeshFilter>();
    21         tPolygon.AddComponent<MeshRenderer>();
    22 
    23         //新申请一个Mesh网格
    24         Mesh tMesh = new Mesh();
    25 
    26         //存储所有的顶点
    27         Vector3[] tVertices = s_Vertives;
    28 
    29         //存储画所有三角形的点排序
    30         List<int> tTriangles = new List<int>();
    31 
    32         //根据所有顶点填充点排序
    33         for (int i = 0; i < tVertices .Length -1; i++)
    34         {
    35             tTriangles.Add(i);
    36             tTriangles.Add(i+1);
    37             tTriangles.Add(tVertices .Length -i-1);
    38         }
    39 
    40         //赋值多边形顶点
    41         tMesh.vertices = tVertices;
    42 
    43         //赋值三角形点排序
    44         tMesh.triangles = tTriangles.ToArray();
    45 
    46         //重新设置UV,法线
    47         tMesh.RecalculateBounds();
    48         tMesh.RecalculateNormals();
    49 
    50         //将绘制好的Mesh赋值
    51         tPolygon.GetComponent<MeshFilter>().mesh = tMesh;
    52 
    53     }
    54 
    55 }

    绘制前效果与绘制后效果:

    当然,根据需要自定义取点(点数大于等于3),也可自定义添加材质达到美观效果。

  • 相关阅读:
    bzoj 3732: Network 树上两点边权最值
    思维题题集--------一直都很害怕这些题
    Regionals 2014 >> Asia
    小小粉丝度度熊 二分答案 + two pointer
    I
    Binary Strings Gym
    卸载虚拟机时错误关闭了某个服务,使得电脑除了chrome浏览器都不能联网
    双系统给ubuntu增加分区
    tomcat问题
    eclipse:报错信息The superclass “javax.servlet.http.HttpServlet” was not found on the Java Build Path
  • 原文地址:https://www.cnblogs.com/mrmocha/p/7998207.html
Copyright © 2011-2022 走看看