Михаил Ли

Михаил Ли 

Художник-Мультипликатор

64subscribers

204posts

goals1
$15.75 of $1 652 raised
На Azure Kinect

Unreal Engine - Физика и Clothing ч.3

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

В прошлый раз мы разобрались с концепцией виртуальной коллизии в UE и как она на pervertex основе фейкает реальную коллизию, теперь разберемся как ей управлять через vertex color. 

Vertex Color
— это не просто визуальный цвет, а полноценный носитель данных, привязанных к вершине. Каждый из четырёх каналов (R, G, B, A) представляет собой 8-битное беззнаковое целое число, что даёт 256 возможных значений на канал. В сумме это 4 байта данных на вершину. Эти байты можно использовать не только для задания цвета, но и как способ кодирования и хранения служебной информации.

Например, в канал R можно закодировать тип поверхности (0 — трава, 1 — бетон, 2 — вода), в канал G — уровень маски влияния эффекта (например, размытие или износ), в канал B — ID области или зоны взаимодействия, а в канал A — битовый флаг (включено или выключено).

Таким образом, Vertex Color превращается в компактный и быстрый способ прошить в геометрию метаданные, которые читаются напрямую в шейдерах или логике материала. Unreal Engine автоматически нормализует эти значения в диапазон от 0.0 до 1.0, поэтому в материале ты читаешь их как:
R = 64 становится 0.25098
G = 128 становится 0.50196
Код ниже демонстрирует то как конкретно идет преобразование значений в UE
Что он делает на пальцах:
float GetColorChannelAsFloat(const FColor& Color, ESourceColorChannel Channel, float ScalingFactor)
сигнатура функции float она принимает:
1) FColor (RGBA, каждый канал — uint8, т.е. от 0 до 255), 
2) Channel - какой канал использовать (Red, Green, Blue, Alpha). 
3) ScalingFactor - дополнительный множитель (например, если мы захотим перевести значение в другой диапазон, скажем, [0, 2]) когда персонажа отскейлили.  
После чего извлекает значение одного из каналов (uint8 Value = Color.X).
Далее нормализует: Value / 255.f — переводит uint8 → float в диапазоне [0.0, 1.0].
Масштабирует: * ScalingFactor — даёт итоговое значение float.
Важно понимать, что выше я говорил про поведение в UE, но в DCC-программах - например, в нашем случае в Maya — всё работает немного иначе. Здесь мы изначально работаем с vertex color в виде чисел с плавающей точкой в диапазоне от 0 до 1. Конвертация этих значений в uint8 происходит автоматически и "закрыто" во время экспорта. Именно это значение потом считывается в Unreal Engine.

Это может немного сбить с толку, но на самом деле всё просто. Чтобы точно понять, какое uint8 значение попадёт в UE, нам нужно просто выполнить обратную конвертацию. Тогда мы заранее узнаем, какое значение нужно задать в Maya, чтобы оно стало нужным байтом при экспорте:

floatVal = uint8Target / 255.0

Таким образом, задавая нужный float в Maya, мы контролируем точное значение, которое окажется в UE после экспорта. Давайте разберем на примере. Например мне нужна флоат цифра 6 на вертексе чтобы показать его Backstop Distance от вертекса я в MAYA должен этот вертекс покрасить:

6/255.f=0,02352941 

И тут нас ждет еще одна математическая засада. Maya визуально показывает значения с округлением до трёх знаков после запятой, то есть 6 / 255 будет отображаться как 0.023. Но внутри Maya и при экспорте (например, в FBX) значение может быть точнее - около 0.023529. Однако если ты просто смотришь в Viewport или UI, ты увидишь округлённое значение. Для Chaos Cloth важно именно точное значение, потому что Unreal делит byte значение на 255.0, и получает float с полной точностью.

Чтобы избежать такого непредсказуемого поведения нужно использовать "стабильные" числа. Такие цифры чаще всего называют квантованными значениями (от англ. quantized values) - потому что они представляют собой дискретные уровни, полученные из целочисленного диапазона (в случае Vertex Color — uint8, то есть 0–255), преобразованные в float с нормализацией. В интсруменарии такие числа обычно называют Vertex Color Steps и их нужно считать идивидуально и хранить где нить рядом в инструменте под конкретный сценарий. 

Один сценарий нам уже известен, чтобы сделать крассивую коллизию нужно подготовить карты MAX DISTANCE, BACKSTOP RADIUS и BACKSTOP DISTANCE и нарисовать их надо так чтобы из DCC в UE мы забрали то что нам надо и вернули это в том же виде как было до. Все это мы разберем на примере, заодно сравним инструментарий UE и то что нужно на самом деле художнику в следующем материале.
Subscription levels2
Subscription Spots Are Limited

Малая открывашка

$13.8 per month
Дает доступ ко всему контенту, но дешевле

Большая открывашка

$27.6 per month
Открывает доступ к блогу и всем его постам + помощь в решении ваших задач пару раз в месяц
Go up