Render.ru

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

Рейтинг
23
#21
Сань, ну если логически посудить,то глобальная ориентация кости складывается из:
1. Ориентация родителей.
2. Матрица трансформации самого джоинта (транслейт, ротейт,скейл, скос)
3. Джоинт Ориент

(а) "xform -q -ws -ro" - эта фигня возвращает все 3 пункта, т.е. Rglobal = Rparent + Rlocal + Rorient.
так же?
Глобальный ориент у Джоинта - это же обычная глобальная ориентация сустава без ориентации локальной матрицы.
 

xeash

Активный участник
Рейтинг
12
#22
Ща перепроверил, да
в зависимости от того что запрашиваем с xform -q -ws -ro на трансформ ноде или на джоинте, она возвращает : если джоинт jointOrientMatrix*rotateMatrix * parentMatrix,
если трансформ то rotateMatrix * parentMatrix.
Да по идее если избавится от rotateMatrix это команда должна покатить, но нада тестить. я почему то неуверен в операции вычитания(по идее нужно умножать на иверсную rotateMatrix ), во всех ли случаях она даст одинаковый результат. Ты такой способ сильно тестировал? пользуешься им часто?
 

l.rod

Активный участник
Рейтинг
5
#23
гляжу тут без меня скучно небыло....


я подумал еще раз что насамом деле мне надо и пришел к выводу, что это совсем не то, о чем я спрашивал. все оказалось гораздо проще, однако всеравно кое-что немогу сделать


я правильно понимаю, что локальная система координат у джоинта получается умножением родительской матрицы на ointOrientMatrix(строится по значениям Joint Orient из Attribute Editor)?
и относительно полученых осей поворачивается на значения Rotate - тогда получим оси, относительно которых задется трансформация его "детишек"?

и почему здесь
http://download.autodesk.com/us/maya/2011help/API/class_m_fn_ik_joint.html
на мартицу перемещения умножается в самом конце, разве тогда перемещение будет не относительно тех осей, которые получились в предыдущем абзаце?



вообщем вопрос - как получить вращение джоинта относительно его родителя?
 
Рейтинг
23
#24
l.rod От перемены мест множителей произведение не меняется.
"вообщем вопрос - как получить вращение джоинта относительно его родителя?" считываешь канал ротейт и скаладываешь с ориентом.

xeashНет, я такими командами вообще не пользуюсь)))) Просто высказывал предположение)) джоинт Ориент - это же не матрица.. как мы получим инверсную матрицу.
 

Dark™

Модератор форума
Команда форума
Рейтинг
431
#25
Оставлю свои 5 копеек)
По порядку, M = JO*R - это матрица трансформации для jointa, если рассматривать только вращательный вклад. Потом к этому умножается парент матрица родителей, этим мы переходим в глобальную систему. Но если матрицу привести к тройке углов, то получаться простые суммы составляющих, потому как итоговые вращения связаны между собой одной последовательностью, если не ошибаюсь. Поэтому, я считаю, что minstrel верно написал, глобальный JO - это просто вклад от парента и собственного orient'a.

В итоге для получения глобального JO в матричном виде:
WorldMatrix*inverseMatrix
(взяты реальные атрибуты, inverseMatrix - обратная локальная матрица трансформации)

В упрощенном виде:
vector $RGlobal - vector $Rlocal

- что по идее, одно и тоже.
 

xeash

Активный участник
Рейтинг
12
#26
ребята ну нифига=) извиняюсь

Dark™ сказал(а):
По порядку, M = JO*R - это матрица трансформации для jointa, если рассматривать только вращательный вклад.

во первых в другом порядке M=R*JO, + вращательный вклад вносит rotateAxis матрица но ее не используют обычно.

Dark™ сказал(а):
Поэтому, я считаю, что minstrel верно написал, глобальный JO - это просто вклад от парента и собственного orient'a.
Наверное стоит перечитать. minstrel прав только если мы говорим о мел-командах "xform -q -ws -ro" и "xform -q -ro". потому что они возвращают R*JO*ParentMatrix, R*JO соответственно.

Dark™ сказал(а):
В итоге для получения глобального JO в матричном виде:
WorldMatrix*inverseMatrix
(взяты реальные атрибуты, inverseMatrix - обратная локальная матрица трансформации)
Нет. во первых worldMatrix*inverseMatrix = parentMatrix(все перемноженные матрицы трансформации родителей).
Во вторых Матрица трансформации джоинта это(цитата из хелпа) = * [RO] * [R] * [JO] * [IS] * [T], т.е это не R*JO.

l.rod сказал(а):
и почему здесь
http://download.autodesk.com/us/maya/2011help/API/class_m_fn_ik_joint.html
на мартицу перемещения умножается в самом конце, разве тогда перемещение будет не относительно тех осей, которые получились в предыдущем абзаце?
Вспомним сначала то что в общем случае для 2х матриц A и B, A*B!=B*A ( от перемены мест множителей произведение меняется =))
И также вспомним что в майке postmultiply запись а не premultiply (т.е умножается на матрицы справа, а не слева. почему тут не буду объяснять).

А теперь ответ. Если бы было наоборот то у тебя бы кость сначала смещалась, потом скалировалась, вращалась. Что приведет к ее дополнительному смещению при скалировании, вращении. Можешь проверить, чтобы убедится

