1. Пользоваться форумом на планшетах и телефонах стало удобнее благодаря Tapatalk

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

Тема в разделе "Maya", создана пользователем l.rod, 15 июн 2010.

Модераторы: Dark™, Skif
  1. l.rod

    l.rod Активный участник

    С нами с:
    24.04.2009
    Сообщения:
    31
    Симпатии:
    0
    Баллы:
    5
    Сначала такой вопрос: есть ли тут люди, которые знают maya api и могут полочь с плагином, или тут общаются только рядовые пользователи?
     
  2. Aleksandrs Poltarjonoks

    Aleksandrs Poltarjonoks Активный участник

    С нами с:
    17.09.2009
    Сообщения:
    70
    Симпатии:
    0
    Баллы:
    5
    Ну ты загнул :))))
     
  3. l.rod

    l.rod Активный участник

    С нами с:
    24.04.2009
    Сообщения:
    31
    Симпатии:
    0
    Баллы:
    5
    что загнул?
     
  4. xeash

    xeash Активный участник

    С нами с:
    26.04.2007
    Сообщения:
    208
    Симпатии:
    0
    Баллы:
    12
    если помочь=ответить на вопрос, то задавай
     
  5. l.rod

    l.rod Активный участник

    С нами с:
    24.04.2009
    Сообщения:
    31
    Симпатии:
    0
    Баллы:
    5
    как получить поворот и перемещение джоинта относительно родителя, но не в координатной системе родителя, а в глобальной?

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

    l.rod Активный участник

    С нами с:
    24.04.2009
    Сообщения:
    31
    Симпатии:
    0
    Баллы:
    5
    поворот локальной системы координат относительно глобальной я вроде нашел.

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

    xeash Активный участник

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

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

    xeash Активный участник

    С нами с:
    26.04.2007
    Сообщения:
    208
    Симпатии:
    0
    Баллы:
    12
    да есть.
    Если тебе нужно просто только матрица поворота
    пользуйся MEuelerRotation или MQuaternion

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

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

    l.rod Активный участник

    С нами с:
    24.04.2009
    Сообщения:
    31
    Симпатии:
    0
    Баллы:
    5
    про мировую матрицу я в курсе, но мне нужно немного другое. мне нужно положение не относительно начала глобальных координат, а относительно родителя, но в глобальных координатах, как если бы родителя перенести в центр глобальных координат.

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

    не, код не надо, нужна идея
     
  10. xeash

    xeash Активный участник

    С нами с:
    26.04.2007
    Сообщения:
    208
    Симпатии:
    0
    Баллы:
    12
    У меня 2 предположения (сорри, если туплю)
    1) либо ты не понял что я говорил, и не осознал что ты говоришь о мировой матрице)
    2) либо я не понял что ты говоришь,но предполагаю что ты хочешь посчитать положение объекта, но относительно другого родителя.


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

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

    l.rod Активный участник

    С нами с:
    24.04.2009
    Сообщения:
    31
    Симпатии:
    0
    Баллы:
    5
    наверно я непонятно обьясная что мне нужно. попробую на примере

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

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



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

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

    xeash Активный участник

    С нами с:
    26.04.2007
    Сообщения:
    208
    Симпатии:
    0
    Баллы:
    12
    Координаты = я так понимаю ты называешь локальной матрицой джоинта => матрицой в пространстве парента и все ее компоненты(которые и образуют матрицу) т.е. 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.
    Если я все еще не понял тебя, значит пример был плохой =)
     
  13. minstrel

    minstrel Знаток

    С нами с:
    10.01.2009
    Сообщения:
    120
    Симпатии:
    1
    Баллы:
    26
    "Как получить поворот и перемещение джоинта относительно родителя, но не в координатной системе родителя, а в глобальной? "
    По сути тебе,получается,нужно вернуть трансформацию джоинта в глобальном пространстве?
    MFnTransform transformFn(jointNode); врапь на трансформ и работай. Тут все есть.
     
  14. xeash

    xeash Активный участник

    С нами с:
    26.04.2007
    Сообщения:
    208
    Симпатии:
    0
    Баллы:
    12
    Вот и я так же понял, только все в красках рассказал)
     
  15. minstrel

    minstrel Знаток

    С нами с:
    10.01.2009
    Сообщения:
    120
    Симпатии:
    1
    Баллы:
    26
    xeash) вот видишь как у нас получается: одни и те же идеи,но реализованные разными способами)))
    Кстати, l.rod, МЕЛом такая штука делается через команду
    xform -q -ws -t - translation
    xform -q -ws -ro - rotation
     
  16. xeash

    xeash Активный участник

    С нами с:
    26.04.2007
    Сообщения:
    208
    Симпатии:
    0
    Баллы:
    12
    а у кости в иерархии мировой joint orient MELом вытащить можно? ;)
     
  17. minstrel

    minstrel Знаток

    С нами с:
    10.01.2009
    Сообщения:
    120
    Симпатии:
    1
    Баллы:
    26
    Саня(xeash): что это значит? Joint Orient - это всего лишь значения. Можно получить ток итоговую матрицу.
     
  18. xeash

    xeash Активный участник

    С нами с:
    26.04.2007
    Сообщения:
    208
    Симпатии:
    0
    Баллы:
    12
    я имел ввиду можно ли получить командой через MEL joint orient значения умноженные на parent matrix данного джоинта. Т.е. они должны быть равны значениям joint orient если ты parent -world данному джоинту сделаешь
     
  19. minstrel

    minstrel Знаток

    С нами с:
    10.01.2009
    Сообщения:
    120
    Симпатии:
    1
    Баллы:
    26
    По-идее, глобальный jointOrient = (xform -q -ws -ro) - (xform -q -r -ro).
    Т.е. получить глобальную ориентацию кости и вычесть локальное вращение.
     
  20. xeash

    xeash Активный участник

    С нами с:
    26.04.2007
    Сообщения:
    208
    Симпатии:
    0
    Баллы:
    12
    нифига, иди читай доки ;)

    в матрице джоинта идет так (опущу скейл), в таком порядке:
    [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 ] ?
     
Модераторы: Dark™, Skif

Поделиться этой страницей