我无法以我的Pymel代码旋转对象

问题描述 投票:0回答:1

我正在编写一个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))
duplicates rotation maya pymel
1个回答
0
投票

[确定,所以您正在遍历旧墙,并且正在使用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,这样您根本就不会冻结旧墙上的变换。这样一来,您的旋转就可以保持原样,并且不会创建枢轴偏移。

© www.soinside.com 2019 - 2024. All rights reserved.