C# 在网格之间进行平滑过渡

C# 在网格之间进行平滑过渡,c#,unity3d,mesh,perlin-noise,C#,Unity3d,Mesh,Perlin Noise,所以我最近开始了一个项目,在那里我使用柏林噪声生成了一些网格,并将它们彼此相邻放置。但是,每个网格的边上显然没有相同的y坐标,因此可以看到每个网格之间的间隙 我想知道是否有人知道如何找到所有边顶点,并为它们提供与其邻居相同的y坐标?我在脚本中创建了网格,所以我可以访问所有顶点和三角形,我只是不知道如何过滤网格边上的顶点和三角形 另外,是否有一种简单的方法来平滑每个网格的过渡,而不是直接为它们指定与其相邻顶点相同的y值 谢谢 编辑:对不起,我忘记显示代码了!这是: [RequireComponen

所以我最近开始了一个项目,在那里我使用柏林噪声生成了一些网格,并将它们彼此相邻放置。但是,每个网格的边上显然没有相同的y坐标,因此可以看到每个网格之间的间隙

我想知道是否有人知道如何找到所有边顶点,并为它们提供与其邻居相同的y坐标?我在脚本中创建了网格,所以我可以访问所有顶点和三角形,我只是不知道如何过滤网格边上的顶点和三角形

另外,是否有一种简单的方法来平滑每个网格的过渡,而不是直接为它们指定与其相邻顶点相同的y值

谢谢

编辑:对不起,我忘记显示代码了!这是:

[RequireComponent(typeof(MeshFilter))]
public class MeshGenerator : MonoBehaviour
{

    Mesh mesh;

    Vector3[] vertices;
    int[] triangles;

    int size = 100;

    float xMod = 0.3f;
    float zMod = 0.3f;

    float noiseMod = 2;


    // Start is called before the first frame update
    void Start()
    {
        mesh = new Mesh();
        GetComponent<MeshFilter>().mesh = mesh;

        //Sets the different perlin noise values
        if (Random.Range(0f, 2f) < 1.6f)
        {
            xMod = Random.Range(0.03f, 0.1f);
            zMod = Random.Range(0.03f, 0.1f);

            if (Random.Range(0f, 2f) < 1.6f)
            {
                noiseMod = Random.Range(1f, 4f);
            }
            else
            {
                noiseMod = Random.Range(1f, 30f);
            }
        }
        else
        {
            xMod = Random.Range(0.1f, 0.5f);
            zMod = Random.Range(0.1f, 0.5f);

            if (Random.Range(0f, 2f) < 1.6f)
            {
                noiseMod = Random.Range(1f, 1.7f);
            }
            else
            {
                noiseMod = Random.Range(1f, 1.4f);
            }
        }

        CreateShape();
        UpdateMesh();

        GetComponent<MeshCollider>().sharedMesh = mesh;
    }

    //Creates all the necessary triangles
    void CreateShape()
    {
        vertices = new Vector3[(size + 1) * (size + 1)];

        for (int z = 0, i = 0; z <= size; z++)
        {
            for (int x = 0; x <= size; x++)
            {
                //Perlin noise with randomly selected values from earlier to set y value of vertex
                float y = Mathf.PerlinNoise(x * xMod, z * zMod) * noiseMod;

                vertices[i] = new Vector3(x, y, z);
                i++;
            }
        }

        triangles = new int[size * size * 6];

        int verts = 0;
        int tris = 0;

        //Sets all vertices' coordinates for each square
        for (int z = 0; z < size; z++)
        {
            for (int x = 0; x < size; x++)
            {
                triangles[tris] = verts;
                triangles[tris + 1] = verts + size + 1;
                triangles[tris + 2] = verts + 1;
                triangles[tris + 3] = verts + 1;
                triangles[tris + 4] = verts + size + 1;
                triangles[tris + 5] = verts + size + 2;

                verts++;
                tris += 6;
            }
            verts++;
        }
    }

    //Updates the meshes
    void UpdateMesh()
    {
        mesh.Clear();

        mesh.vertices = vertices;
        mesh.triangles = triangles;

        mesh.RecalculateNormals();
    }
}
[RequireComponent(typeof(MeshFilter))]
公共类网格生成器:单行为
{
网目;
向量3[]个顶点;
int[]三角形;
int size=100;
浮点数xMod=0.3f;
浮球zMod=0.3f;
float noiseMod=2;
//在第一帧更新之前调用Start
void Start()
{
网格=新网格();
GetComponent().mesh=mesh;
//设置不同的柏林噪波值
if(随机范围(0f,2f)<1.6f)
{
xMod=随机范围(0.03f,0.1f);
zMod=随机范围(0.03f,0.1f);
if(随机范围(0f,2f)<1.6f)
{
noiseMod=随机范围(1f,4f);
}
其他的
{
noiseMod=随机范围(1f,30f);
}
}
其他的
{
xMod=随机范围(0.1f,0.5f);
zMod=随机范围(0.1f,0.5f);
if(随机范围(0f,2f)<1.6f)
{
noiseMod=随机范围(1f,1.7f);
}
其他的
{
noiseMod=随机范围(1f,1.4f);
}
}
CreateShape();
UpdateMesh();
GetComponent().sharedMesh=mesh;
}
//创建所有必要的三角形
void CreateShape()
{
顶点=新矢量3[(大小+1)*(大小+1)];

对于(int z=0,i=0;z),您可以根据原点和偏移量对其进行采样,而不是从柏林噪声中随机选取值。通过从相同位置和偏移量进行采样,它将显示为块瓷砖是同一个较大网格的一部分。您可以显示您的代码吗?@teebkne好的,我将进行拍摄。谢谢!