Как преобразовать трехмерный вектор в поворот Эйлера в программном обеспечении, таком как майя, используя python

Существует заданный трехмерный вектор. Я хочу преобразовать этот вектор в поворот, который может сделать одну из локальной оси (например, оси X) этого куба в соответствии с направлением вектора.

Я подготовил две фотографии. Но я не могу вставить их из-за моей репутации. Я новичок.

Я много раз пробовал, но до сих пор не могу заставить его работать. Я думаю, что это может включать порядок вращения куба при вращении куба.

3 Solutions collect form web for “Как преобразовать трехмерный вектор в поворот Эйлера в программном обеспечении, таком как майя, используя python”

Вероятно, вы можете получить то, что хотите, используя ограничение цели . Если вы хотите сделать это как одноразовую операцию (не имея ограничения, действующего в вашей сцене, вы можете просто сделать:

lc = cmds.aimConstraint( 'your_object_here', 'target_object_here') cmds.delete(*lc) 

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

В майе матрица работает так:

 Xx Xy Xz 0 Yx Yy Yz 0 Zx Zy Zz 0 Tx Ty Tz 1 

где

  • (Xx, Xy, Xz) – локальный вектор X матрицы
  • (Yx, Yy, Yz) – локальный вектор Y матрицы
  • (Zx, Zy, Zz) – локальный вектор Z матрицы
  • (Tx, Ty, Tz) – это перевод матрицы

Масштаб, если таковой имеется, кодируется в размере векторов; для матрицы в масштабе 1 и без вращения векторы нормированы, поэтому матрица будет

 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 

Вы можете сделать матрицу с помощью Pymel так, с четырьмя кортежами, представляющими строки:

 import pymel.core as pm # in practice these vectors would reflect the orientation you want new_mat = pm.core.matrix ( ( 1, 0, 0, 0), ( 0, 1, 0, 0), ( 0, 0, 1, 0), ( 0, 0, 0, 1) ) 

И примените его к объекту с помощью команды xform:

 pm.xform(my_object, matrix = new_mat) 

Использование ограничений, поскольку @theodox говорит, совершенно справедливо, как и использование xform. Просто предоставляя некоторую альтернативную информацию (см. Ниже постскриптум для получения дополнительной информации).

Тем не менее, у Maya есть узел, называемый decoseMatrix , который сделает преобразование для вас, если это единственное, что вам нужно. API Maya также имеет функцию для разложения:

 import maya.OpenMaya as om util = om.MScriptUtil() mat = om.MMatrix() util.createMatrixFromList( [ 1., 0., 0., 0., 0., 1., 0., 0., 0., 0., 1., 0., 0., 0., 0., 1. ], mat) rot = om.MEulerRotation.decompose(mat, om.MEulerRotation.kXYZ) # result in radians which in this are is known but my example is just a placeholder print rot.x, rot.y, rot.z 

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

В любом случае, вы можете когда-нибудь сделать это за пределами майя или с разными заказами на состав для примера масштабирования и сдвига, тогда я бы указал вам на домашнюю страницу Кристофа Гольке и посмотрел Transformations.py и transformations.c, они предоставляют много информации о необходимой математике и математике ссылки на оригинальные источники, например, в этом случае Кен Шоймакс отлично разбирается в поворотах.

PS: Это почти дубликат , он содержит также некоторую информацию о матричной математике, точно так же как ответ @ theodox .

Я бы предложил использовать NumPy или эквивалентные библиотеки для математики, так как они сильно оптимизированы и реализованы различные функции и операторы.

Чтобы решить матричное и векторное умножение в python, допустим:

  • Векторы представляют собой 1-D списки и обрабатываются как векторы столбцов
  • Матрицы представляют собой двумерные списки, где m [R] [C] обозначает элемент в строке R и Cth column

Тогда произведение rot_matrix * some_vector равно

 [ sum([m * v for m, v in zip(m_column, some_vector)]) for m_column in rotation_matrix ] 

Некоторые удобные ссылки: zip – manual , Python List Comprehension

  • Как разбить вектор на столбцы - используя PySpark
  • SWIG-упаковка C ++ для Python: перевод списка строк в вектор STL строк STL
  • Python: дифференцирование между векторами строк и столбцов
  • Итерация через искровой RDD
  • Python - векторы скорости и ускорения в определенных точках
  • строка 60, в make_tuple return tuple (l) TypeError: iter () возвращен неитератор типа 'Vector'
  • Передача списка Python на вектор C ++ с использованием Boost.python
  • python + maya: Повернуть ось Y вдоль вектора
  • SWIG-обернутый вектор векторов (C ++ to python) - как распознать внутренний вектор как прокси-объект?
  • Python - лучший язык программирования в мире.