我想随机旋转给定轴上的对象列表,其中从指定范围中检索随机量。 这就是我想出的:
import pymel.core as pm
import random as rndm
def rndmRotateX(targets, axisType, range=[0,180]):
for obj in targets:
rValue=rndm.randint(range[0],range[1])
xDeg='%sDeg' % (rValue)
#if axisType=='world':
# pm.rotate(rValue,0,0, obj, ws=1)
#if axisType=='object':
# pm.rotate(rValue,0,0, obj, os=1)
pm.rotate(xDeg,0,0,r=True)
targetList= pm.ls(sl=1)
randRange=[0,75]
rotAxis='world'
rndmRotateX(targetList,rotAxis,randRange)
我正在使用pm.rotate(),因为它允许我指定是否要在world或obj空间中完成旋转(与setAttr不同,据我所知)。 问题是,当我尝试运行它时会引发此错误:
# Error: MayaNodeError: file C:\Program Files\Autodesk\Maya2012\Python\lib\site-packages\pymel\internal\pmcmds.py line 140: #
它必须是他们的方式我输入pm.rotate()的参数(我假设这是由于线错误PyMel吐出,这与其参数转换函数有关),但我无法弄清楚我做错了,我的生活。 :/
答案 0 :(得分:1)
我认为问题出在这一行
pm.rotate(rValue,0,0, obj, os=1)
obj应该是第一个参数,所以它应该是
pm.rotate(obj, (rValue,0,0), os=1)
但要使它更漂亮,你可以使用
obj.setRotation((rValue,0,0), os=1)
还有。使用pm.selected()
代替pm.ls(sl=1)
。它看起来更好
答案 1 :(得分:1)
另一种方法是这样做..
from pymel.core import *
import random as rand
def rotateObjectsRandomly(axis, rotateRange):
rotateValue = rand.random() * rotateRange
for obj in objects:
PyNode(str(selected()) + ".r" + axis).set(rotateValue)
objectRotation = [[obj, obj.r.get()] for obj in selected()]
print "\nObjects have been rotated in the {0} axis {1} degrees.\n".format(axis, rotateValue)
return objectRotation
rotateObjectsRandomly("z", 360)
由于rand.random()返回一个介于0 - 1之间的随机值,我只是乘以用户指定的rotateRange。或者在我的偏好中,我只是将它们全部放在一起,然后将它乘以360 ...
你也不需要所有的反馈我觉得它在跑步时看起来很不错..
Objects have been rotated in the z axis 154.145898182 degrees.
# Result: [[nt.Transform(u'myCube'), dt.Vector([42.6541437517, 0.0, 154.145898182])]] #
答案 2 :(得分:0)
就像对你所得到的一样直接调试......
pm.rotate("20deg",0,0)
可以正常工作,但pm.rotate("20Deg",0,0)
将失败并抛出MayaNodeError,因为它认为您正在寻找一个名为'20Deg'的节点。基本上,您希望按照xDeg='%sdeg' % (rValue)
你不会看到这个直到你应用上面的修复,但如果你有两个选定的对象,并在它们上运行(修补)rndmRotateX函数,你会得到两个对象旋转相同的数量,因为下午.rotate()操作选择(两个对象)而不是每个对象的旋转。
如果您想快速修复,则需要在旋转前插入pm.select(obj)
。而且你可能想要保存选择列表并将其恢复...但是恕我直言,依靠这样的选择是一个非常糟糕的主意,所以我会推动你对Kim的回答。