Unity Mesh基础系列(三)立方体球(更好更圆)

本教程介绍了如何在Unity中将立方体转换为球体,通过数学优化方法实现更均匀的网格分布。首先,通过调整圆角立方体的参数得到初步的球体,然后创建一个专门的CubeSphere组件。接着,通过分析和可视化映射,发现并解决网格单元不均匀的问题。最后,提出新的映射公式,以改善球体的网格分布,使其更均匀。文章适合Unity开发者和数学爱好者阅读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1 适配圆角立方体

2 检查映射

3 用数学来玩

4 调整映射

本章重点:

1、把立方体变为球体

2、在Unity中可视化映射

3、分析换算的损耗

4、用数学优化算法

在本教程中,我们将创建一个基于立方体的球面网格,然后再使用数学推理来改进它。

本教程是CatLikeCoding系列的一部分,原文地址见文章底部。“原创”标识意为原创翻译而非原创教程。

这篇文章是基于前一篇 圆角立方体 上的拓展。兼容Unity 5.0.1或者更高级的版本。

(从一种形状变到另一种形状)

1 适配圆角立方体

通过上一篇文章,其实你可能已经发现了,只要我们把它所有三维的尺寸设置一样,并把圆度值设置为纬度值的一半就能得到一个完美的球体了。

但如果你确实只想要一个球体,那么圆角立方体所提供的灵活度就不够用了。那么,这次让我们为这个需求创建一个单独的组件来实现。

复制RoundedCube脚本并将其重命名为CubeSphere。然后用一个 gridSize 替换这三个大小,并删除 roundness 字段。

怎么快速的将3个字段替换成1个?

最方便的方法就是使用编辑器rename变量名,这会保证对它们的所有引用也被重命名。

比如,首先将xSize重命名为GridSize,然后对ySize和zSize执行相同的操作。

或者,执行多个搜索和替换操作。

删除roundness字段肯定会导致一些编译错误,因为引用到它的地方还没有处理,删掉相关的引用即可。

然后,我们可以先创建一个碰撞体。上一章节,我们创建了多个box 和capsule (胶囊)碰撞体来表示圆角立方体,但是球体只需要一个球体立方体即可。这意味着我们可以删除AddBoxCollider和AddCapsuleCollider方法,并将CreateColliders简化为一行代码。

其次是顶点的位置,它也依赖于roundness字段。先前我们通过对向量设置法线的方法形成了圆角立方体的角,并且该向量从角的内部指向原始立方体的某个位置。但是当我们要处理成一个球体的时候,这就是我们唯一和必须要做的,因为其他的情况都会退化掉。

如果球体的坐标系是以它的局部原点为中心的话,会很方便的。我们不用再费时用内部的立方体和不同的圆以及网格来共同搭建mesh了。

要创建一个单位球体--半径为1单位的球体--首先需要规范位于原点中心的立方体的顶点,使立方体能准确地包含球体,那么它的边长就为2。

(单位圆的包围正方形边长2)

我们可以在

### 关于 UnityMesh 的使用教程和属性介绍 #### 创建基本的 Mesh 对象 在 Unity 中,`Mesh` 是一种用于表示维物体表面的数据结构。为了创建一个自定义的 `Mesh`,通常需要指定顶点的位置、法线方向以及纹理坐标等信息[^1]。 ```csharp using UnityEngine; public class CreateSimpleMesh : MonoBehaviour { private void Start() { Mesh mesh = new Mesh(); Vector3[] vertices = new Vector3[8]; // 定义立方体八个角上的顶点位置 int[] triangles = new int[]{ 0, 2, 1, 2, 3, 1, 4, 6, 5, 6, 7, 5, 0, 4, 1, 4, 5, 1, 2, 6, 3, 6, 7, 3, 0, 2, 4, 2, 6, 4, 1, 3, 5, 3, 7, 5 }; // 设置构成各个面片所需的索引列表 mesh.vertices = vertices; mesh.triangles = triangles; // 新网格数据并应用mesh.RecalculateNormals(); // 让引擎自动计算合适的法向量 mesh.Optimize(); // 优化内部存储方式提高性能效率 // 将新创建好的mesh分配给当前游戏对象下的MeshFilter组件 this.GetComponent<MeshFilter>().mesh = mesh; } } ``` 上述代码展示了如何构建一个最基础版本的立方体模型,并将其绑定至场景内的某个GameObject之上。需要注意的是,在实际操作过程中还需要进一步完善诸如材质贴图等功能特性才能达到理想中的视觉呈现效果[^5]。 #### 添加材质与渲染支持 为了让生成后的几何形状能够被正确显示出来,除了准备好数学描述外还需附加必要的可视化参数——即Material资源文件;同时也要确保该物体拥有相应的Renderers以便完成最终的画面合成过程。 ```csharp // 继续上面的例子... void SetupRendering(){ Material material = Resources.Load<Material>("Materials/MyCustomMat"); if(material != null){ Renderer rendererComponent = gameObject.AddComponent<Renderer>(); rendererComponent.material = material; }else{ Debug.LogError("Failed to load custom material."); } } ``` 这段脚本片段说明了怎样加载预设材料并通过编程手段动态地指派给特定的游戏实体。当然也可以直接通过Inspector界面手动关联已有的Assets来简化流程。 #### 进阶话题:动态调整 Mesh 结构 对于某些特殊应用场景而言可能涉及到频繁修改现有网格拓扑的情况,这时就需要掌握多高级技巧比如增量新部分区域而必每次都重建整个结构从而节省开销提升运行速度。 例如当只需要改变某几个定点坐标时可以仅针对这些变化作出响应而是重置全部属性值: ```csharp Vector3[] updatedVertices = ... ; // 新的顶点数组 int startIndex = ... ; int count = ... ; mesh.SetVertices(updatedVertices); mesh.SetTriangles(triangleIndices.ToArray(), submeshIndex); // 只重新计算受影响范围内的法线和其他辅助信息 mesh.RecalculateBounds(); mesh.RecalculateNormals(startIndex, count); ``` 以上就是有关UnityMesh的一些核心概念和技术要点概述。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值