Render.ru

Написание плагина для maya

l.rod

Активный участник
Рейтинг
5
#1
Сначала такой вопрос: есть ли тут люди, которые знают maya api и могут полочь с плагином, или тут общаются только рядовые пользователи?
 

l.rod

Активный участник
Рейтинг
5
#5
если помочь=ответить на вопрос, то задавай
как получить поворот и перемещение джоинта относительно родителя, но не в координатной системе родителя, а в глобальной?

как я понимаю надо найти мартицу перехода из глобальных координат в локальную систему коодинат родителя, и дальше координаты нужного джоинта умнохать на обраюную матрицу
 

l.rod

Активный участник
Рейтинг
5
#6
поворот локальной системы координат относительно глобальной я вроде нашел.

кстати в maya api есть функция, чтоб получить матрицу поворота зная углы? или самому считать надо?
 

xeash

Активный участник
Рейтинг
12
#7
Цитирую xeash #4:если помочь=ответить на вопрос, то задавай

как получить поворот и перемещение джоинта относительно родителя, но не в координатной системе родителя, а в глобальной?

как я понимаю надо найти мартицу перехода из глобальных координат в локальную систему коодинат родителя, и дальше координаты нужного джоинта умнохать на обраюную матрицу
нужно умножить текущую трансформ матрицу джоинта на матрицу всех(!) родителей. Так как у разных джоинтов положение в иерархии может быть разное, соответственно матрицы будут другие. Это называется мировая матрица.
За положением любого трансформа(включая джоинт) в иерархии следит MDagPath, с его помощью можно быстро получить как и "включающую"(inclusive) матрицу (т.е. мировую матрицу данного трансформа), так и "исключающую" exclusive матрицу(т.е. парент матрицу =совокупность матриц всех родителей данного трансформа, исключая данный трансформ).
Вот и все с основной теорией. В зависимости от того что и как ты считаешь могут быть дополнительные нюансы.

Или ты код просил?
Edit:
питон, С++?
 

xeash

Активный участник
Рейтинг
12
#8
поворот локальной системы координат относительно глобальной я вроде нашел.

кстати в maya api есть функция, чтоб получить матрицу поворота зная углы? или самому считать надо?
да есть.
Если тебе нужно просто только матрица поворота
пользуйся MEuelerRotation или MQuaternion

А вообще обычно все что нужно есть в трансформ матрице (см MTransformationMatrix)

она по дефолту единичная. там есть все необходимые функции. например т.к. трансформ матрица совокупность тренслейт,ротейт, скейл и пивот матриц (у джоинта по другому (!), см доки за подробностями), то она будет идентична матрице поворота, если все остальные трансформ компоненты единичны (identity).
 

l.rod

Активный участник
Рейтинг
5
#9
про мировую матрицу я в курсе, но мне нужно немного другое. мне нужно положение не относительно начала глобальных координат, а относительно родителя, но в глобальных координатах, как если бы родителя перенести в центр глобальных координат.

это получается надо найти положение джоинта и его родителя в глобальных координатах и из положения джоинта вычесть положение родителя, так?

не, код не надо, нужна идея
 

xeash

Активный участник
Рейтинг
12
#10
про мировую матрицу я в курсе, но мне нужно немного другое. мне нужно положение не относительно начала глобальных координат, а относительно родителя, но в глобальных координатах, как если бы родителя перенести в центр глобальных координат.
У меня 2 предположения (сорри, если туплю)
1) либо ты не понял что я говорил, и не осознал что ты говоришь о мировой матрице)
2) либо я не понял что ты говоришь,но предполагаю что ты хочешь посчитать положение объекта, но относительно другого родителя.


это получается надо найти положение джоинта и его родителя в глобальных координатах и из положения джоинта вычесть положение родителя, так?
вычесть? ты хотел сказать умножить на инверсную?
если как ты говоришь взять мировую матрицу джоинта и мировую матрицу его родителя, и домножить первую на инверсную второй, то получится матрица джоинта = джоинт в локальных координатах.
т.е. мы вернемся к исходному.

не, код не надо, нужна идея
Может проще мне понять будет, если ты объяснишь что ты считаешь и для чего?
 

l.rod

Активный участник
Рейтинг
5
#11
наверно я непонятно обьясная что мне нужно. попробую на примере

если создать 2 джоинта в Front View - первый раз кликнуть в точке ( 0, 0 ), а второй раз в точке ( 0, -1 ), то у первого джоинта будут координаты (0, 0, 0), а у второго (1, 0, 0)

мне надо получить его координаты относительно первого, но в глобальной системе координат т.е. (0, -1, 0 )



с перемещением разобрался. все было просто - надо было как я и предположил определить глобальное положение радителя и самого джоинта ( MTransformationMatrix::getTranslation( MSpace::kWorld ) ) и из положения джоинта вычести положение родителя

теперь надо подумать что с вращением
 

xeash

Активный участник
Рейтинг
12
#12
мне надо получить его координаты относительно первого, но в глобальной системе координат т.е. (0, -1, 0 )
Координаты = я так понимаю ты называешь локальной матрицой джоинта => матрицой в пространстве парента и все ее компоненты(которые и образуют матрицу) т.е. tx,ty,tz,rx,ry,rz,jox,joy,joz и так далее

Относительного первого= я это читаю как в пространстве парента. т.е. "координаты" такие как будто объект припарентен. Т.е. получается если как ты говорил первый джоинт припарентен ко второму, то у первого координаты УЖЕ относительно второго. А "координаты первого относительно второго в глобальной системе координат " это и есть мировые координты первого(или ты хочешь получать координаты первого как будто второй его единственный парент, даже если в сцене это не так? о_О тогда просто 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
#13
"Как получить поворот и перемещение джоинта относительно родителя, но не в координатной системе родителя, а в глобальной? "
По сути тебе,получается,нужно вернуть трансформацию джоинта в глобальном пространстве?
MFnTransform transformFn(jointNode); врапь на трансформ и работай. Тут все есть.
 

xeash

Активный участник
Рейтинг
12
#14
"Как получить поворот и перемещение джоинта относительно родителя, но не в координатной системе родителя, а в глобальной? "
По сути тебе,получается,нужно вернуть трансформацию джоинта в глобальном пространстве?
MFnTransform transformFn(jointNode); врапь на трансформ и работай. Тут все есть.
Вот и я так же понял, только все в красках рассказал)
 
Рейтинг
23
#15
xeash) вот видишь как у нас получается: одни и те же идеи,но реализованные разными способами)))
Кстати, l.rod, МЕЛом такая штука делается через команду
xform -q -ws -t - translation
xform -q -ws -ro - rotation
 

xeash

Активный участник
Рейтинг
12
#18
я имел ввиду можно ли получить командой через MEL joint orient значения умноженные на parent matrix данного джоинта. Т.е. они должны быть равны значениям joint orient если ты parent -world данному джоинту сделаешь
 
Рейтинг
23
#19
По-идее, глобальный jointOrient = (xform -q -ws -ro) - (xform -q -r -ro).
Т.е. получить глобальную ориентацию кости и вычесть локальное вращение.
 

xeash

Активный участник
Рейтинг
12
#20
нифига, иди читай доки ;)

в матрице джоинта идет так (опущу скейл), в таком порядке:
[Ro]x[R]x[JO]x[T]
где Ro= rotate axis матрица
R - rotate матрица
JO - joint orient матрица
поэтому xform -q -ws -ro возвращает [R]x [Parent matrix].
и чето я не пойму как [JO]== [R]x[ Parent matrix] - [R ] ?
 
Сверху