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

目录1 适配圆角立方体2 检查映射3 用数学来玩4 调整映射本章重点:1、把立方体变为球体2、在Unity中可视化映射3、分析换算的损耗4、用数学优化算法在本教程中,我们将创建一个基于立...
摘要由CSDN通过智能技术生成

目录

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)

我们可以在 SetVertex 内创建这个立方体的顶点,方法是将原始坐标除以网格大小,缩放,然后减去单位向量。

这就产生了一个单位球体,但有的时候,可能需要一个不同的半径,所以让我们让它可以配置。

现在,我们可以将一个立方体对象放到场景中,你可以从头开始自己按照教程写,或者直接用源码里提供的组件,替换圆角立方体对象的组件。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
你可以通过在Unity中使用Mesh来绘制圆角角形。下面是一个简单的示例代码,演示如何创建一个圆角角形的Mesh: ```csharp using UnityEngine; public class RoundedTriangle : MonoBehaviour { public float radius = 1f; public int segments = 30; void Start() { MeshFilter meshFilter = gameObject.AddComponent<MeshFilter>(); MeshRenderer meshRenderer = gameObject.AddComponent<MeshRenderer>(); Mesh mesh = new Mesh(); meshFilter.mesh = mesh; Vector3[] vertices = new Vector3[segments + 2]; int[] triangles = new int[segments * 3]; vertices[0] = Vector3.zero; // 中心点 float angleIncrement = 360f / segments; float currentAngle = 0f; for (int i = 1; i < segments + 2; i++) { float x = Mathf.Cos(Mathf.Deg2Rad * currentAngle) * radius; float y = Mathf.Sin(Mathf.Deg2Rad * currentAngle) * radius; vertices[i] = new Vector3(x, y, 0f); currentAngle += angleIncrement; } for (int i = 0; i < segments; i++) { triangles[i * 3] = 0; triangles[i * 3 + 1] = i + 1; triangles[i * 3 + 2] = i + 2; } mesh.vertices = vertices; mesh.triangles = triangles; mesh.RecalculateNormals(); // 可以在这里设置材质等其他属性 } } ``` 将脚本挂载到一个空的GameObject上,然后在Inspector面板中调整radius和segments属性来控制圆角角形的大小和分段数。运行游戏后,你将在场景中看到绘制的圆角角形。 注意:此示例仅绘制了一个平面的圆角角形,如果你需要在3D空间中绘制一个具有深度的圆角角形,你可能需要使用更复杂的算法来生成相应的顶点和角形。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值