2017-01-17 18 views
2

Существует setRotateM функции в android.opengl.matrix пакете иКакова математика за функцией setRotateM в android.opengl.matrix?

Преобразования углов Эйлера в матрицу вращения.

Основная часть реализации является:

rm[rmOffset + 0] = cy * cz; 
rm[rmOffset + 1] = -cy * sz; 
rm[rmOffset + 2] = sy; 
rm[rmOffset + 3] = 0.0f; 

rm[rmOffset + 4] = cxsy * cz + cx * sz; 
rm[rmOffset + 5] = -cxsy * sz + cx * cz; 
rm[rmOffset + 6] = -sx * cy; 
rm[rmOffset + 7] = 0.0f; 

rm[rmOffset + 8] = -sxsy * cz + sx * sz; 
rm[rmOffset + 9] = sxsy * sz + sx * cz; 
rm[rmOffset + 10] = cx * cy; 
rm[rmOffset + 11] = 0.0f; 

rm[rmOffset + 12] = 0.0f; 
rm[rmOffset + 13] = 0.0f; 
rm[rmOffset + 14] = 0.0f; 
rm[rmOffset + 15] = 1.0f; 

где cx = cos(angleOnX), sz = sin(angleOnZ) etc.

Эта связка кода даст матрицу 4x4:

[ cy*cz, cx*sz + cx*cz*sy, sx*sz - cz*sx*sy, 0] 
[ -cy*sz, cx*cz - cx*sy*sz, cz*sx + sx*sy*sz, 0] 
[  sy,   -cy*sx,   cx*cy, 0] 
[  0,    0,    0, 1] 

While, учитывая матрицы вращения вокруг оси x, y, z соответственно ectively

Rx = [ 1, 0, 0, 0] 
    [ 0, cx, -sx, 0] 
    [ 0, sx, cx, 0] 
    [ 0, 0, 0, 1] 

Ry = [ cy, 0, sy, 0] 
    [ 0, 1, 0, 0] 
    [ -sy, 0, cy, 0] 
    [ 0, 0, 0, 1] 

Rz = [ cz, -sz, 0, 0] 
    [ sz, cz, 0, 0] 
    [ 0, 0, 1, 0] 
    [ 0, 0, 0, 1] 

Наиболее близкая композицией я смог найти

(Rx * Ry * Rz)^T = Rz^T * Ry^T * Rx^T = 
[ cy*cz, cx*sz + cz*sx*sy, sx*sz - cx*cz*sy, 0] 
[ -cy*sz, cx*cz - sx*sy*sz, cz*sx + cx*sy*sz, 0] 
[  sy,   -cy*sx,   cx*cy, 0] 
[  0,    0,    0, 1] 

Между реализации R андроида и сырым умножение Rxyz^T, существуют небольшие различия в R (1,2) R (1,3) R (2,2) R (2,3), где переключаются cx и sx.

Учитывая, что android.opengl.matrix является широко применяемым, проверенным временем пакетом, я должен был сделать что-то не так.

У меня есть два вопроса: 1. Как это происходит? 2. Почему это (Rx * Ry * Rz)^T? Я полагаю, что это было Rz * Ry * Rx

ответ

-2

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

вопрос 2: он находится в порядке x, y, z, поскольку вращения выполняются в этом порядке (или наоборот).

разница в версии для Android версии может быть из-за того, что gui - левая система.

+0

Не могли бы вы уточнить, где вы это видите? Я не могу найти изменение, которое вы описываете в коде ops. Насколько я понимаю, 'sx' переключается на' cx'. Переход от 'cos (x)' к 'sin (x)' имеет (по моему оппинированию) ничего общего с коммутативным? Если вы ссылаетесь на вопрос 2, это матрицы, которые не являются коммутативными. – BDL

+0

[cy * cz, cx * sz + cx * cz * sy, sx * sz - cz * sx * sy, 0] и cy * cz, cx * sz + cz * sx * sy, sx * sz - cx * cz * sy, 0] –

+0

Я все еще не вижу термина здесь, где только порядок умножения изменился. Они либо идентичны, либо по крайней мере один грех изменился на cos. – BDL

 Смежные вопросы

  • Нет связанных вопросов^_^