python - 在 Maya 中使用 Python 沿 nurbsPlane 创建毛囊以获得丝带 Spine?
问题描述
我实现了沿着 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)
解决方案
问题是您为毛囊的 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))
哦,请使用空格使代码更具可读性,否则它会让我的眼睛流血!
推荐阅读
- outlook - ICoreAuthenticationProvider NoClassDefFoundError
- c++ - 另一个模板结构内的模板结构的别名
- java - 无法使用 JKube maven 插件生成 Kubernetes 清单 yaml 文件
- sql - 特定条目日志表的事件入院和出院日期列表
- python - Django Model Formset 在 POST 上非常慢
- graphql - 要学习的 GraphQL-Ruby API 的真实世界示例?
- winui-3 - 当它是页面上唯一的东西时,NavigationView 会给出异常
- javascript - 无需请求即可通过 Express 向 Arduino 发送数据
- r - R 向量的逻辑子集错误
- google-sheets - 我可以从谷歌表格的脚本中调用本机函数吗?