2016-02-12 5 views
1

Я пытаюсь перенести некоторый код из Autodesk FBX SDK, чтобы вместо этого использовать glm. Autodesk SDK имеет класс с именем FbxAMatrix (FBX матрица аффинных класс - похож на glm::mat4), который обеспечивает Funtion:Установить вращение матрицы в glm :: mat4

void SetR(const FbxVector4& pR); /* Set matrix's Euler rotation. X, Y and Z rotation values expressed as a vector. The rotation transform is constructed in rotation order XYZ. */ 

Эта функция предполагается установить ротацию - в то время как glm::rotate() будет просто повернуть матрицу. По моему мнению, это две разные операции - и если я запускаю обе функции с одинаковыми входами, результат тоже отличается. Такая же проблема возникает, если я попытаюсь использовать glm::eulerAngleXYZ() вместо этого.

IdentityMatrix:

{ 1, 0, 0, 0 } 
{ 0, 1, 0, 0 } 
{ 0, 0, 1, 0 } 
{ 0, 0, 0, 1 } 

RotationVector:

{ 15 } 
{ 0 } 
{ 0 } 

FbxAMatrix :: IdentityMatrix.SetR (RotationVector):

{ 1, 0, 0, 0 } 
{ 0, 0.96592582628906831, 0.25881904510252074, 0 } 
{ 0, 0.25881904510252074, 0.96592582628906831, 0 } 
{ 0, 0, 0, 1 } 

GLM :: поворот (IdentityMatrix, 1.0f, RotationVector):

{ 1, 0, 0, 0 } 
{ 0, 0.540302277, 0.841470957, 0 } 
{ 0, 0.841470957, 0.540302277, 0 } 
{ 0, 0, 0, 1 } 

GLM :: eulerAngleXYZ (RotationVector):

{ 1, 0, 0, 0 } 
{ 0, 0.759687901, 0.650287867, 0 } 
{ 0, 0.650287867, 0.759687901, 0 } 
{ 0, 0, 0, 1 } 

Так что мой вопрос: Как я могу установить вращение матрицы с GLM (чтобы получить smiliar результаты FbxAMatrix.SetR(RotationVector))? Если нет доступной функции, я хотел бы понять разницу между вращением матрицы идентичности и установить вращение идентичной матрицы.

ответ

1

glm::eulerAngleXYZ делает именно то, что вам нужно. Проблема в том, что ваша функция autodesk работает со степенями и glm с радианами. Вы можете видеть, что числа не-единицы в FbxAMatrix::SetR разделе синус и косинус 15 градусов, и номера в glm::eulerAngleXYZ являются синус и косинус 15. Таким образом, чтобы иметь необходимый эквивалент вы бы использовать:

glm::eulerAngleXYZ(
    x/180 * PI, 
    y/180 * PI, 
    z/180 * PI 
); 

в ваш случай x=15 и y=z=0.