如何对绕点螺旋坡道进行平滑三角剖分?
程序化生成平滑螺旋坡道的问题
需求与预期效果
我正在程序化生成路径,需要创建一种绕中心点的平滑螺旋结构(类似带中心点的停车场坡道),预期效果如下:
- 俯视图:

- 侧视图:

现存问题
但实际生成后发现,由于多边形布局问题,表面并不平滑:当两个顶点沿中心辐条“向上”时,仅剩一个点连接边缘,形成了阶梯状的瑕疵。
注:该问题仅出现在绕中心线的倾斜“曲线”结构中,直线路径、普通曲线路径和单纯倾斜路径均无此问题。
疑问
这是无法实现的吗?还是我遗漏了某种特定的三角排列方式来解决该问题?
复现代码(Unity)
以下是可复现问题的示例代码,只需将其添加到空白场景中的空GameObject即可运行(可能需要添加材质以查看问题):
using System.Collections.Generic; using UnityEngine; public class Test_Spiral : MonoBehaviour { void Start() { var mesh = Generate(); AddToGameObject("FailSpiral", mesh); } private Mesh Generate() { var mesh = new Mesh(); var verts = new List<Vector3>(); var tris = new List<int>(); Vector3 centre = Vector3.zero; var angle = Mathf.PI * 2f / 3f; var height = 2f; var radius = 5f; var count = 20; var anglePer = angle / count; var heightPer = height / count; ; for (var i = 0; i < count; i++) { verts.Add(centre + Vector3.up * heightPer * i); var x0 = radius * Mathf.Cos(anglePer * i); var z0 = radius * Mathf.Sin(anglePer * i); verts.Add(centre + new Vector3(x0, heightPer * i, z0)); var x1 = radius * Mathf.Cos(anglePer * (i + 1)); var z1 = radius * Mathf.Sin(anglePer * (i + 1)); verts.Add(centre + new Vector3(x1, heightPer * (i + 1), z1)); verts.Add(centre + Vector3.up * heightPer * (i + 1)); var offset = i * 4; tris.Add(offset + 0); tris.Add(offset + 2); tris.Add(offset + 1); tris.Add(offset + 2); tris.Add(offset + 0); tris.Add(offset + 3); } mesh.vertices = verts.ToArray(); mesh.triangles = tris.ToArray(); mesh.RecalculateNormals(); mesh.RecalculateTangents(); mesh.RecalculateBounds(); return mesh; } private void AddToGameObject(string name, Mesh mesh) { var go = new GameObject(name, typeof(MeshFilter), typeof(MeshRenderer), typeof(MeshCollider)); go.GetComponent<MeshFilter>().sharedMesh = mesh; go.GetComponent<MeshCollider>().sharedMesh = mesh; go.transform.parent = transform; } }
内容的提问来源于stack exchange,提问作者THJSmith
相关产品推荐
相关产品推荐

