在Maya中使用Python沿NurbPlane为带状脊椎创建毛囊?

2024-05-23 14:03:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我沿着nurbsPlane完成了卵泡的创建。但是,当我连接“输出平移”(OutTranslate)属性以使它们随顶点一起移动时,除第一个属性外的所有属性都会移动到平面的末端。有人能解释它为什么这样做吗?我是一个初学者,所以如果有什么东西写得很奇怪,请告诉我,这样我可以提高。提前谢谢


import maya.cmds as cmds

listName = ['spine01', 'spine02','spine03', 'spine04','spine05', 'spine06','spine07', 'spine08', 'spine09', 'spine10' ]
planeLength = 45.00 
cmds.select(all=True)
cmds.delete()

cmds.nurbsPlane(p=[planeLength/2,0,0], ax=[0,0,0], w=planeLength, lr=0.1 , d=3, u=9, v=1, n='spineNurbsPlane')
cmds.rotate(0,0,90, 'spineNurbsPlane')
cmds.select(d=True)
cmds.group(em=True, n='follicle_grp')

for i in range( len(listName)):    
    y=str(i+1)
    cmds.createNode( 'follicle', n='follicle'+listName[i])
    cmds.parent('follicle'+y,'follicle_grp', s=True )
    cmds.setAttr('follicle'+listName[i]+'.simulationMethod', 0)
    cmds.makeIdentity('spineNurbsPlane', apply=True, t=1, r=1, s=1, n=0 )

    cmds.connectAttr('follicle'+listName[i]+'.outRotate','follicle'+y+'.rotate', f=True )
    cmds.connectAttr('follicle'+listName[i]+'.outTranslate','follicle'+y+'.translate')
    cmds.connectAttr('spineNurbsPlaneShape.worldMatrix','follicle'+listName[i]+'.inputWorldMatrix')
    cmds.connectAttr('spineNurbsPlaneShape.local','follicle'+listName[i]+'.inputSurface')

    cmds.setAttr( 'follicle'+y+'.parameterV', 0.5)
    cmds.setAttr( 'follicle'+y+'.parameterU', i*5)

Tags: true属性selectcmdsrotategrpsetattrconnectattr
1条回答
网友
1楼 · 发布于 2024-05-23 14:03:22

问题是您正在设置毛囊的parameterU属性的值。该属性的范围是从0到1(是的,您可以设置为1以上,但不应该设置),并且您传递的值远远超过1,使它们在顶部聚集在一起

为了举例说明,让我们看看当前使用i*5获得的几个值,并用循环中的值替换i

0 * 5  # Outputs 0, puts the follicle on the bottom
1 * 5 # Outputs 5, already beyond attribute's range and puts it on top
2 * 5 # Outputs 10, again puts it on top
3 * 5 # Outputs 15, yup same thing
.. and so on

所以你需要传递一个有意义的值。要重新映射,使值介于0-1之间,可以使用以下简单公式:loopIndex / (totalFollicleCount - 1)。就是这样,这将沿着平面的长度正确地设置它们,因为它将使值在0-1之间。顺便说一下,我们需要将总长度减去1,以得到最后一个要放置在顶部的毛囊

import maya.cmds as cmds

listName = ['spine01', 'spine02', 'spine03', 'spine04', 'spine05', 'spine06', 'spine07', 'spine08', 'spine09', 'spine10']
planeLength = 45.00 
cmds.select(all=True)
cmds.delete()

cmds.nurbsPlane(p=[planeLength / 2, 0, 0], ax=[0, 0, 0], w=planeLength, lr=0.1 , d=3, u=9, v=1, n='spineNurbsPlane')
cmds.rotate(0, 0, 90, 'spineNurbsPlane')
cmds.select(d=True)
cmds.group(em=True, n='follicle_grp')

for i in range(len(listName)):    
    y = str(i + 1)
    cmds.createNode('follicle', n='follicle' + listName[i])
    cmds.parent('follicle' + y,'follicle_grp', s=True)
    cmds.setAttr('follicle' + listName[i] + '.simulationMethod', 0)
    cmds.makeIdentity('spineNurbsPlane', apply=True, t=1, r=1, s=1, n=0)

    cmds.connectAttr('follicle' + listName[i] + '.outRotate', 'follicle' + y + '.rotate', f=True)
    cmds.connectAttr('follicle' + listName[i] + '.outTranslate', 'follicle' + y + '.translate')
    cmds.connectAttr('spineNurbsPlaneShape.worldMatrix', 'follicle' + listName[i] + '.inputWorldMatrix')
    cmds.connectAttr('spineNurbsPlaneShape.local', 'follicle' + listName[i] + '.inputSurface')

    cmds.setAttr('follicle' + y + '.parameterV', 0.5)
    cmds.setAttr('follicle' + y + '.parameterU', float(i) / (len(listName) - 1))

哦,请利用空白使代码更可读,否则会让我的眼睛流血

相关问题 更多 >