我正在编写一个python程序来替换我在Maya场景中当前拥有的所有墙。该程序应复制场景中现有的一堵墙,然后用它替换场景中的每堵墙。该脚本会正确复制所需的墙(Walls_Options:Wall_v *)。不幸的是,程序没有正确放置它们。由于某种原因,似乎将它们沿Y轴随机放置。它也完全不会旋转它们。非常感谢您的帮助。
from pymel.core import *
import random as rnd
wallChoices = ls("Walls_Options:Wall_v*", et="transform") #ls("newBrick", et="transform")
oldWalls = ls("Brick", et="transform")
for oldWall in oldWalls:
select(oldWall, r=True)
makeIdentity(apply=True, t=1, r=1, s=1, n=0)
thisWallPos = xform(oldWall, query=True, worldSpace=True, t=True)
thisWallRot = xform(oldWall, query=True, worldSpace=True, ro=True)
print(oldWall)
print("position is")
print(thisWallPos)
#print("rotation is")
#print(thisWallRot)
newThisWall = duplicate(wallChoices[0])
xform(newThisWall, query=False, worldSpace=True, t=thisWallPos)
######not rotating correctly yet....
xform(newThisWall, query=False, worldSpace=True, rt=thisWallRot)
select(newThisWall, r=True)
move(thisWallPos)
rotate(thisWallRot)
delete(oldWall)
print(newThisWall)
print(xform(newThisWall, query=True, worldSpace=True, rp=True))
[确定,所以您正在遍历旧墙,并且正在使用makeIdentity
冻结其变换。
现在,假设您有一堵旧墙,已将x旋转90度。冻结其变换后,墙将保留在其位置,但其旋转将降低为0。现在,当查询其x旋转时,它将返回0,就好像它从未旋转过一样(即使它是第一位!)。因此,当您制作新墙并对其应用旋转时,您只需在所有x,y和z轴上应用0。这就是为什么您没有任何轮换的原因。
关于位置,当您在转换上使用makeIdentity
时,会将所有平移烘焙为0,不同之处在于它将旧值转移到其轴中。您可以通过选择旧墙并切换到“属性编辑器”>“枢轴”>“本地空间”来查看此内容。如果这些值中的任何一个为not 0,则意味着该对象的枢轴具有偏移。而且,在查询转换时,使用xform
不会考虑这些值,因此最终会产生怪异的偏移量。现在,如果您使用的是Maya 2016或更高版本,则可以使用matchTransform
,并且will考虑了透视。否则,您必须使用xform(q=True, pivots=True)
再次调用并将这些值包括在计算中。
目前最简单的解决方案是注释掉makeIdentity
,这样您根本就不会冻结旧墙上的变换。这样一来,您的旋转就可以保持原样,并且不会创建枢轴偏移。