Процедурно сгенерированная сетка имеет инвертированные все нормали - PullRequest
1 голос
/ 30 октября 2019

Привет, ребята,

В настоящее время я работаю над проектом, в котором мне нужно прочитать файл json, чтобы создать сцену во время выполнения. Сериализация / десериализация работает отлично.

Основная проблема в том, что я хочу иметь возможность создавать сетки из 8 точек / вершин, я в некотором роде достигаю этого, но каждая нормаль инвертирована, и я не понимаю, почему.

Это мой json-ввод для одного:

"name": "whatever",
        "points": [
            {
                "x": -1,
                "y": -0.05,
                "z": 1
            },
            {
                "x": -1,
                "y": 0.05,
                "z": 1
            },
            {
                "x": 1,
                "y": 0.05,
                "z": 1
            },
            {
                "x": 1,
                "y": -0.05,
                "z": 1
            },
            {
                "x": -1,
                "y": -0.05,
                "z": -1
            },
            {
                "x": -1,
                "y": 0.05,
                "z": -1
            },
            {
                "x": 1,
                "y": 0.05,
                "z": -1
            },
            {
                "x": 1,
                "y": -0.05,
                "z": -1
            }
        ]

, и это мой код генерации сетки в c #:

public void GenerateMesh(SerializedMesh data)
{
    Vector3[] vertices = new Vector3[data.points.Count];

    for (int i = 0; i < data.points.Count; i++)
    {
        vertices[i] = new Vector3(data.points[i].x, data.points[i].y, data.points[i].z);
    }

    int[] triangles = {
        // Front face
        0, 1, 2,
        2, 3, 0,

        // Back face
        7, 6, 5,
        5, 4, 7,

        // Left face
        4, 5, 1,
        1, 0, 4,

        // Right face
        3, 2, 6,
        6, 7, 3,

        // Top face
        1, 5, 6,
        6, 2, 1,

        // Bottom face
        4, 0, 3,
        3, 7, 4
    };

    // TODO : check what all this does
    Mesh.Clear();
    Mesh.vertices = vertices;
    Mesh.triangles = triangles;
    //Mesh.RecalculateBounds();
    Mesh.RecalculateNormals();
    //Mesh.RecalculateTangents();
    //Mesh.Optimize();
}

Я представлял свои вершины в следующем порядке:

cube

Почему все перевернуто?

Ответы [ 2 ]

2 голосов
/ 30 октября 2019
  • Поскольку вы пытались намотать против часовой стрелки, вы должны изменить список вершин или индексный список как намотку по часовой стрелке. для вашего случая -1 для оси z - это передняя грань, а 1 - задняя грань, поэтому вы должны установить индексный список как противоположный. Я только что преобразовал первые 2 треугольника.
int[] triangles = {
        // Back face
        0, 3, 2,
        0, 2, 1,

        ...
        ...
    };
0 голосов
/ 31 октября 2019

Хорошо, я был просто глуп. Мой «эталонный» куб имел вращение Y на 180, я думал, что это не будет иметь никакого значения, но это так.

Проблема заключалась в том, что в json позиции Z были инвертированы (1 -> -1 инаоборот)

Теперь все отлично работает, спасибо!

...