2014-02-03 2 views
0

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

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

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

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

EDIT

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

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

вход образца и выход:

enter image description here enter image description here enter image description here

+1

Если кусочки являются все топологическими коробками, вам нужно разрезать сетки? Разумеется, было бы проще использовать кубики единицы и перемещать/масштабировать их до соответствующих размеров ... В любом случае вы захотите, чтобы они были отдельными преобразованиями. – theodox

+0

Кроме того, похоже, что общий алгоритм построения куба может получить больше ответов на [mathematics.se] – mhlester

+0

@theodox Да, вы правы. Задача тривиальна, если мы допустим масштабирование. Я не утверждал, что мы можем только преобразовывать и поворачивать подчасти. –

ответ

0

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

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.