Unreal Engine - Физика и Clothing ч.6
Карту MAX DISTANCE мы сделали, что на счет BACKSTOP RADIUS и BACKSTOP DISTANCE? Их тоже нужно рисовать, и у них есть свои собствнные инструменты визуализации. Давайте добавим карту:
Сейчас создадим бэкстоп дистанс карту и отключим отображение карты макс дистанс
В теории все что мне осталось посчитать это значение которым мне нужно заполнить карту, и так как мы используем идеальный пример мне прийдется это сделать один раз и после просто залиит значение. Какое? Хороший вовпрос. Я уже знаю что по дефолту у меня чуть больше 18 см расстояние до стены, следовательно мне нужно залить все таким значением которое в UE будет репрезентовать 18. К счастью UE работает напрямую с сантиметрами и мне не нужно ничего.
Вы спросите как может быть, что в UE я ввожу 18, а это — 18 см, если в основе лежит uint8 0–255? Ответ лежит на двух слоях:
первый — это вертекс колор который хранится в виде uint8 от 0 до 255
второй — это маска внутри chaos cloth которая уже хранит значения в виде float
второй — это маска внутри chaos cloth которая уже хранит значения в виде float
Когда я рисую вертекс колор в DCC например в Maya я задаю цвет от 0 до 1 но под капотом он конвертится в uint8 то есть 0.180 например это 46/255 а
когда я импортирую этот вертекс колор в UE через Copy from Vertex Color я указываю канал и scaling factor (например 100) тогда в коде вызывается формула:
floatVal = (uint8 / 255.0) * scalingFactor
то есть если у тебя был R = 46 то это будет (46 / 255) * 100 = 18.039 → это и есть значение которое запишется в маску. Это мы уже знаем из предыдущего материал.
А вот уже в UE Paint Tool я не работаю с uint8, я напрямую работаю с маской в float и если я в ней рисую 18 это значит что в маске лежит 18.0 и в симуляции это будет считаться как 18 см если mesh scale = 1
То есть я не рисую от 0 до 1 я рисую напрямую в сантиметрах и там уже нет никакого деления на 255 поэтому 18 = 18 см если ты рисуешь в UE Paint Tool. Если хочеться получить 18 см из вертекс колора тогда нужно вписать такой uint8 чтобы после деления и умножения на scalingFactor вышло 18 то есть цифру 46.
46 / 255.0 = 0.1803921568
0.1803921568 * 100 = 18.03921568
и назад:
18.0 / 100 = 0.18
0.18 * 255 = 45.9 ≈ 46
То есть я смело могу взять и вбить 18 в силу нажаия и залить мой объект, что я и сделал. Такой метод работы однозначно удобней. Окей мы получили BACKSTOP DISTANCE что на счет BACKSTOP RADIUS? Важно! Техника виртуальной коллизи и все связанные с ней тулы не работают без заполнения этих двух карт. Собственно давайте теперь заполним карту BACKSTOP RADIUS тем более мы уже знаем что она делает и что именно она репрезентует, но чтобы быть точным давайте загляним в DCC и измерием сколько сантиметров нужно сфере чтобы покрыть полигон по его размеру?:
То есть я смело могу взять и вбить 18 в силу нажаия и залить мой объект, что я и сделал. Такой метод работы однозначно удобней. Окей мы получили BACKSTOP DISTANCE что на счет BACKSTOP RADIUS? Важно! Техника виртуальной коллизи и все связанные с ней тулы не работают без заполнения этих двух карт. Собственно давайте теперь заполним карту BACKSTOP RADIUS тем более мы уже знаем что она делает и что именно она репрезентует, но чтобы быть точным давайте загляним в DCC и измерием сколько сантиметров нужно сфере чтобы покрыть полигон по его размеру?:
Полуается 7.5 и я какбы вписываю в полигон сферу. Понятно что она немного по другому визуализируется именно с точки зрения backstop но так я хотя бы смогу понять размерность того что должно виртуально блокировать проникновения конкретного меша. Опять же. Сейчас мы рассматриваем ИДЕАЛЬНЫЙ сценарий, в котором и вертексы имеют совпадающие нормали с направленем стены, и размерность сетки идеальная и на всем полотенце каждый полигон имеет одинаковый размер, как только мы выйдем в реальный мир все это стает per-vertex головной болью которую требуется решать индивидуально. Я просто заполню карту BACKSTOP RADIUS значением 7.5 и пойду валидировать работу тулы:
Теперь когда обе карты наполнены я вижу репрезентацию бэкстопа корректно. Работает ли она сама по себе - да. Действительно отрабатывает как виртуальная коллизия, но это средство поодержки основной коллизии а не ее замена просто из за того что природа бэкстопа - софт констрейн, что означает что его условия могут быть нарушены и он будет непротив, так что нет коллизии - нет стабильной работы. Давайте ее создадим. Для этого нам нужен физикал ассет и по клику на кость я задам ему приметив box который точно опишет мой объект:
Назначаем колизию на материал:
Теперь карты готовы и коллизия готова. Посмотрим как она работает?
Ну в целом стабильный результат и бэкстопа старается отработать корректно, но ожидаемо фейлит при быстром движении. Если сценарий упростить и уменьшив силу ветра то все отработает как надо, мы действительно получим эффект "коллизии без коллизии":
В целом эксперемент можно считать удачным, две эти штуки вместе помогают физике корректно работать, а вывод о том удобно ли работать в UE с клозом "по науке" вот так я оставлю вам. Далее физикал ассет как таковой, а потом поговорим про остальные карты и что они делают.
#ue5