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, поэтому в материале ты читаешь их как:
В прошлый раз мы разобрались с концепцией виртуальной коллизии в 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
Код ниже демонстрирует то как конкретно идет преобразование значений в 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, чтобы оно стало нужным байтом при экспорте:
Это может немного сбить с толку, но на самом деле всё просто. Чтобы точно понять, какое 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 и то что нужно на самом деле художнику в следующем материале.
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 и то что нужно на самом деле художнику в следующем материале.
#ue5