Учитывая произвольную матрицу преобразования 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 все, что вы хотите, используя их.
Однако, чтобы матрица представляла вращение, должно быть верно следующее:
- dotProduct (objx, objy) == 0
- dotProduct (objx, objz) == 0
- dotProduct (objx, objz) == 0
- dotProduct (objx, objx) == 1
- dotProduct (objy,objy) == 1
- dotProduct (objz, objz) == 1
- Последний столбец [0, 0, 0, 1]
И отдельные осидолжен быть правильно ориентирован (так что вы можете быть уверены, что это не «зеркальная» матрица).Точная ориентация зависит от вашего приложения.Может быть что-то вроде этого:
- crossProduct (objy, objx) == objz
- crossProduct (objx, objz) == objy
- crossProduct (objz, objy) == objx