Как вырезать сетку модели по шаблону робота

Учитывая модель сетки (например, коробку) и шаблон робота, содержащий объем, соотношение сторон и информацию о связи частей (в основном кубоидов), мы хотим иметь алгоритм резки, чтобы разрезать модель сетки на части, которые могут соответствовать шаблону робота. . Мы используем Maya для моделирования.

Например, сеточная модель представляет собой коробку объемом 1X1X1 = 1, шаблон робота имеет связь головы 0,5 объема 1: 1: 2 с телом и связь тела 0,5 объема 1: 1: 2 с головой, тогда нам нужно коробку разрезать пополам.

Соответствие объема, соотношения сторон и привязки не является строгим, допустимы разумные ошибки.

Есть ли какие-либо существующие алгоритмы, которые могут выполнить эту работу, или есть какие-либо связанные темы по этому поводу? Также, если у вас есть идея решить эту проблему, пожалуйста, просветите меня. Спасибо!

ИЗМЕНИТЬ

Проблема в том, что, имея объект-сетку и шаблон робота, нам нужно преобразовать его в робота.

Итак, теперь моя идея состоит в том, чтобы сначала разрезать объект на части, соответствующие шаблону, а затем преобразовать эти части в робота, возможно, используя обратную кинематику.

Пример ввода и вывода:

введите описание изображения здесь введите описание изображения здесь  введите описание изображения здесь


person cc_____    schedule 03.02.2014    source источник
comment
Если все части являются топологическими коробками, нужно ли разрезать сетки? Конечно, было бы проще использовать единичные кубы и перемещать / масштабировать их до соответствующих размеров ... В любом случае вы захотите, чтобы они были отдельными преобразованиями.   -  person theodox    schedule 04.02.2014
comment
Кроме того, похоже, что общий алгоритм подгонки куба может дать больше ответов по математике   -  person mhlester    schedule 04.02.2014
comment
@theodox Да, ты прав. Проблема тривиальна, если мы разрешим масштабирование. Я не сказал четко, что мы можем только преобразовывать и вращать части.   -  person cc_____    schedule 04.02.2014
comment
@mhlester Спасибо, что помогли мне отредактировать :). Я согласен с тем, что другой подход состоит в том, чтобы подогнать шаблон робота к исходной сетке. Постараюсь получить ответы по математике.   -  person cc_____    schedule 04.02.2014
comment
В этом случае примените масштабирование к вершинам. Это не изменит масштаб трансформации   -  person theodox    schedule 04.02.2014
comment
@theodox Как насчет того, чтобы дать вам модель машины, тогда мне понадобится робот из машины, как на третьей фигуре?   -  person cc_____    schedule 04.02.2014
comment
Итак, вы делаете декомпозицию выпуклой оболочки на реальной модели? как вы определяете свои опорные точки?   -  person theodox    schedule 04.02.2014
comment
@theodox Я не уверен, что его выпуклая оболочка разлагается. Позвольте мне сформулировать проблему еще раз. Имея простую сетчатую модель (автомобиль, шкаф), нам нужно изменить модель, чтобы сделать ее похожей на робота. Подобно этой модели, imgur.com/ob2khVU и этот окончательный результат imgur.com/E3i3ynE   -  person cc_____    schedule 04.02.2014
comment
@theodox Вся процедура должна быть автоматической. Проблема, о которой я писал выше, заключается в том, как этого добиться. imgur.com/5LM2fVO Модель автомобиля разделена на части, которые удовлетворяют требованиям к объему, соотношению сторон и соединению.   -  person cc_____    schedule 04.02.2014
comment
Так вот в чем причина кубических разрезов? Это может быть хорошей ссылкой. «Выпуклая» часть - это лишнее, но разложение кажется уместным. codeuppository.blogspot.com/2009/11/ Часть, о которой я не имею четкого представления, - это то, как создается скелет ...   -  person theodox    schedule 04.02.2014
comment
@theodox Кубовидные разрезы должны быть упрощенной версией проблемы ... Каркас задан и должен быть сопоставлен с частями. Это для «трансформации» позже. imgur.com/53uCQyp Каждая часть скелета имеет такие свойства, как объем, соотношение сторон и сцепление. После того, как мы разрежем модель автомобиля на части, например одна часть с объемом 50% 1: 1: 1, тогда мы можем сопоставить эту часть с «головой» скелета. В конце концов, мы могли бы получить такой же визуальный эффект, как в фильме «Трансформер». imgur.com/pfFWDhU   -  person cc_____    schedule 04.02.2014


Ответы (1)


Я бы попытался сделать кубики правильных размеров, установив соотношение сторон в форме куба.

import maya.cmds as cmds
def scaled_cube(volume, w, d, h):
    scale_factor = pow( float(volume) / float(h* w * d), 1.0/3)
    return cmds.polyCube(w = w * scale_factor, d = d * scale_factor, h = h * scale_factor)

Изменить: после приведенных выше комментариев будет вырезана часть меша, содержащаяся в кубоиде (определенном здесь как ограничивающая рамка в стиле майя (minx, miny, minz, maxx, maxy, maxz - то же, что вы получили бы от запрашивая bbox майя):

def cut_to_fit_bounds(mesh, bbox):
    '''
    splits an existing mesh
    '''
    cutmesh = cmds.duplicate(mesh)
    minx, miny, minz, maxx, maxy, maxz = bbox
    cmds.select(cutmesh)
    cmds.polyCut(pc = (minx, 0, 0), ro = (0, 90,0), df =1, ch=0 )
    cmds.polyCloseBorder(ch=0)
    cmds.polyCut(pc = (maxx, 0, 0), ro = (0, -90,0), df = 1, ch=0)
    cmds.polyCloseBorder(ch=0)
    cmds.polyCut(pc = (0, 0, minz), ro = (0, 0,0), df =1, ch=0 )
    cmds.polyCloseBorder(ch=0)
    cmds.polyCut(pc = (0, 0, maxz), ro = (0, 180,0), df = 1, ch=0)
    cmds.polyCloseBorder(ch=0)
    cmds.polyCut(pc = (0, miny, 0), ro = (-90, 0,0), df =1,ch=0 )
    cmds.polyCloseBorder(ch=0)
    cmds.polyCut(pc = (0, maxy, 0), ro = (90, 0,0), df = 1, ch=0)
    cmds.polyCloseBorder(ch=0)
    cmds.select(cutmesh)

Предыдущую процедуру можно было использовать для создания томов подходящего размера - путем их правильного размещения и захвата их ограничивающих рамок с помощью cmds.xform (q = True, bb = True) можно было вырезать объемы. После этого у вас должна быть обрезанная копия оригинала, хотя я бы побеспокоился о нормальных артефактах, осколках и проблемах с материалами, которые часто возникают при использовании polyCut.

person theodox    schedule 04.02.2014