l.rod сказал(а):
вообщем вопрос - как получить вращение джоинта относительно его родителя?
если без joint orient, то rotateMatrix*parentMatrix(она же exclusiveMatrix)
если вместе, то соответственно rotateMatrix*jointOrientMatrix*parentMatrix(она же exclusiveMatrix)
 

xeash

Активный участник
Рейтинг
12
#27
minstrel сказал(а):
xeashНет, я такими командами вообще не пользуюсь)))) Просто высказывал предположение)) джоинт Ориент - это же не матрица.. как мы получим инверсную матрицу.
MObject object;

///здесь получаем mobject джоинта

MFnIkJoint joint (object);
MEulerRotation orient;
joint.getOrientation(orient);
MMatrix jointOrientInverseMatrix= orient.asMatrix().inverse();

вот так =)
 

Dark™

Модератор форума
Команда форума
Рейтинг
431
#28
во первых в другом порядке M=R*JO
Да, с порядком поспешил.

Наверное стоит перечитать. minstrel прав только если мы говорим о мел-командах "xform -q -ws -ro" и "xform -q -ro". потому что они возвращают R*JO*ParentMatrix, R*JO соответственно.
Они возвращают не матрицы, а массив 3-ех значений, если быть совсем точным. А вот расчеты идут в матрицах, но не в тех, что ты указал. Верно:
xform -q -ws -ro ([R]*[JO]*[parent matrix])
xform -q -r -ro ([R])
Я говорил про более общую идею. Матрица трансформаций и трансформация через углы напрямую - это лишь разные уровни одного и того же. Думаю, это понятно.
И вычитание тройки углов команды xform, по идее, просто равносильно [R]*[JO]*[parent matrix]*inverse[R].

Нет. во первых worldMatrix*inverseMatrix = parentMatrix(все перемноженные матрицы трансформации родителей).
Сейчас чуть вник, да, не уточнил. Забыл, что в matrix входят все значения jointa. Но идея осталась. Умножив worldMatrix на inverseMatrix (без вклада от JO, это можно, например, локатором воспроизвести) получаем нужное значение глобальной ориентации кости. Лично проверил.


Я написал в предыдущем посте о том, что рассматриваем только вклад от вращения. Но даже если принять во внимание , [RO], [IS], [T], то они, по логике вещей, никак не должны повлиять на итоговые значения вращений кости, к слову, многие из этих матриц обычно просто единичные.

Надеюсь, четко написал, а тема интересная затронута)
 

xeash

Активный участник
Рейтинг
12
#29
Dark™ сказал(а):
Они возвращают не матрицы, а массив 3-ех значений, если быть совсем точным. А вот расчеты идут в матрицах, но не в тех, что ты указал. Верно:
xform -q -ws -ro ([R]*[JO]*[parent matrix])
xform -q -r -ro ([R])
Да наврал. xform -q -r -ro ([R]) - верно

Dark™ сказал(а):
Я говорил про более общую идею. Матрица трансформаций и трансформация через углы напрямую - это лишь разные уровни одного и того же. Думаю, это понятно.
И вычитание тройки углов команды xform, по идее, просто равносильно [R]*[JO]*[parent matrix]*inverse[R].
Я с этим согласился выше. в теории согласен. но на практике, я неуверен, надо тестить.
Dark™ сказал(а):
Сейчас чуть вник, да, не уточнил. Забыл, что в matrix входят все значения jointa. Но идея осталась. Умножив worldMatrix на inverseMatrix (без вклада от JO, это можно, например, локатором воспроизвести) получаем нужное значение глобальной ориентации кости. Лично проверил.
Да прокатит, но... зачем так извращаться?

Dark™ сказал(а):
Я написал в предыдущем посте о том, что рассматриваем только вклад от вращения. Но даже если принять во внимание , [RO], [IS], [T], то они, по логике вещей, никак не должны повлиять на итоговые значения вращений кости, к слову, многие из этих матриц обычно просто единичные.

да, это так. Просто когда услышал "обратная локальная матрица трансформации" я подумал что ты имеешь ввиду, говоря о джоинте = инверсная от * [RO] * [R] * [JO] * [IS] * [T].
 

l.rod

Активный участник
Рейтинг
5
#30
l.rod От перемены мест множителей произведение не меняется.
"вообщем вопрос - как получить вращение джоинта относительно его родителя?" считываешь канал ротейт и скаладываешь с ориентом.
от перемены местами матриц произведение еще как меняется.

тупо сложить ротейт и ориент не прокатывает - попробуйте сделать 2 джоинта, и у первого задать joint orient x=180

а теперь сначала rotateZ=90 и заметить что получилось, а потом вернуть ротейт назад и задать joint orient z=90

заметна разница?
 

Dark™

Модератор форума
Команда форума
Рейтинг
431
#31
Я с этим согласился выше. в теории согласен. но на практике, я неуверен, надо тестить.
Было бы интересно узнать результат проверок, но, к сожалению, пока на это времени нет.

Да прокатит, но... зачем так извращаться?
Да, ради интереса и примера сделал в матричном виде. Быстро проверил на том, что есть в атрибутах нод.
 
Сверху