Матрица преобразования 4х4 - как узнать центр вращения? - PullRequest
1 голос
/ 29 марта 2012

Как определить центр вращения при произвольной матрице преобразования 4x4?

m = [m11 m12 m13 m14; 
     m21 m22 m23 m24;
     m31 m32 m33 m34; 
     m41 m42 m43 m44]

Ответы [ 2 ]

2 голосов
/ 29 марта 2012

Если вы знаете, что m является чисто матрицей вращения, а не объединением нескольких преобразований разных типов, вы можете найти ось вращения (вектор v), решив следующее уравнение:

mv = v

Это работает, потому что вращение вектора вокруг себя не меняет вектор. (Обратите внимание, что существует несколько решений этого уравнения, но все они отличаются только скалярным коэффициентом.)

К сожалению, если вы не можете быть уверены, что m не включает другие преобразования, я не знаю, сможете ли вы найти ось вращения или даже найти уникальную ось вращения.

0 голосов
/ 29 марта 2012

Учитывая произвольную матрицу преобразования 4x4, как мне найти центр вращения?

Проблема не может быть решена в общем случае, потому что матрица может не представлять вращение.Это может быть матрица проекции, нулевая матрица и т. Д.

Помимо этого вы можете проверить этот ответ .

Ваша матрица представляет преобразование, которое преобразует старую систему координат вновая система координат.


Матрица объектов может быть представлена ​​следующим образом:

objx.x     objx.y     objx.z    0 //m[0][0]..m[0][3] or _11, _12, _13, _14
objy.x     objy.y     objy.z    0 //m[1][0]..m[1][3] or _21, _22, _23, _24
objz.x     objz.y     objz.z    0 //m[2][0]..m[2][3] or _31, _32, _33, _34
objpos.x   objpos.y   objpos.z  1 //m[3][0]..m[3][3] or _41, _42, _43, _44

Где m [] [] и _11 .._ 44 - соответствующие элементы D3DMATRIX, objpos - объектвектор положения, objx - вектор объекта x («локальный x» преобразован в мировое пространство) и т. д.

Так, пока последний столбец (m [0..3] [3]) равен 0, 0, 0, 1 вы можете извлечь из матрицы положение объекта и его векторы "x", "y", "z" ("side", "up", "front" - что зависит от приложения). Если последний столбецне «0, 0, 0, 1», тогда это матрица проекции, и вы не можете легко извлечь из нее данные объекта.


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

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

  1. dotProduct (objx, objy) == 0
  2. dotProduct (objx, objz) == 0
  3. dotProduct (objx, objz) == 0
  4. dotProduct (objx, objx) == 1
  5. dotProduct (objy,objy) == 1
  6. dotProduct (objz, objz) == 1
  7. Последний столбец [0, 0, 0, 1]

И отдельные осидолжен быть правильно ориентирован (так что вы можете быть уверены, что это не «зеркальная» матрица).Точная ориентация зависит от вашего приложения.Может быть что-то вроде этого:

  1. crossProduct (objy, objx) == objz
  2. crossProduct (objx, objz) == objy
  3. crossProduct (objz, objy) == objx
...