zoukankan      html  css  js  c++  java
  • Unity Mesh 网格绘制多边形

      利用 Mesh 网格在理论上可以绘制出各种形状,而原理就是所有图形都是由三角形构成的

     

    一、绘制三角形

     1     // 绘制的材质
     2     public Material material;
     3 
     4     void DrawTriangle()
     5     {
     6         // 添加 MeshFilter 和 MeshRenderer 组件
     7         gameObject.AddComponent<MeshFilter>();
     8         gameObject.AddComponent<MeshRenderer>();
     9 
    10         // 绘制图案的材质
    11         gameObject.GetComponent<MeshRenderer>().material = material;
    12 
    13         Mesh mesh = GetComponent<MeshFilter>().mesh;
    14         mesh.Clear();
    15 
    16         // 设置顶点
    17         mesh.vertices = new Vector3[] { new Vector3(0, 0, 0), new Vector3(0, 1, 0), new Vector3(1, 1, 0) };
    18         
    19         // 设置三角形顶点顺序,顺时针设置
    20         mesh.triangles = new int[] { 0, 1, 2 };
    21     }
    • 添加组件:MeshFilter 和 MeshRenderer 组件是绘制 Mesh 网格必须的

    • 指定顶点:比如三角形,需要指定三个顶点

    • 指定顶点顺序:triangles 数组的大小必须是3的倍数,顶点的顺序必须是顺时针(逆时针只能在反面才能看到)

     绘制完成的图形:

     

    二、绘制正方形

     1     // 绘制的材质
     2     public Material material;
     3 
     4     void Start()
     5     {
     6         DrawSquare();
     7     }
     8 
     9     void DrawSquare()
    10     {
    11         // 添加 MeshFilter 和 MeshRenderer 组件
    12         gameObject.AddComponent<MeshFilter>();
    13         gameObject.AddComponent<MeshRenderer>();
    14 
    15         // 绘制图案的材质
    16         gameObject.GetComponent<MeshRenderer>().material = material;
    17 
    18         Mesh mesh = GetComponent<MeshFilter>().mesh;
    19         mesh.Clear();
    20 
    21         // 设置顶点
    22         mesh.vertices = new Vector3[] { new Vector3(0, 0, 0), new Vector3(0, 1, 0), new Vector3(1, 1, 0), new Vector3(1, 0, 0) };
    23         mesh.triangles = new int[] { 0, 1, 2, 0, 2, 3 };
    24     }

     绘制两个三角形就可以组成正方形,所以只要在三角形的基础上再加一个点(1,0)就可以了

     绘制完成的图形:

     

    三、绘制圆形

     1     // 绘制的材质
     2     public Material material;
     3 
     4     void Start()
     5     {
     6         DrawCircle(3, 50, Vector3.zero);
     7     }
     8 
     9     /// <summary>
    10     /// 画圆
    11     /// </summary>
    12     /// <param name="radius"> 圆的半径 </param>
    13     /// <param name="segments"> 圆的分割数 </param>
    14     /// <param name="centerCircle"> 圆心的位置 </param>
    15     void DrawCircle(float radius, int segments, Vector3 centerCircle)
    16     {
    17         gameObject.AddComponent<MeshFilter>();
    18         gameObject.AddComponent<MeshRenderer>();
    19         gameObject.GetComponent<MeshRenderer>().material = material;
    20 
    21         // 计算所需顶点
    22         Vector3[] vertices = new Vector3[segments + 1];
    23         vertices[0] = centerCircle;
    24         float deltaAngle = Mathf.Deg2Rad * 360f / segments;
    25         float currentAngle = 0;
    26         for (int i = 1; i < vertices.Length; i++)
    27         {
    28             float cosA = Mathf.Cos(currentAngle);
    29             float sinA = Mathf.Sin(currentAngle);
    30             vertices[i] = new Vector3(cosA * radius + centerCircle.x, sinA * radius + centerCircle.y, 0);
    31             currentAngle += deltaAngle;
    32         }
    33 
    34         // 绘制所需三角形
    35         int[] triangles = new int[segments * 3];
    36         for (int i = 0, j = 1; i < segments * 3 - 3; i += 3, j++)
    37         {
    38             triangles[i] = 0;
    39             triangles[i + 1] = j + 1;
    40             triangles[i + 2] = j;
    41         }
    42         triangles[segments * 3 - 3] = 0;
    43         triangles[segments * 3 - 2] = 1;
    44         triangles[segments * 3 - 1] = segments;
    45 
    46         Mesh mesh = GetComponent<MeshFilter>().mesh;
    47         mesh.Clear();
    48 
    49         mesh.vertices = vertices;
    50         mesh.triangles = triangles;
    51     }

     绘制圆形的函数需要的参数:半径、圆心坐标以及分割的个数(即组成的三角形个数)

     在相同大小的情况下,分割数越多,所绘制的圆越圆滑

     如下图,分别是分割数 10 和分割数 50 绘制出来的圆形

    四、绘制圆环

     1     // 绘制的材质
     2     public Material material;
     3 
     4     void Start()
     5     {
     6         DrawRing(3, 2, 50, Vector3.zero);
     7     }
     8 
     9     /// <summary>
    10     /// 画圆环
    11     /// </summary>
    12     /// <param name="radius"> 圆半径 </param>
    13     /// <param name="innerRadius"> 内圆半径 </param>
    14     /// <param name="segments"> 圆的分个数 </param>
    15     /// <param name="centerCircle"> 圆心坐标 </param>
    16     void DrawRing(float radius, float innerRadius, int segments, Vector3 centerCircle)
    17     {
    18         gameObject.AddComponent<MeshFilter>();
    19         gameObject.AddComponent<MeshRenderer>();
    20         gameObject.GetComponent<MeshRenderer>().material = material;
    21 
    22         // 所需顶点
    23         Vector3[] vertices = new Vector3[segments * 2];
    24         float deltaAngle = Mathf.Deg2Rad * 360f / segments;
    25         float currentAngle = 0;
    26         for (int i = 0; i < vertices.Length; i += 2)
    27         {
    28             float cosA = Mathf.Cos(currentAngle);
    29             float sinA = Mathf.Sin(currentAngle);
    30             vertices[i] = new Vector3(cosA * innerRadius + centerCircle.x, sinA * innerRadius + centerCircle.y, 0);
    31             vertices[i + 1] = new Vector3(cosA * radius + centerCircle.x, sinA * radius + centerCircle.y, 0);
    32             currentAngle += deltaAngle;
    33         }
    34 
    35         // 所需三角形
    36         int[] triangles = new int[segments * 6];
    37         for (int i = 0, j = 0; i < segments * 6; i += 6, j += 2)
    38         {
    39             triangles[i] = j;
    40             triangles[i + 1] = (j + 3) % vertices.Length;
    41             triangles[i + 2] = (j + 1) % vertices.Length;
    42 
    43             triangles[i + 3] = j;
    44             triangles[i + 4] = (j + 2) % vertices.Length;
    45             triangles[i + 5] = (j + 3) % vertices.Length;
    46         }
    47 
    48         Mesh mesh = GetComponent<MeshFilter>().mesh;
    49         mesh.Clear();
    50 
    51         mesh.vertices = vertices;
    52         mesh.triangles = triangles;
    53     }

     圆环也是在圆形的基础上,由三角形构成梯形,再由梯形按分割数组成圆环

     而这里比圆形多了一个参数:内圆半径,通过两个圆的大小去指定圆环的大小

     同样,在相同大小的情况下,分割数越多,所绘制的圆环越圆滑

     如下图,分别是分割数 10 和分割数 50 绘制出来的圆环

     

     而绘制其他多边形也是同样的原理:

     先确定多边形的各个顶点,然后按照顶点的顺序绘制所需要三角形,最后由绘制的三角形构成所要绘制的多边形

    *** |  以上内容仅为学习参考、学习笔记使用  | ***

  • 相关阅读:
    HDOJ线段树专题(A Simple Problem with Integers)
    COJ1183(计算表达式的值)
    理解匈牙利算法求二分匹配
    COJ1143(走迷宫)
    COJ1184格林布的地雷
    POJ2387(Til the Cows Come Home)
    POJ3264(Balanced Lineup)
    调用android手机微博客户端发送微博
    用位来保存信息
    为什么类的成员变量是自身类型时只可以声明
  • 原文地址:https://www.cnblogs.com/ChenZiRong1999/p/13297828.html
Copyright © 2011-2022 走看看