Страница 1 из 1

Проблема вывернутых граней при чтении Mesh

СообщениеДобавлено: 15 апр 2021, 19:16
Black_Racer
Ребят всем привет, столкнулся с проблемой читая бинарный Mesh заранее расшифровав его структуру и в процессе строения модели имею проблему с вывернутыми наизнанку фрагментами модели, нашел информацию что это решается с помощью Vector3.Cross но как это реализовать на примере моей задачи не понял, уже несколько дней совершаю безуспешные попытки, мне необходимо чтобы все полигоны были вывернуты от центра модели наружу, судя по всему из за вывернутых частей у меня так же не ложиться правильно UV за исключением одной стороны.

Изображение

Синтаксис:
Используется csharp
public void CreateMesh()
        {
            GameObject gameModel = new GameObject(MeshChunk.Identifier);
            gameModel.AddComponent<MeshRenderer>();
            gameModel.AddComponent<MeshFilter>();
            gameModel.GetComponent<MeshRenderer>().material = testTexture;

            Mesh mesh = gameModel.GetComponent<MeshFilter>().mesh;
            mesh.vertices = MeshChunk._vertices.ToArray();
            mesh.uv = MeshChunk._UVs.ToArray();
            mesh.triangles = MeshChunk._triangles.ToArray();

            int[] tris = mesh.triangles;  
            for (int i = 0; i < tris.Length; i += 3)
            {
                Vector3 a = mesh.vertices[tris[i]];
                Vector3 b = mesh.vertices[tris[i + 1]];
                Vector3 c = mesh.vertices[tris[i + 2]];
                Vector3 n0 = mesh.normals[tris[i]] + mesh.normals[tris[i + 1]] + mesh.normals[tris[i + 2]];
                n0 = (n0 / 3.0f).normalized;
                Vector3 n1 = Vector3.Cross((b - a).normalized, (c - a).normalized); // данный пример я нашел на официальном форуме но заставить его работать с моей моделью не смог
            }
}

Re: Проблема вывернутых граней при чтении Mesh

СообщениеДобавлено: 15 апр 2021, 19:33
waruiyume
То, какая сторона рисуется, определяется, как-раз, тем самым кроссом между двумя векторами, построенных их вершин треугольника. Только это происходит на этапе растеризации, и к нормалям вершин, которые обычно отвечают за освещение, никакого отношения не имеет.
Скорее всего вам нужно что-то вроде этого:
заводим новый массив для треугольников
читаем треугольник из старого массива
берём тот самый кросс и сравнивает с вектором направленным из цента модели, в центр треугольника. Если угол > 90гр(dot>0) заносим вершины, в новый массив, как есть, если dot<0 то заносим вершины в обратном порядке.

Re: Проблема вывернутых граней при чтении Mesh

СообщениеДобавлено: 15 апр 2021, 20:57
Black_Racer
Спасибо тебе большое это сработало
Изображение
Еще такой вопрос, я normals просчитываю от vertices и от сюда такие артефакты c нормалями как возможно это избежать? И выводимые точки UV тоже перепутаны местами за исключением одной стороны модели которая строиться первой.

Re: Проблема вывернутых граней при чтении Mesh

СообщениеДобавлено: 15 апр 2021, 23:07
waruiyume
RecalculateNormals и фсё. В догонку RecalculateTangents.