Реализация "растягивания" мышкой 3d модели в 3d редакторе

Пишу небольшой редактор 3d моделек, который поддерживает стандартные функции (перемещение 3d модели, регулирование размера, загрузка текстуры).

Представим себе ситуацию: человек загрузил, к примеру, модель черепа, плюс текстура лица. Ему теперь хочется, скажем, немного вытянуть подбородок. Я хочу сделать так, чтобы можно было выбрать подбородок мышкой и начать его "вытягивать". При этом текстура должна нормально сидеть на черепе, чтобы всё красиво смотрелось. Как вообще реализовать данную функцию? Под этим имею в виду, как можно выбрать точку на модели, за нее "потянуть" mesh с текстурой и чтобы эта текстура не съезжала? То есть в целом, как такую технологию реализовать, очень желательно стандартными алгоритмами без привлечения ai.


Ответы (1 шт):

Автор решения: Kromster

AI тут вообще не причем (по крайней мере на ближайшие лет 5).

Полезно подумать о граничных случаях. Вот вы потянули подбородок и вытянули его на 100 метров. Текстура точно не должна съезжать? А как должна себя повести?

Небольшие растяжения обычно просто морфами делают (см. morph target), и при небольших растяжениях текстуры еще не сильно заметно тянутся.

Если вы уверены, что подбородок будет всегда в определенном месте, то можете попробовать процедерно это место вытягивать (например, сферу с радиусом Н и плавным снижением силы в зависимости от расстояния от центра).

Или же потребовать, чтобы у моделей была как-то размечена область подбородка (например, картой весов). Тогда это будет по сути скелетная анимация, где вытягивание подбородка - это вытягивание кости подбородка.

Чтобы затяжки текстуры были не так заметны - посмотрите в сторону detail map (микротекстур). Также в целом может быть интересен подход в процедурными текстурами (вместо или вместе с UV), но тут уже сильно от модели зависит.

→ Ссылка