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)しますが、「20Deg」というノードを探していると見なされるため、失敗してMayaNodeErrorがスローされます。基本的に、次のように文字列を作成します。xDeg='%sdeg' % (rValue)

問題02:pm.rotate()の暗黙的な「選択したオブジェクトに適用される」動作に依存しています

上記の修正を適用するまでこれは表示されませんが、2つのオブジェクトを選択し、それらに対して(パッチを適用した)rndmRotateX関数を実行すると、pm.rotate( )は、オブジェクトごとの回転ではなく、選択範囲(両方のオブジェクト)を操作しています。

すばやく修正したい場合はpm.select(obj)、回転の前にを挿入する必要があります。そして、選択リストを保存して復元したいと思うかもしれません...しかし、私見では、このような選択に依存するのは本当に悪い考えなので、キムの答えに向かってあなたをプッシュします。

于 2012-12-16T08:15:44.570 に答える