0

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

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() 因为它允许我指定是否要在世界或 obj 空间中进行旋转(据我所知,与 setAttr 不同)。问题是,当我尝试运行它时会引发此错误:

# Error: MayaNodeError: file C:\Program Files\Autodesk\Maya2012\Python\lib\site-packages\pymel\internal\pmcmds.py line 140:  #

这一定是我输入 pm.rotate() 参数的方式(我假设这是由于 PyMel 吐出的行错误,这与它的参数转换函数有关),但我无法弄清楚我做错了。:/

4

3 回答 3

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). 它看起来更好

于 2012-11-20T09:44:16.417 回答
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])]] # 
于 2013-05-01T17:17:28.283 回答
0

就像对你所拥有的东西的直接调试一样......

问题01:区分大小写

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

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

在应用上述修复之前,您不会看到这一点,但是如果您有两个选定的对象,并在它们上运行(修补的)rndmRotateX 函数,您会得到两个对象以完全相同的量旋转,因为 pm.rotate( ) 对选择(两个对象)而不是每个对象的旋转进行操作。

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

于 2012-12-16T08:15:44.570 回答