Как узнать, что объект был повернут только на 15 градусов в 3D? - PullRequest
1 голос
/ 30 июня 2011

У меня есть 3D-объект в 3D-пространстве, ориентированный в некоторой ориентации. Как я могу знать, что он был повернут от своего начального вращения q (в углах Эйлера: 0, 0, 0) только в произвольном количестве поворотов на 15 градусов по любой оси. Например, повернутый по оси X на 4 * 15 градусов, по оси Y на 7 * 15 градусов и по оси Z на 13 * 15 градусов. Как я могу это обнаружить?

Я пытался взять углы Эйлера из матрицы вращения объекта, но, похоже, он правильно определяет ситуацию, только если я вращаюсь только по одной оси. Если я начну смешивать повороты оси X, Y и Z на 15 градусов, углы Эйлера будут испорчены.

Я на 100% уверен, что объект был повернут только на 15 градусов.

Ответы [ 4 ]

0 голосов
/ 30 июня 2011

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

0 голосов
/ 30 июня 2011

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

0 голосов
/ 30 июня 2011

Если вы можете, самый простой способ - сохранить оба компонента (float3 m_Translation, m_Rotation, m_Scale) и матрицу, которая обновляется при каждом их изменении (float4x4 m_Matrix). Чтобы получить данные, просто возьмите вектор для этой части и верните его. Использование памяти невелико (12-16 операций с плавающей запятой), а вычислительные затраты минимальны (пересчитать матрицу при обновлении детали).

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

Как отмечено на этой странице, библиотеки D3DX также имеют функцию для разложения матриц: D3DXMatrixDecompose.

0 голосов
/ 30 июня 2011

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

...