У меня проблемы с вращением объекта в моем коде Pymel - PullRequest
0 голосов
/ 10 октября 2019

Я пишу программу на python, чтобы заменить все стены, которые у меня есть на сцене майя. Программа должна продублировать существующую у меня в сцене стену, а затем заменить на нее каждую стену в сцене. Скрипт правильно дублирует нужную стену (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))

1 Ответ

0 голосов
/ 10 октября 2019

Хорошо, значит, вы проходите через свои старые стены и используете makeIdentity, чтобы заморозить их преобразования.

Теперь представьте, что у вас есть старая стена, которая повернута на 90 градусов в x. После того, как вы зафиксируете ее преобразования, стена останется там, где она есть, но ее повороты упадут до 0. Теперь, когда вы запрашиваете его вращение по оси x, он возвращает 0, как если бы он никогда не вращался в первую очередь (даже если это так!). Поэтому, когда вы делаете новую стену и применяете к ней вращение, вы просто применяете 0 по всем осям x, y и z. Вот почему вы не получаете никакого вращения.

Что касается позиции, когда вы используете makeIdentity для преобразований, она переводит все переводы в 0, за исключением того, что переносит старые значения в свои опорные точки. Это можно увидеть, выбрав старую стену и переключившись в Редактор атрибутов> Сводки> Локальное пространство. Если какое-либо из этих значений равно , а не 0, это означает, что объект имеет смещение в своих осях. А использование xform не учитывает эти значения при переводе запроса, поэтому вы получите странное смещение. Теперь, если вы используете Maya 2016 или выше, вы можете использовать matchTransform, и будет учитывать опорных точек. В противном случае вы должны сделать еще один вызов с xform(q=True, pivots=True) и включить эти значения в свои расчеты.

Самое простое решение сейчас - закомментировать makeIdentity, чтобы вы вообще не замораживали преобразования на старых стенах. ,Таким образом, ваше вращение останется нетронутым, и вы не создаете смещения оси.

...