UMA в игровом движке Godot и часть PoC8

Этап 2 завершен

Это журнал разработки, чтобы узнать, смогу ли я перенести надстройку Универсальный многоцелевой аватар (UMA) для Unity на движок Godot. Вы можете найти Часть 7 здесь.

Это была трудная неделя, но я узнал много нового об ArrayMeshes. Я стал довольно дерзким и на самом деле думал, что понял файл макета достаточно, чтобы отобразить часть тела UMA. Я выбрал ноги без особых причин.

В итоге я использовал библиотеку YAMLDotNet для чтения файла UMA_HUMAN_MALE_LEGS_SLOT.asset. Сначала я просто загрузил массив вершин в ArrayMesh и прикрепил его к узлу MeshInstance.

SurfaceArray[ARRAY_VERTEX] = slotData.MonoBehaviour.MeshData.Vertices; LegMesh ArrayMesh = new ArrayMesh();

legMesh.AddSurfaceFromArrays(Mesh.PrimitiveType.Triangles, surfaceArray);

узел.SetMesh(legMesh);

Я много с ней возился, но в итоге добрался до этой «победы»! Как видите, это было не совсем то, что я надеялся увидеть. Прежде чем идти дальше, я решил, что хочу увидеть это с других ракурсов, поэтому я потратил некоторое время на написание кода для перемещения камеры во время выполнения.

К сожалению, это заняло гораздо больше времени, чем я ожидал. Мне пришлось заново усвоить старый урок о том, почему мы не можем использовать углы Эйлера для вращения вокруг более чем одной оси. Как только я заново усвоил этот урок, я смог получить более ясную картину.

У него действительно были очертания пары ног. Я был на что-то в конце концов. Я возился с Primitive Type (Points, LineLoop, TriangleFan). Я также добавил информацию о нормалях, тангенсах и ультрафиолетовом излучении. Все они стали больше походить на ноги, но не совсем правильно.

[Нет изображений. Я был слишком расстроен, чтобы делать скриншоты]

Ключ был тогда, когда я понял, что пункты должны были быть повторены. Мне пришлось добавить ARRAY_INDEX в сетку массива. На сетке было 508 точек, но их нужно было повторно использовать в определенном порядке. Заказ оказался в шестнадцатеричном сжатом формате, который я описал в своем последнем посте. Поэтому я не сразу понял, что это критически важные данные для рендерера. Как только я добавил в INDEX_ARRAY, я получил это:

Это выглядит намного лучше! Я добавил источник света и прикрепил материал тела\текстуру, и все действительно начало складываться.

Но вы можете заметить что-то странное в этом. Кожа видна только внутри сетки. Поверхности были перевернуты! Как только я понял это, решение оказалось довольно простым. Мне просто пришлось перевернуть массив индексов. Я также повернул узел, чтобы они не ложились. Однажды я сделал это, Эврика! Самая красивая пара человеческих мужских ног, которую я когда-либо видел.

Глядя на них в Godot vs Unity, вы, вероятно, заметите немного больше деталей в Unity. Это связано с тем, что материал кожи — это материал, предназначенный для покрытия всего тела, а не только ног, так что определения нет. Но поверьте мне, они будут выглядеть одинаково (те определения, которые вы видите справа, на 99% основаны на текстурах).

На этом я объявляю Milestone 2 завершенным. Я сделал кое-что, связанное с UMA. Если вы хотите увидеть мой наспех собранный код, вы можете ознакомиться с выпуском Milestone 2 на github. Это определенно все еще Proof of Concept, а не техническая демонстрация. Так что не судите меня по этому коду ;)

Следующим большим достижением будет правильное отображение всех частей UMA, сшитых вместе. Я буду изучать код «UMAMeshCombiner.cs» в надежде, что он раскроет мне свои секреты. Техническая задача будет состоять в том, чтобы расшифровать данные слота «bindPoses» для каждой из частей тела. Если у вас есть идеи, что делать с данными, которые выглядят так, пожалуйста, дайте мне знать.

e00: -0.00000010006914
e01: -0.015181004
e02: -0.9998847
e03: 1.809285
e10: -1
e11: 0.000000012087684
e12: 0.00000009989716
e13: -0.00000017237967
e20: 0.0000000105697495
e21: 0.9998847
e22: -0.015181004
e23: 0.071036994
e30: 0
e31: 0
e32: 0
e33: 1
— e00: 0.16226237
e01: -0.9867478
e02: -0.0000005662443
e03: 0.09033542
e10: 0.9867477
e11: 0.16226235
e12: -0.0000018051901
e13: 0.010983911
e20: 0.0000018731472
e21: -0.00000026582578
e22: 1
e23: -1.7828213
e30: 0
e31: 0
e32: 0
e33: 1
— e00: 0.16856557
e01: -0.95418185
e02: -0.24723113
e03: 0.53944016
e10: 0.98569053
e11: 0.1633708
e12: 0.04153211
e13: -0.07994012
e20: 0.00076116
e21: -0.25069413
e22: 0.96806616
e23: -1.7066691
e30: 0
e31: 0
e32: 0
e33: 1