PyMel旋转引发错误

时间:2012-11-20 08:12:16

标签: python maya mel pymel

我想随机旋转给定轴上的对象列表,其中从指定范围中检索随机量。 这就是我想出的:

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吐出,这与其参数转换函数有关),但我无法弄清楚我做错了,我的生活。 :/

3 个答案:

答案 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)

就像对你所得到的一样直接调试......

问题01:它区分大小写

pm.rotate("20deg",0,0)可以正常工作,但pm.rotate("20Deg",0,0)将失败并抛出MayaNodeError,因为它认为您正在寻找一个名为'20Deg'的节点。基本上,您希望按照xDeg='%sdeg' % (rValue)

构建字符串

问题02:您依赖于pm.rotate()的隐式“将应用于所选对象”行为

你不会看到这个直到你应用上面的修复,但如果你有两个选定的对象,并在它们上运行(修补)rndmRotateX函数,你会得到两个对象旋转相同的数量,因为下午.rotate()操作选择(两个对象)而不是每个对象的旋转。

如果您想快速修复,则需要在旋转前插入pm.select(obj)。而且你可能想要保存选择列表并将其恢复...但是恕我直言,依靠这样的选择是一个非常糟糕的主意,所以我会推动你对Kim的回答。