unity通过Mesh网格绘制图形球体

作者:akuojustdoit 时间:2023-12-12 08:08:21 

本文实例为大家分享了unity通过Mesh网格绘制球体的具体代码,供大家参考,具体内容如下

接着上一篇文章说:

球体


public class 球体 : MonoBehaviour
{
   MeshRenderer meshRenderer;
   MeshFilter meshFilter;

List<Vector3> verts;
   List<int> indices;
   int N = 10;
   void Start()
   {
       verts = new List<Vector3>();
       indices = new List<int>();
       meshRenderer = GetComponent<MeshRenderer>();
       meshFilter = GetComponent<MeshFilter>();
       BuildModel();
   }

void BuildModel()
   {
       for(float i = -N / 2f; i <= N / 2f; i++)
       {
           for(float j = -N / 2f; j <= N / 2f; j++)
           {
               verts.Add(new Vector3(i, j, -N / 2f));
           }
       }
       for (float i = -N / 2f; i <= N / 2f; i++)
       {
           for (float j = -N / 2f; j <= N / 2f; j++)
           {
               verts.Add(new Vector3(N / 2f, j, i));
           }
       }
       for (float i = -N / 2f; i <= N / 2f; i++)
       {
           for (float j = -N / 2f; j <= N / 2f; j++)
           {
               verts.Add(new Vector3(i, N / 2f, j));
           }
       }
       for (float i = -N / 2f; i <= N / 2f; i++)
       {
           for (float j = -N / 2f; j <= N / 2f; j++)
           {
               verts.Add(new Vector3(-N / 2f, j, i));
           }
       }
       for (float i = -N / 2f; i <= N / 2f; i++)
       {
           for (float j = -N / 2f; j <= N / 2f; j++)
           {
               verts.Add(new Vector3(i, j, N / 2f));
           }
       }
       for (float i = -N / 2f; i <= N / 2f; i++)
       {
           for (float j = -N / 2f; j <= N / 2f; j++)
           {
               verts.Add(new Vector3(i, -N / 2f, j));
           }
       }

//真正控制球体成型的部分
       for (int i = 0; i < verts.Count; i++)
       {
           verts[i] = verts[i].normalized;
       }
       //绘制
       MakePos(0);
       MakePos(1);
       MakePos(2);
       OtherMakePos(3);
       OtherMakePos(4);
       OtherMakePos(5);
       Draw();
   }
   public void MakePos(int num)
   {
       for (int i = 0; i < N; i++)
       {
           for (int j = 0; j < N; j++)
           {
               int index = j * (N + 1) + (N + 1) * (N + 1)* num + i;
               int up = (j + 1) * (N + 1) + (N + 1) * (N + 1)* num + i;
               indices.AddRange(new int[] { index, index + 1, up + 1 });
               indices.AddRange(new int[] { index, up + 1, up });
           }
       }
   }
   public void OtherMakePos(int num)
   {
       for (int i = 0; i < N + 1; i++)
       {
           for (int j = 0; j < N + 1; j++)
           {
               if (i != N && j != N)
               {
                   int index = j * (N + 1) + (N + 1) * (N + 1) * num + i;
                   int up = (j + 1) * (N + 1) + (N + 1) * (N + 1) * num + i;
                   indices.AddRange(new int[] { index, up + 1, index + 1 });
                   indices.AddRange(new int[] { index, up, up + 1 });
               }
           }
       }
   }
   public void Draw()
   {
       Mesh mesh = new Mesh();
       mesh.vertices = verts.ToArray();
       mesh.triangles = indices.ToArray();
       mesh.RecalculateNormals();
       mesh.RecalculateBounds();
       meshFilter.mesh = mesh;
   }
}

原理

假设手里有个空的正方体牛奶盒,我们拿习惯向里吹起,会让牛奶盒的六个面都鼓起来。牛奶盒够软并且气体足够多的话,它就会越逼近球体。
即:先创建一个正方体/长方体/正八面体等等等等,只要是个闭合的图形并且顶点的数量够多分布的够均匀,效果应该就不错。

然后将所有的顶点和物体中心连线并截取同样的长度,保证所有顶点到中心点的距离相等。

调整所有三角形顶点的坐标和物体中心的距离相等:

取正方体的中心点作为球的中心点,也是为了让各个顶点分布的比较均匀。
以下是设定球的半径为1并且中心点刚好在(0,0,0)的情况:


for (int i = 0; i < verts.Count; i++)
       {
           verts[i] = verts[i].normalized;
       }

若中心点不在(0,0,0)的话


for (int i = 0; i < verts.Count; i++)
           {
               Vector3 vec3 = verts[i];
               Vector3 o = new Vector3(1, 2, 3);//例如中心点在(1,2,3)
               verts[i] = o + (vec3 - o).normalized;
           }

效果:

unity通过Mesh网格绘制图形球体

原来正方体的接缝处变成球体之后仍存在:
原因请参考上一章讨论绘制正方体的部分:链接: 绘制正方体.

unity通过Mesh网格绘制图形球体

来源:https://blog.csdn.net/akuojustdoit/article/details/114592160

标签:unity,Mesh,球体
0
投稿

猜你喜欢

  • 云IDE:Eclipse Che:Eclipse下一代IDE(推荐)

    2023-04-01 05:58:27
  • SpringBoot Security权限控制自定义failureHandler实例

    2022-12-03 08:46:58
  • Android进阶Handler应用线上卡顿监控详解

    2022-12-21 11:31:00
  • 手写java性能测试框架第二版

    2023-03-15 14:07:31
  • Mybatis配置返回为修改影响条数方式

    2021-10-26 12:05:05
  • C#客户端程序Visual Studio远程调试的方法详解

    2022-10-20 19:13:54
  • Java RandomAccessFile 指定位置实现文件读取与写入

    2023-06-05 17:06:25
  • 详解java中保持compareTo和equals同步

    2023-07-20 12:20:53
  • java反射获取和调用方法

    2021-11-23 11:05:02
  • Java模拟QQ桌面截图功能实现方法

    2021-09-19 16:30:02
  • IDEA查看Scala的源码的教程图解

    2023-12-13 22:50:45
  • Java数据结构之数组(动力节点之Java学院整理)

    2023-09-23 21:20:12
  • Android View 事件分发机制详解

    2023-11-26 05:18:13
  • Android表格自定义控件使用详解

    2023-12-23 23:35:36
  • Java中instanceof关键字实例讲解

    2023-08-04 07:48:31
  • Android Button按钮点击背景和文字变化操作

    2023-10-27 22:27:22
  • Spring boot随机端口你都不会还怎么动态扩容

    2021-09-29 10:10:14
  • Java的枚举类型使用方法详解

    2023-11-19 04:32:55
  • Android中ListView用法实例分析

    2022-04-08 17:11:29
  • C# 多窗口委托通信的实现

    2023-01-22 02:21:31
  • asp之家 软件编程 m.aspxhome.com