unity3d 三角化螺杆/螺旋线/螺旋线的最佳方法

nqwrtyyt  于 2022-11-15  发布在  其他
关注(0)|答案(1)|浏览(316)

我正在按程序生成一些路径,并且需要围绕一个点创建一个平滑的“螺旋”。(想象一个停车场坡道,但是有一个中心点)。
大概是这样的:俯视图x1c 0d1x


上的侧面
然而,如果你仔细观察,它并不是一个光滑的表面,因为多边形的布局,当其中两个顶点绕着中心辐条“上升”时,就只剩下一个点可以到达边缘。

这是不可能的吗?或者我只是错过了一些特定的三角形排列在这里,可以使这个工作?
注意-这个问题只存在于中心线周围的倾斜“曲线”上。直线路径、曲线路径和倾斜路径没有这个问题。它只是倾斜曲线(关于一个点)。
提前感谢!
编辑-
添加了一些示例源代码来重现这个问题(Unity代码,只需将其添加到空白场景中的空游戏对象中,它就应该工作了。你可能需要添加一个材质来查看这个问题)

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;
    }
}
xsuvu9jc

xsuvu9jc1#

问题是,点的“中心列”需要使用三角形中三个点中的两个来“上升”。因此,内部多边形的Angular 总是垂直的。
在外部边缘上,它需要(大部分)水平。
因此,你最终需要一个扭曲的形状。剪下一张薄纸条,将一端扭曲到接近90度。只有两个多边形是无法实现这一点的。
解决方案不是进一步垂直细分,而是更好地对“扭曲”进行建模。
这里有一个潜在的解决方案。可能有更好的方法。

相关问题