基于 上一篇 绘制圆管 改编
[RequireComponent(typeof(MeshRenderer))]
//自动添加网格数据组件
[RequireComponent(typeof(MeshFilter))]
public class CylinderCut : MonoBehaviour
{
Mesh mesh;
VertexHelper vh;
//内部半径
float insideR = 3;
//外部半径
float outerR = 6;
float height = 15;
float num = 26;
//弧度
float angel;
// Start is called before the first frame update
void Start()
{
//new 一个新的网格
mesh = new Mesh();
//new 一个新的顶点帮助器
vh = new VertexHelper();
//弧度
angel = 2 * Mathf.PI / num;
for (int i = 0; i < num; i++)
{
// 底 内圆
float x = Mathf.Cos(angel * i) * insideR;
float y = Mathf.Sin(angel * i) * insideR;
vh.AddVert(new Vector3(x, -height / 2, y), Color.white, new Vector2(0, 0));
vh.AddVert(new Vector3(x, height / 2, y), Color.white, new Vector2(0, 0));
//底 外圆
float x1 = Mathf.Cos(angel * i) * outerR;
float y1 = Mathf.Sin(angel * i) * outerR;
vh.AddVert(new Vector3(x1, -height / 2, y1), Color.white, new Vector2(0, 0));
vh.AddVert(new Vector3(x1, height / 2, y1), Color.white, new Vector2(0, 0));
if (i <= num / 2)
{
if (i == 0 || i == num /2)
{
if (i == 0)
{
vh.AddTriangle(4, 5, 7);
vh.AddTriangle(4, 7, 6);
}
else
{
vh.AddTriangle(i * 4 + 2, i * 4 + 3, i * 4 + 1);
vh.AddTriangle(i * 4 + 2, i * 4 + 1, i*4);
}
}
else
{
//地 圆 顺时针 下可看
vh.AddTriangle(i * 4, i * 4 + 2, (i + 1) * 4 + 2);
vh.AddTriangle(i * 4, (i + 1) * 4 + 2, (i + 1) * 4);
// 高 圆 逆时针 上可看
vh.AddTriangle((i + 1) * 4 + 3, i * 4 + 3, i * 4 + 1);
vh.AddTriangle((i + 1) * 4 + 1, (i + 1) * 4 + 3, i * 4 + 1);
//内壁 逆时针 内看
vh.AddTriangle((i + 1) * 4 + 1, i * 4 + 1, i * 4);
vh.AddTriangle((i + 1) * 4, (i + 1) * 4 + 1, i * 4);
//外壁 顺时针 外看
vh.AddTriangle(i * 4 + 2, i * 4 + 3, (i + 1) * 4 + 3);
vh.AddTriangle(i * 4 + 2, (i + 1) * 4 + 3, (i + 1) * 4 + 2);
}
}
}
vh.FillMesh(mesh);
Material mat = new Material(Shader.Find("Standard"));
GetComponent<MeshRenderer>().material = mat;
GetComponent<MeshFilter>().mesh = mesh;
// GetComponent<MeshCollider>().sharedMesh = mesh;
}