给定一个网格模型(例如一个盒子)和一个包含体积,纵横比和子部件链接信息(基本上是长方体)的机器人模板,我们希望有一个切割算法将网格模型切割成可以匹配的部分机器人模板。我们使用Maya进行建模工作。
例如,网格模型是一个1X1X1体积= 1的盒子,机器人模板有1:1:2体积0.5头部链接与身体,和1:1:2体积0.5身体链接与头部,然后什么我们需要的是将盒子切成两半。
音量,宽高比和联动的匹配不严格,可以接受合理的错误。
是否有任何现有算法可以完成这项工作,或者是否有相关主题? 如果您有任何想法解决这个问题请赐教。谢谢!
修改
问题是,给定网格对象和机器人模板,我们需要将其转换为机器人。
所以现在我的想法是首先将对象切割成与模板匹配的子部分,然后使用Inverse Kinematic将子部分转换为机器人。
示例输入和输出:
答案 0 :(得分: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)
编辑:在上面的注释之后,这将删除包含在长方体中的网格部分(此处定义为maya样式的边界框(minx,miny,minz,maxx,maxy,maxz - 与你相同的东西) d来自查询maya 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时常见的正常伪影,条子多边形和材料问题。