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

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

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

Сообщение Black_Racer 15 апр 2021, 19:16

Ребят всем привет, столкнулся с проблемой читая бинарный 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); // данный пример я нашел на официальном форуме но заставить его работать с моей моделью не смог
            }
}
Black_Racer
UNIт
 
Сообщения: 51
Зарегистрирован: 26 сен 2011, 09:16

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

Сообщение waruiyume 15 апр 2021, 19:33

То, какая сторона рисуется, определяется, как-раз, тем самым кроссом между двумя векторами, построенных их вершин треугольника. Только это происходит на этапе растеризации, и к нормалям вершин, которые обычно отвечают за освещение, никакого отношения не имеет.
Скорее всего вам нужно что-то вроде этого:
заводим новый массив для треугольников
читаем треугольник из старого массива
берём тот самый кросс и сравнивает с вектором направленным из цента модели, в центр треугольника. Если угол > 90гр(dot>0) заносим вершины, в новый массив, как есть, если dot<0 то заносим вершины в обратном порядке.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

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

Сообщение Black_Racer 15 апр 2021, 20:57

Спасибо тебе большое это сработало
Изображение
Еще такой вопрос, я normals просчитываю от vertices и от сюда такие артефакты c нормалями как возможно это избежать? И выводимые точки UV тоже перепутаны местами за исключением одной стороны модели которая строиться первой.
Black_Racer
UNIт
 
Сообщения: 51
Зарегистрирован: 26 сен 2011, 09:16

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

Сообщение waruiyume 15 апр 2021, 23:07

RecalculateNormals и фсё. В догонку RecalculateTangents.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 34