Авто формирующее платье на 3d аватаре

Я видел, как 3d-модели предметов одежды автоматически меняются в таких программах, как Daz3d, poser, makehuman и т. Д., Когда модель, на которую надевается платье, изменяется (обычно с морфингом). У меня есть ситуация, когда я должен сделать что-то подобное в OpenGLES. Может кто-нибудь сказать мне основную логику в этом? Это снова морфы работают или есть какой-то другой способ? Есть ли библиотека, модифицирующая сетку?

1 ответ

Я хотел бы подойти к этому так:

  1. меш

    Обычно представляется как сеть вложенных точек в некоторой топологической сетке. Для этого я бы разбил одежду на "цилиндры". Каждый "цилиндр" будет представлен сеткой точек примерно так:

    struct _pnt { float x,y,z; bool stretch,done; };
    _pnt pnt[na][nb][3];
    

    где

    • na должен зависеть от диаметра цилиндра, но обычно na=36 более чем достаточно во всех случаях
    • nb должна зависеть от высоты "цилиндра" и детализации ткани...

    цилиндр

    Каждая из точек имеет свои трехмерные координаты x,y,z которые изначально настроены на форму ткани, как если бы она была заполнена воздухом, как воздушный шар. stretch флаг, если точка на какой-то резинке заставляет его прилипать к коже. done это просто временный флаг для вычисления.

  2. динамика

    Теперь, если вы хотите вычислить фактическую форму ткани, вам нужно:

    1. задавать done=false по всем пунктам
    2. установить все stretched указывает на соответствующую позицию на коже человека / манекена (поверхность сетки) и устанавливает done=true для них. Эти точки обычно покрывают весь срез (b=constant,a=0,1,2,...na-1)
    3. для каждой растянутой точки (a0,b0) вычислить связанные точки. Математика / физика, стоящая за этим, такова:

      так сканируйте точки (a0+1,b0),(a0+2,b0)... если вы нажмете другую stretch Точка использовать кафтарную кривую и, если нет, использовать моделирование динамики Ньютона / Д'Ламбера, чтобы получить положение (для этого нужно добавить скорость vx,vy,vz к _pnt, Когда позиция вычисляется, установите done=true для всех вычисленных точек.

      Также, если вычисленная позиция точки находится внутри сетки аватара, вы должны установить ее положение на поверхность аватара и установить ее скорость равной нулю.

      Обрабатывать сетки самовывозов (динамическое воздействие)

    4. искать все не вычисленные точки done==false и интерполировать их положение от их вычисленных соседей.

Если у вас есть эта работа, вы можете добавить больше функций, таких как эластичность, масса,... коэффициенты для каждой точки и многое другое.

Другие вопросы по тегам