Написание плагина для maya
- Автор темы l.rod
- Дата создания
если помочь=ответить на вопрос, то задавай
как я понимаю надо найти мартицу перехода из глобальных координат в локальную систему коодинат родителя, и дальше координаты нужного джоинта умнохать на обраюную матрицу
Цитирую xeash #4:если помочь=ответить на вопрос, то задавай
как получить поворот и перемещение джоинта относительно родителя, но не в координатной системе родителя, а в глобальной?
как я понимаю надо найти мартицу перехода из глобальных координат в локальную систему коодинат родителя, и дальше координаты нужного джоинта умнохать на обраюную матрицу
как получить поворот и перемещение джоинта относительно родителя, но не в координатной системе родителя, а в глобальной?
как я понимаю надо найти мартицу перехода из глобальных координат в локальную систему коодинат родителя, и дальше координаты нужного джоинта умнохать на обраюную матрицу
За положением любого трансформа(включая джоинт) в иерархии следит MDagPath, с его помощью можно быстро получить как и "включающую"(inclusive) матрицу (т.е. мировую матрицу данного трансформа), так и "исключающую" exclusive матрицу(т.е. парент матрицу =совокупность матриц всех родителей данного трансформа, исключая данный трансформ).
Вот и все с основной теорией. В зависимости от того что и как ты считаешь могут быть дополнительные нюансы.
Или ты код просил?
Edit:
питон, С++?
поворот локальной системы координат относительно глобальной я вроде нашел.
кстати в maya api есть функция, чтоб получить матрицу поворота зная углы? или самому считать надо?
кстати в maya api есть функция, чтоб получить матрицу поворота зная углы? или самому считать надо?
Если тебе нужно просто только матрица поворота
пользуйся MEuelerRotation или MQuaternion
А вообще обычно все что нужно есть в трансформ матрице (см MTransformationMatrix)
она по дефолту единичная. там есть все необходимые функции. например т.к. трансформ матрица совокупность тренслейт,ротейт, скейл и пивот матриц (у джоинта по другому (!), см доки за подробностями), то она будет идентична матрице поворота, если все остальные трансформ компоненты единичны (identity).
про мировую матрицу я в курсе, но мне нужно немного другое. мне нужно положение не относительно начала глобальных координат, а относительно родителя, но в глобальных координатах, как если бы родителя перенести в центр глобальных координат.
это получается надо найти положение джоинта и его родителя в глобальных координатах и из положения джоинта вычесть положение родителя, так?
не, код не надо, нужна идея
это получается надо найти положение джоинта и его родителя в глобальных координатах и из положения джоинта вычесть положение родителя, так?
не, код не надо, нужна идея
про мировую матрицу я в курсе, но мне нужно немного другое. мне нужно положение не относительно начала глобальных координат, а относительно родителя, но в глобальных координатах, как если бы родителя перенести в центр глобальных координат.
1) либо ты не понял что я говорил, и не осознал что ты говоришь о мировой матрице)
2) либо я не понял что ты говоришь,но предполагаю что ты хочешь посчитать положение объекта, но относительно другого родителя.
это получается надо найти положение джоинта и его родителя в глобальных координатах и из положения джоинта вычесть положение родителя, так?
если как ты говоришь взять мировую матрицу джоинта и мировую матрицу его родителя, и домножить первую на инверсную второй, то получится матрица джоинта = джоинт в локальных координатах.
т.е. мы вернемся к исходному.
не, код не надо, нужна идея
наверно я непонятно обьясная что мне нужно. попробую на примере
если создать 2 джоинта в Front View - первый раз кликнуть в точке ( 0, 0 ), а второй раз в точке ( 0, -1 ), то у первого джоинта будут координаты (0, 0, 0), а у второго (1, 0, 0)
мне надо получить его координаты относительно первого, но в глобальной системе координат т.е. (0, -1, 0 )
с перемещением разобрался. все было просто - надо было как я и предположил определить глобальное положение радителя и самого джоинта ( MTransformationMatrix::getTranslation( MSpace::kWorld ) ) и из положения джоинта вычести положение родителя
теперь надо подумать что с вращением
если создать 2 джоинта в Front View - первый раз кликнуть в точке ( 0, 0 ), а второй раз в точке ( 0, -1 ), то у первого джоинта будут координаты (0, 0, 0), а у второго (1, 0, 0)
мне надо получить его координаты относительно первого, но в глобальной системе координат т.е. (0, -1, 0 )
с перемещением разобрался. все было просто - надо было как я и предположил определить глобальное положение радителя и самого джоинта ( MTransformationMatrix::getTranslation( MSpace::kWorld ) ) и из положения джоинта вычести положение родителя
теперь надо подумать что с вращением
мне надо получить его координаты относительно первого, но в глобальной системе координат т.е. (0, -1, 0 )
Относительного первого= я это читаю как в пространстве парента. т.е. "координаты" такие как будто объект припарентен. Т.е. получается если как ты говорил первый джоинт припарентен ко второму, то у первого координаты УЖЕ относительно второго. А "координаты первого относительно второго в глобальной системе координат " это и есть мировые координты первого(или ты хочешь получать координаты первого как будто второй его единственный парент, даже если в сцене это не так? о_О тогда просто joint1Matrix*joint2Matrix).
Вот смотри, попробую пояснить
представь иерархию:
joint1
|
joint2
|
joint3
joint3- наша начальная точка, кость, и соответственно матрица. Ее координаты УЖЕ относительно joint2 так как joint2 является парентом joint3.
Каждый джоинт, т.е. матрица, математически ничего не знает друг о друге. В ее числах(компонентах матрицы, tx,ty,tz и т.д.) ты не увидишь информацию о родителе или о потомках.
Имеет смысл только вся иерархия, и каждая матрица по отдельности. Иерархия означает что матрицы перемножаются по порядку, и контролы рисуются (напр во вьюпорте) по порядку. Таким образом только
глянув во вьюпорт ты можешь определить что твоя кость припарентена.
Поэтому например чтобы "вычислить координаты joint3 относительно joint1", то нужно всего лишь матрицы joint3*joint2 и тогда мы получим координаты относительно(!) joint1. если мы еще домножим результат(joint3*joint2) на матрицу joint1 то получим Глобальные координаты joint3, т.е. joint3 теперь в глобальной системе координат, верно?
Проблема в том что родителей текущего джоинта может быть сколько угодно много, поэтому и используются методы MDagPath.inclusiveMatrix() и MDagPath.exclusiveMatrix() они делают всю работу о подсчете и перемножении трансформов за тебя.
короче че с вращением
Такой алгоритм должен прокатить:
1)получаешь матрицу вращения (!) (только вращения)
текущего джоинта
2) получаешь DagPath джоинта
3) умножаешь матрицу вращения*dagPath.exclusiveMatrix() (т.е. все перемноженные паренты данного джоинта)....
и дальше извращаешься или...
4)врапишь трансформ класс к этой матрицы и таким образом извлекаешь компоненты вращения x,y,z или x,y,z,w
или целым MEulerRotation или MQuaternion
5)Используешь компоненты где тебе нужно и радуешься жизни.
Только помни, что у джоинта есть как бы pre-rotation matrix, это joint orientation, это какбы вторая ротейт матрица
P.S.
Если я все еще не понял тебя, значит пример был плохой =)
- Рейтинг
- 23
"Как получить поворот и перемещение джоинта относительно родителя, но не в координатной системе родителя, а в глобальной? "
По сути тебе,получается,нужно вернуть трансформацию джоинта в глобальном пространстве?
MFnTransform transformFn(jointNode); врапь на трансформ и работай. Тут все есть.
По сути тебе,получается,нужно вернуть трансформацию джоинта в глобальном пространстве?
MFnTransform transformFn(jointNode); врапь на трансформ и работай. Тут все есть.