Великий MeshFilter

Научился сам? Помоги начинающему.

Великий MeshFilter

Сообщение liver9711 08 янв 2014, 15:55

Ну, напихавшись вдоволь с мешами, надо бы сказать что да как.
MeshFilter - класс и компонент. Короче тип данных.
Внутри есть две переменные mesh и sharedMesh, оба меши этого объекта, но первый мы модифицируем удалённо, а второй напрямую. Удалённо - значит что нам вернут копию меша (тип данных Mesh).
Для начало нам нужно определить вообще этот компонент в нашем скрипте:
Mesh mesh = gameObject.GetComponent<MeshFilter>().sharedMesh;
Надо обязательно учитывать, что в инспекторе у объекта должен быть компонент MeshFilter. Если на объекте уже висит какой-то меш, то значит фильтер там уже есть.
Теперь у нас есть mesh, который является указателем на мэш объекта! Давайте над ним издеватся!
Давайте для начала определимся, что там есть. А там... чёрт ногу сломит... Смотрите именно в Script Reference (Ыскшзе Куаукутсу на русской раскладке).
Я возьму только несколько и поясню, что да как.
vertices - вершины, основа основ. за них цепляются треугольники. Массив Vector3
triangles - треугольники. Массив Int.
Как они связаны? Предположим есть вершины куба.
Они в массиве нашем вершин имеют свои индексы, и вот эти индексы и будут записаны в массив треугольников. Следовательно, этот массив можно разделить по три, по три вершины на треугольник.
Например, говорим: "Растяни ка ты между точками 5, 6 и 3 треугольник", - в коде выглядит так: mesh.vertices[n] = 5; mesh.vertices[n+1] = 6; mesh.vertices[n+2] = 3; И вот это чудо будет строить нам треугольник 5-6-3.
Так же мы просто можем влиять на вершины. mesh.vertices[i] это Vector3 в локальном пространстве относительно объекта. Чтобы достать его позицию в мировом пространстве, надо применить значение, которое вернёт нам transform.TransformPoint(mesh.vertices[i]). Чтобы засунуть обратно в локальную, нужно заменить функцию на InverseTransformPoint.
Подвохи есть:
► Максимальное число вершин 65535
► Треугольник односторонний, и видно его будет только если его вершины будут идти по часовой стрелке относительно нашего взгляда.
► Рекурсия работает медленно. Тригонометрические функции тем более.
Также есть весёлые параметры uv и uv2.
Честно говоря, ни разу не использовал uv2, но это то же самое, что и первый uv, только второй.
uv - массив из Vector2, того же размера, что и массив triangles.
Я надеюсь не тяжело догадаться, что же представляет из себя uv...
Попробуйте подумать сами.




Так я и знал, что не хотите, ну ладно.
Мы как бы указываем треугольникам, каким вершинам какие точки текстуре будут соответствовать. Это как будто вы вырезаете из бумаги, на бумаге напечатана текстура, только это "растягивающаяся" бумага.
В Vector2 мы указываем координаты, причём с нижнего левого края, вверх и вправо, от нуля до единицы в любом соотношении сторон текстуры.
normals - куда смотрит треугольник (Vector3). Ничего сложного, делаем mesh.RecalculateNormals() и радуемся!
tangents - Vector4. Честно, я чуть не повесился, когда увидел это, но потом меня отпустило, это оказалось они в самом-то деле используют три первых параметра, в качестве координат, а последний (w), просто как множитель (важно! Должен быть между -1 и 1). Ничего страшно ужасного здесь нет. Оказалось проще некуда! Мы должны поставить вектор вдоль треугольника так, чтобы на карте UV он оказался направлен право.
W нужен для переворачивания bumpmap-а.
Ну и последнее о чём могу сказать, это такая наркоманская вещь, как colors и colors32.
Цвет каждой вершины! То же самое, что если вы будете менять цвет всего объекта в свойствах материала, но только отдельно для вершин!
Цвет будет плавно интерполироваться. НИШТЯК! Мне такая функция очень нравится.
НО, это не всегда работает, только если доступна эта смена цвета.
Велики и всемогучий Script Reference гласит нам, что лучше использовать color32, быстрей работает, вот так и делайте, ни разу не тестил :D .
bounds - коробка (Bounds), в которую вписывается наш меш. mesh.RecalculateBounds() решает все проблемы с ним.
bindposes и boneWeights - это штучки-дрючки, которые использует анимация, и смысл их здесь использовать отсутствует. Первое связи с костями, второе величина отклонения.

Зэ Энд.
Если ещё что надо будет говорите, доскажу, чего не поняли, спрашивайте, уточню.
Последний раз редактировалось liver9711 09 янв 2014, 18:28, всего редактировалось 1 раз.
liver9711
UNITрон
 
Сообщения: 285
Зарегистрирован: 14 мар 2012, 11:16

Re: Великий MeshFilter

Сообщение Tolking 08 янв 2014, 16:51

uv2 - не имеет отношения к ДРУГОЙ текстуре, это другой набор текстурных координат. На оба набора можно натянуть и одну и ту-же текстуру.

Видимость треугольника не зависит от направления обхода. Он будет виден в любом случае, только виден с разных сторон. От обхода зависит автоматически вычисляемая нормаль(RecalculateNormals). Если обходить по часовой то нормаль вычислится "правильно".
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2716
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: Великий MeshFilter

Сообщение liver9711 09 янв 2014, 18:22

Насчёт uv2 я может быть и ошибся, но простите меня видимость треугольника проверял на 4ой юньке, и с "задней стороны" его не видно, не надо мне тут гнать.
liver9711
UNITрон
 
Сообщения: 285
Зарегистрирован: 14 мар 2012, 11:16

Re: Великий MeshFilter

Сообщение Tolking 09 янв 2014, 18:42

"Задняя сторона" определяется нормалью, а не обходом вершин. Если я сам задаю нормаль для вертекса, то пофиг как я обходил вершины видимой будет нужная мне сторона.
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2716
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: Великий MeshFilter

Сообщение waruiyume 09 янв 2014, 19:05

Tolking, а причём тут нормали вершин, их вообще может не быть? Если я правильно помню нормаль треугольника- это векторное произведение (v0-v1)x(v0-v2).
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Великий MeshFilter

Сообщение Tolking 09 янв 2014, 23:12

:) Нормали должны быть. RecalculateNormals - векторное произведение. В Юнити нет такого, а в Блице3д была команда FlipNormals которая "выворачивала" меши наизнанку.
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2716
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула


Вернуться в Уроки

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

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