2017-05-31 65 views
2

我想捕捉在Maya中另一个对象顶点/对齐的object Aobject B顶点。我曾尝试使用下面的脚本,但它不是完全贴合到顶点,而是与偏移量贴紧。任何人都可以给我一个解决方案。这里是快照。捕捉对象到Python的脚本

import maya.cmds as cmds 

vertices = []; 
srcObj = "pCone1"; 

def snapToVertex(vertex,object): 

    cmds.select(vertex); 
    x,y,z = cmds.pointPosition(); 
    cmds.select(object); 
    cmds.duplicate(); 
    cmds.move(x,y,z); 

def processTask(): 

    cmds.select(cmds.polyListComponentConversion(tv=True));   
    vertices = cmds.ls(sl = True); 

    print vertices; 
    for vrtx in vertices: 
     snapToVertex(vrtx,srcObj); 

processTask(); 

与我的上面的脚本捕捉,没有完全捕捉顶点。

enter image description here

但要准确地捕捉到Vervex的如下图像。

enter image description here

+0

是对象的由边界框所引用的坐标,或者由所述对象内的特定锚点?无论哪种方式,我猜你需要一种方法来设置对象中的哪个点要捕捉到顶点 –

+0

我已经将锥的枢轴移动到其边缘来实现它。我想我需要做的事情,而我正在移动。 – Rao

回答

2

这是最好不要使用Reset Transformations命令你ConeModify主菜单中,“事业支点回到其初始位置。 Python中有用的Freeze Transformations命令的模拟是cmds.makeIdentity()。即使你移动你的1沿+Y轴单位(例如)支点,不要忘记减去1variable y原因玛雅莫名其妙地记得枢纽的地位。锥体的枢轴点的偏移(用于将枢轴锁定到顶点)取决于锥体的尺寸本身。默认情况下它是1

这个片段添加到您的代码移动副本中World Space

# cmds.makeIdentity('pCone1', apply=True) 

pivSnap = 1 
cmds.xform('pCone1', piv=[ 0, pivSnap, 0 ]) 
cmds.move(x, y-pivSnap, z, a=True, ws=True, wd=True) 

enter image description here

您可以测试这个代码(在这里我感动枢增长0.5):

import maya.cmds as cmds 

cmds.polyCube(sx=1, sy=15, sz=1, w=1, h=15, d=1) 
cmds.polyCone(r=.5, h=1, sx=10) 
cmds.move(10, x=True) 
pivSnap = .5 
cmds.xform('pCone1', piv=[ 0, pivSnap, 0 ]) 
cmds.rotate(0, 0, '45deg') 
cmds.select('pCube1.e[33]','pCube1.e[37]','pCube1.e[41]','pCube1.e[45]','pCube1.e[49]','pCube1.e[53]','pCube1.e[57]','pCube1.e[61]') 
vertices = [] 
srcObj = "pCone1" 

def snapToVertex(vertex, object): 

    cmds.select(vertex) 
    x,y,z = cmds.pointPosition() 
    print(x,y,z) 

    cmds.select(object) 
    cmds.manipMoveContext(m=2) 
    cmds.delete('pCube1', ch=True) 
    cmds.duplicate()  
    cmds.move(x, y-pivSnap, z, a=True, ws=True, wd=True) 

def processTask(): 

    cmds.select(cmds.polyListComponentConversion(tv=True))  
    vertices = cmds.ls(sl=True) 
    print(vertices) 

    for vrtx in vertices: 
     snapToVertex(vrtx, srcObj) 

processTask() 

enter image description here

+0

默认情况下我们获得世界的位置,除非我们指定(l = True)。这我已经检查过。它不是问题 – Rao

+0

@Rao,请接受我的答案,如果它有用。 – andy

0

,你可以大大简化你的代码,并且只使用一些命令

import maya.cmds as mc 

verts = mc.ls(os=True) 
src = 'pCone1' 
base_name = 'fancy_cone' 

for i, vert in enumerate(verts): 
    dup = mc.duplicate(src, n='%s_%s' %(base_name, i))[0] 
    mc.xform(dup, ws=True, t=mc.xform(vert, q=True, ws=True, t=True)) 

记住几个注意事项:

1)这是假设你的源锥体的枢轴是在与尖端尖端在原点......所以它需要按照你想要的方式设置源圆锥体,就好像原点是你将要捕捉的顶点一样。如果你“锁定”的对象被旋转了(不需要做任何类型的矢量数学运算来确定位置偏移)
2)使用orderedSelection(os) flag在LS命令,你需要确保曲目选择顺序是在Maya偏好下的选择子部分打开 - 你希望他们要创建(这样你可以选择你的订单需要的绿党顶下来,bottum向上,等等),而不是VERT索引顺序

这也应该是显著快 - 通过跟踪所有创建的对象,你实际上并不需要任何选择,并可以操纵的对象直接LY。我也把它放在一个循环中,没有任何函数调用会更快(尽管除非你制作了一个LOOOOOOT,否则你可能不会注意到它)。

根据你的需要,你可能实际上想要在多个地方使用捕捉功能;不过,我建议在出现重复情况时不要重复,以免发生情况。

像这样(视情况而如上述相同的警告):

import maya.cmds as mc 

def snapToVertex(vertex, object): 
    pos = mc.xform(vertex, q=True, ws=True, t=True) 
    mc.xform(object, ws=True, t=pos) # combine to single line if prefered 

def processTask(): 
    verts = mc.ls(os=True) 
    src = 'pCone1' 
    base_name = 'fancy_cone' 

    for i, vert in enumerate(verts): 
     dup = mc.duplicate(src, n='%s_%s' %(base_name, i))[0] 
     snapToVertex(vert, dup) 

processTask()