Авто формирующее платье на 3d аватаре
Я видел, как 3d-модели предметов одежды автоматически меняются в таких программах, как Daz3d, poser, makehuman и т. Д., Когда модель, на которую надевается платье, изменяется (обычно с морфингом). У меня есть ситуация, когда я должен сделать что-то подобное в OpenGLES. Может кто-нибудь сказать мне основную логику в этом? Это снова морфы работают или есть какой-то другой способ? Есть ли библиотека, модифицирующая сетку?
1 ответ
Я хотел бы подойти к этому так:
меш
Обычно представляется как сеть вложенных точек в некоторой топологической сетке. Для этого я бы разбил одежду на "цилиндры". Каждый "цилиндр" будет представлен сеткой точек примерно так:
struct _pnt { float x,y,z; bool stretch,done; }; _pnt pnt[na][nb][3];
где
na
должен зависеть от диаметра цилиндра, но обычноna=36
более чем достаточно во всех случаяхnb
должна зависеть от высоты "цилиндра" и детализации ткани...
Каждая из точек имеет свои трехмерные координаты
x,y,z
которые изначально настроены на форму ткани, как если бы она была заполнена воздухом, как воздушный шар.stretch
флаг, если точка на какой-то резинке заставляет его прилипать к коже.done
это просто временный флаг для вычисления.динамика
Теперь, если вы хотите вычислить фактическую форму ткани, вам нужно:
- задавать
done=false
по всем пунктам - установить все
stretch
ed указывает на соответствующую позицию на коже человека / манекена (поверхность сетки) и устанавливаетdone=true
для них. Эти точки обычно покрывают весь срез(b=constant,a=0,1,2,...na-1)
для каждой растянутой точки
(a0,b0)
вычислить связанные точки. Математика / физика, стоящая за этим, такова:так сканируйте точки
(a0+1,b0),(a0+2,b0)...
если вы нажмете другуюstretch
Точка использовать кафтарную кривую и, если нет, использовать моделирование динамики Ньютона / Д'Ламбера, чтобы получить положение (для этого нужно добавить скоростьvx,vy,vz
к_pnt
, Когда позиция вычисляется, установитеdone=true
для всех вычисленных точек.Также, если вычисленная позиция точки находится внутри сетки аватара, вы должны установить ее положение на поверхность аватара и установить ее скорость равной нулю.
Обрабатывать сетки самовывозов (динамическое воздействие)
искать все не вычисленные точки
done==false
и интерполировать их положение от их вычисленных соседей.
- задавать
Если у вас есть эта работа, вы можете добавить больше функций, таких как эластичность, масса,... коэффициенты для каждой точки и многое другое.