2016-02-03 6 views
1

Я пытаюсь создать матрицу поворота вокруг оси Х, используя GLM :: GTC :: matrix_transform :: поворот:матрица вращения GLM отличается от ожидаемого результата

glm::rotate(glm::mat4f(1.0f), glm::radians(90.f), glm::vec3f(1.f, 0.f, 0.f)); 

Я ожидал, что результирующая матрица будет (поступательные смещения удалены):

1,  0,  0 
0, cos(90), -sin(90) 
0, sin(90), cos(90) 
0,  0,  0 

(смотри, например https://en.wikipedia.org/wiki/Rotation_matrix#Basic_rotations)

Однако результат немного смещен, то есть:

1,   0,   0 
0, 0.9996240, -0.0274121 
0, 0.0274121, 0.9996240 
0,   0,   0 

Я посмотрел https://github.com/g-truc/glm/blob/master/glm/gtc/matrix_transform.inl, и, конечно же, реализация использует странный коэффициент c + (1 - c), который объясняет результаты.

Вопрос сейчас, почему? Почему определение матрицы вращения glm отличается? Какова теория этого?

+0

glm не использует «странный фактор», он использует хорошо известную формулу для поворота вокруг произвольной оси (которая будет просто на основе поворотов при выборе этой конкретной оси). Обратите внимание, что общая формула приведена в той же самой статье wikipedia, которую вы уже связали. Совершенно неясно, что вы делаете, я не могу воспроизвести этот эффект с помощью glm. – derhass

ответ

0

glm осуществление использует this формула из Википедии. следующие строки кода идентичны по формуле:

Result[0][0] = c + (1 - c)  * axis.x  * axis.x; 
Result[0][1] = (1 - c) * axis.x * axis.y + s * axis.z; 
Result[0][2] = (1 - c) * axis.x * axis.z - s * axis.y; 
Result[0][3] = 0; 

Result[1][0] = (1 - c) * axis.y * axis.x - s * axis.z; 
Result[1][1] = c + (1 - c) * axis.y * axis.y; 
Result[1][2] = (1 - c) * axis.y * axis.z + s * axis.x; 
Result[1][3] = 0; 

Result[2][0] = (1 - c) * axis.z * axis.x + s * axis.y; 
Result[2][1] = (1 - c) * axis.z * axis.y - s * axis.x; 
Result[2][2] = c + (1 - c) * axis.z * axis.z; 
Result[2][3] = 0; 

Там нет ничего странного в c + (1 - c), потому что c + (1 - c) * axis.x * axis.x такая же, как c + ((1 - c) * axis.x * axis.x). Не забывайте о приоритете оператора.

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