Unity3D 中行进立方体网格上的奇怪照明

问题描述 投票:0回答:0

我正在 Unity 中实现 Marching Cubes 算法。我刚刚对我的网格实施了平滑着色,现在我得到了一些奇怪的光照效果。我是这个算法的新手,我承认我真的不知道自己在做什么,但是,我对 perlin 噪声非常有经验。这是我执行所有操作的行进立方体类(我删除了这个例子的三角表):

`

public bool smoothTerrain;
public bool flatShaded;

private List<Vector3> vertices = new List<Vector3>();
private List<int> triangles = new List<int>();

private MeshFilter meshFilter;

private float terrainSurface = 0.5f;
private float noiseScale = 0.09f;
private int size = 30;

private void Awake() {

    meshFilter = GetComponent<MeshFilter>();
    CreateMeshData();
    BuildMesh();

}

void CreateMeshData() {

    for (int x = 0; x < size; x++) {
        for (int y = 0; y < size; y++) {
            for (int z = 0; z < size; z++) {

                float[] cube = new float[8];
                for (int i = 0; i < 8; i++) {
                        
                    Vector3Int corner = new Vector3Int(x, y, z) + CornerTable[i];
                    cube[i] = Noise.Perlin3D(corner.x * noiseScale + 100000f, corner.y * noiseScale + 300000f, corner.z * noiseScale + 500000f);

                }

                MarchCube(new Vector3Int(x, y, z), cube);

            }
        }
    }

}

int GetCubeConfiguration(float[] cube) {

    int configurationIndex = 0;
    for (int i = 0; i < 8; i++) {

        if (cube[i] > terrainSurface)
            configurationIndex |= 1 << i;

    }

    return configurationIndex;

}

int VertForIndice(Vector3 vert) {

    for (int i = 0; i < vertices.Count; i++) {

        if (vertices[i] == vert)
            return i;

    }

    vertices.Add(vert);
    return vertices.Count - 1;

}

void MarchCube(Vector3Int position, float[] cube) {

    int configIndex = GetCubeConfiguration(cube);
    
    if (configIndex == 0 || configIndex == 255)
        return;

    int edgeIndex = 0;
    for (int i = 0; i < 5; i++) {
        for (int p = 0; p < 3; p++) {

            int indice = TriangleTable[configIndex, edgeIndex];

            if (indice == -1)
                return;

            Vector3 vert1 = position + CornerTable[EdgeIndexes[indice, 0]];
            Vector3 vert2 = position + CornerTable[EdgeIndexes[indice, 1]];
            
            Vector3 vertPosition;
            if (smoothTerrain) {
                
                float vert1Sample = cube[EdgeIndexes[indice, 0]];
                float vert2Sample = cube[EdgeIndexes[indice, 1]];

                float difference = vert2Sample - vert1Sample;

                if (difference == 0)
                    difference = terrainSurface;
                else
                    difference = (terrainSurface - vert1Sample) / difference;

                vertPosition = vert1 + ((vert2 - vert1) * difference);
            } else {

                vertPosition = (vert1 + vert2) / 2f;

            }

            if (flatShaded) {
                vertices.Add(vertPosition);
                triangles.Add(vertices.Count - 1);
            } else {
                triangles.Add(VertForIndice(vertPosition));
            }
            
            edgeIndex++;

        }
    }

}

void ClearMeshData() {
    
    vertices.Clear();
    triangles.Clear();

}

void BuildMesh() {

    Mesh mesh = new Mesh();
    mesh.vertices = vertices.ToArray();
    mesh.triangles = triangles.ToArray();
    mesh.RecalculateNormals();
    meshFilter.mesh = mesh;

}

Vector3Int[] CornerTable = new Vector3Int[8] {

    new Vector3Int(0, 0, 0),
    new Vector3Int(1, 0, 0),
    new Vector3Int(1, 1, 0),
    new Vector3Int(0, 1, 0),
    new Vector3Int(0, 0, 1),
    new Vector3Int(1, 0, 1),
    new Vector3Int(1, 1, 1),
    new Vector3Int(0, 1, 1)

};

int[,] EdgeIndexes = new int[12, 2] {

    {0, 1}, {1, 2}, {3, 2}, {0, 3}, {4, 5}, {5, 6}, {7, 6}, {4, 7}, {0, 4}, {1, 5}, {2, 6}, {3, 7}

};

`

如果有人能够帮助我或至少向我提供一些关于我为什么会遇到这些照明问题的正确方向的想法,那就太好了。我会留下一些截图来告诉你发生了什么。

unity3d game-development procedural-generation marching-cubes
© www.soinside.com 2019 - 2024. All rights reserved.