我正在按程序生成一些路径,并且需要围绕一个点创建一个平滑的“螺旋”。(想象一个停车场坡道,但是有一个中心点)。
大概是这样的:俯视图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;
}
}
1条答案
按热度按时间xsuvu9jc1#
问题是,点的“中心列”需要使用三角形中三个点中的两个来“上升”。因此,内部多边形的Angular 总是垂直的。
在外部边缘上,它需要(大部分)水平。
因此,你最终需要一个扭曲的形状。剪下一张薄纸条,将一端扭曲到接近90度。只有两个多边形是无法实现这一点的。
解决方案不是进一步垂直细分,而是更好地对“扭曲”进行建模。
这里有一个潜在的解决方案。可能有更好的方法。