three.js Настройка Geometry.faceVertexUvs сбивает с толку - PullRequest
0 голосов
/ 05 марта 2019

Я работаю над реализацией собственного импортера моделей.Файл содержит всю необходимую информацию (вершины, нормали вершин, координаты uv вершин, материалы и т. Д.) Важно отметить, что файл содержит модели с несколькими материалами.Настройка вершин довольно проста и работает правильно.В настройке лиц я не уверен на 100%.Я делаю следующее:

meshDict[name].faces.push(
new THREE.Face3(parseInt(triangles[t]),
                parseInt(triangles[t + 1]),
                parseInt(triangles[t + 2]),
                [normals[parseInt(triangles[t])],
                 normals[parseInt(triangles[t + 1])],
                 normals[parseInt(triangles[t + 2])]],
                new THREE.Vector3(1, 1, 1), matIndex));

Здесь: t - это итератор индекса массива треугольников, нормали - это массив, в котором хранится нормальная информация о вершинах, а matIndex - индекс материала грани на основеномер подсетки из объектного файла.Это также, кажется, работает правильно.

Теперь о сложной части.Я весь день искал четкое объяснение и / или хороший пример того, как настроить faceVertexUvs для сетки из нескольких материалов, но в каждом втором посте, который я нашел, показан другой метод для настройки этого.После долгих проб и ошибок я нашел это решение, которое работает, но выдает МНОГО предупреждений ...

    for (var f = 0; f < faces.length; f++)
    {
        if (currentMesh.faceVertexUvs[faces[f].materialIndex] == undefined)
        {
            currentMesh.faceVertexUvs[faces[f].materialIndex] = []
            faceOffset = (faces[f].materialIndex == 0? 0 : 1) * f;
        }

        currentMesh.faceVertexUvs[faces[f].materialIndex].push(f);
        currentMesh.faceVertexUvs[faces[f].materialIndex][f - faceOffset] = [];

        currentMesh.faceVertexUvs[faces[f].materialIndex][f - faceOffset].push(uvs[faces[f].a]);
        currentMesh.faceVertexUvs[faces[f].materialIndex][f - faceOffset].push(uvs[faces[f].b]);
        currentMesh.faceVertexUvs[faces[f].materialIndex][f - faceOffset].push(uvs[faces[f].c]);
    }

Здесь uvs - это массив Vector2 такой же длины, что и массив вершин.В основном я делаю: faceVertexUvs [materialIndex] [faceIndex] [uvs [a], uvs [b], uvs [c]].

Количество материальных индексов равно количеству подсетей, которыеобъект имеет.

Так что это решение вроде работает нормально, но некоторые текстуры выглядят некорректно (я подозреваю, что UV-картирование этой области не установлено правильно), и я получаю многопредупреждения, в которых говорится:

enter image description here

Важно отметить, что все модели выглядят нормально в программе экспорта, поэтому проблема не в этом.

Есть идеи, что я здесь делаю не так?

1 Ответ

0 голосов
/ 10 марта 2019

Так что я думаю, что мне наконец-то удалось это выяснить, и я все заработал правильно, и поскольку в этой области остро не хватает документации, а примеры не совсем ясны, я опубликую свое понимание этой темы здесь для всех. имея ту же проблему. Так это выглядит так:

Geometry.faveVertexUvs[UV LAYER][face index][uv[face.a], uv[face.b], uv[face.c]]

Насколько я понимаю, если у вас нет карты AO (ambient occlusion), вы используете только UV LAYER 0. Теперь, если вы определяете индекс материала при настройке граней геометрии, тогда каждая грань будет отображаться с соответствующим материалом, и нет необходимости разбивать UV-лучи на отдельные области, как я делал в своем вопросе. Так что вам нужно всего лишь использовать:

Geometry.faces.push(new THREE.Face3(v0, v1, v2, [n0, n1, n2], vertexColor, materialIndex));
...