用unity写一个生成胶囊体mesh的脚本
时间: 2023-05-20 07:06:46 浏览: 38
当然可以,以下是一个简单的Unity脚本,可以生成胶囊体Mesh:
```csharp
using UnityEngine;
public class CapsuleMeshGenerator : MonoBehaviour
{
public float radius = 0.5f;
public float height = 1.0f;
public int segments = 16;
private MeshFilter meshFilter;
void Start()
{
meshFilter = GetComponent<MeshFilter>();
meshFilter.mesh = GenerateCapsuleMesh(radius, height, segments);
}
Mesh GenerateCapsuleMesh(float radius, float height, int segments)
{
Mesh mesh = new Mesh();
int numVertices = (segments + 1) * (segments + 1) + 2;
int numTriangles = segments * segments * 2 * 3 + segments * 6;
Vector3[] vertices = new Vector3[numVertices];
Vector2[] uv = new Vector2[numVertices];
int[] triangles = new int[numTriangles];
int vertexIndex = 0;
int triangleIndex = 0;
// Generate top hemisphere
for (int y = 0; y <= segments / 2; y++)
{
float v = (float)y / (segments / 2);
float latitude = Mathf.PI / 2 - v * Mathf.PI / 2;
for (int x = 0; x <= segments; x++)
{
float u = (float)x / segments;
float longitude = u * Mathf.PI * 2;
float xCoord = Mathf.Sin(latitude) * Mathf.Cos(longitude);
float yCoord = Mathf.Cos(latitude);
float zCoord = Mathf.Sin(latitude) * Mathf.Sin(longitude);
vertices[vertexIndex] = new Vector3(xCoord * radius, yCoord * radius + height / 2, zCoord * radius);
uv[vertexIndex] = new Vector2(u, v);
if (x < segments && y < segments / 2)
{
triangles[triangleIndex++] = vertexIndex;
triangles[triangleIndex++] = vertexIndex + segments + 1;
triangles[triangleIndex++] = vertexIndex + segments;
triangles[triangleIndex++] = vertexIndex;
triangles[triangleIndex++] = vertexIndex + 1;
triangles[triangleIndex++] = vertexIndex + segments + 1;
}
vertexIndex++;
}
}
// Generate bottom hemisphere
for (int y = segments / 2; y <= segments; y++)
{
float v = (float)y / (segments / 2);
float latitude = Mathf.PI / 2 - v * Mathf.PI / 2;
for (int x = 0; x <= segments; x++)
{
float u = (float)x / segments;
float longitude = u * Mathf.PI * 2;
float xCoord = Mathf.Sin(latitude) * Mathf.Cos(longitude);
float yCoord = Mathf.Cos(latitude);
float zCoord = Mathf.Sin(latitude) * Mathf.Sin(longitude);
vertices[vertexIndex] = new Vector3(xCoord * radius, yCoord * radius - height / 2, zCoord * radius);
uv[vertexIndex] = new Vector2(u, v);
if (x < segments && y < segments)
{
triangles[triangleIndex++] = vertexIndex;
triangles[triangleIndex++] = vertexIndex + segments;
triangles[triangleIndex++] = vertexIndex + segments + 1;
triangles[triangleIndex++] = vertexIndex;
triangles[triangleIndex++] = vertexIndex + segments + 1;
triangles[triangleIndex++] = vertexIndex + 1;
}
vertexIndex++;
}
}
// Generate top cap
vertices[vertexIndex] = new Vector3(0, height / 2 - radius, 0);
uv[vertexIndex] = new Vector2(0.5f, 1);
int topCapIndex = vertexIndex;
for (int i = 0; i < segments; i++)
{
int i1 = i + 1;
triangles[triangleIndex++] = topCapIndex;
triangles[triangleIndex++] = i1;
triangles[triangleIndex++] = i;
}
// Generate bottom cap
vertices[vertexIndex] = new Vector3(0, -height / 2 + radius, 0);
uv[vertexIndex] = new Vector2(0.5f, 0);
int bottomCapIndex = vertexIndex;
for (int i = 0; i < segments; i++)
{
int i1 = i + 1;
triangles[triangleIndex++] = bottomCapIndex;
triangles[triangleIndex++] = i + segments * (segments / 2 + 1) + 1;
triangles[triangleIndex++] = i1 + segments * (segments / 2 + 1) + 1;
}
mesh.vertices = vertices;
mesh.uv = uv;
mesh.triangles = triangles;
mesh.RecalculateNormals();
mesh.RecalculateBounds();
return mesh;
}
}
```
这个脚本可以将一个胶囊体的Mesh生成并赋值给一个MeshFilter组件。你可以将这个脚本挂载到一个GameObject上,然后在Inspector面板中设置半径、高度和细分级别,就可以生成不同大小和精度的胶囊体了。
相关推荐

















