You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对绕点螺旋坡道进行平滑三角剖分?

程序化生成平滑螺旋坡道的问题

需求与预期效果

我正在程序化生成路径,需要创建一种绕中心点的平滑螺旋结构(类似带中心点的停车场坡道),预期效果如下:

  • 俯视图:
    俯视图
  • 侧视图:
    侧视图

现存问题

但实际生成后发现,由于多边形布局问题,表面并不平滑:当两个顶点沿中心辐条“向上”时,仅剩一个点连接边缘,形成了阶梯状的瑕疵。
表面不平滑的阶梯效果

注:该问题仅出现在绕中心线的倾斜“曲线”结构中,直线路径、普通曲线路径和单纯倾斜路径均无此问题。

疑问

这是无法实现的吗?还是我遗漏了某种特定的三角排列方式来解决该问题?

复现代码(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 13:01:12