карданный замок, не может решить кватернионом

Когда устройство поворачивается на некоторую величину, простой куб должен вращаться на ту же величину, но в противоположном направлении. Например, куб должен повернуться на 45 градусов влево, если устройство повернуто на 45 градусов вправо. Или, когда шаг равен 30 градусам, куб должен повернуться на -30 градусов вокруг оси X. Когда рыскание составляет 10 градусов, куб должен повернуться на -10 градусов вокруг оси Z. Я использовал .getRotationMatrixFromVector, а затем getOrientation следующим образом:

if (event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) {

     SensorManager.getRotationMatrixFromVector(
             mRotationMatrix , event.values);
     SensorManager.getOrientation(mRotationMatrix, orientationVals);
     azimuthVal =  (Math.round((Math.toDegrees(orientationVals[0]))*100.0)/100.0);
     pitchVal= (Math.round((Math.toDegrees(orientationVals[1]))*100.0)/100.0);
     rollVal = (Math.round((Math.toDegrees(orientationVals[2]))*100.0)/100.0);}

Но проблема в том, что изменение шага влияет на крен и наоборот, и в результате при вращении устройства вокруг оси X значение щипка меняется -> изменяется крен -> куб вращается не только вокруг X, но и вокруг Y, когда я не это не нужно.

Я просмотрел Интернет, и многие ссылаются на кватернионы как на решение, но как я могу применить кватернионы к своему конкретному приложению, так как мне нужно знать, на сколько градусов устройство поворачивается вдоль оси.


person Nazerke    schedule 11.03.2013    source источник
comment
Вы просто хотите, чтобы куб отражал положение устройства, но только в противоположном направлении?   -  person Hoan Nguyen    schedule 11.03.2013
comment
да, если я правильно вас понял, да, это то, что я хочу сделать   -  person Nazerke    schedule 11.03.2013
comment
Затем просто передайте матрицу минус-вращения вашему методу рисования.   -  person Hoan Nguyen    schedule 11.03.2013
comment
не могли бы вы подробнее рассказать об этом, пожалуйста. Вы имеете в виду использование glRotate?   -  person Nazerke    schedule 11.03.2013
comment
Я не знаком с OpenGl, но если вы используете glRotate для поворота объекта, то да.   -  person Hoan Nguyen    schedule 11.03.2013
comment
Работает ли это для вас?   -  person Hoan Nguyen    schedule 12.03.2013
comment
Нет, я не думаю, что понял тебя полностью. glRotatef(угол, x, y, z). где я помещаю матрицу вращения. Кроме того, я не понимаю, как это решает блокировку карданного подвеса.   -  person Nazerke    schedule 12.03.2013
comment
вот что я сделал: for(int i = 0; i ‹ 16;i++) { mRotationMatrix[i]*=-1; } а затем я передал это своей программе рисования. но он не вращается в противоположном направлении, а ведет себя довольно странно   -  person Nazerke    schedule 12.03.2013
comment
Я почти уверен, что в OpenGl есть какая-то матрица преобразования, которую вы передаете, которая преобразует ваше изображение в соответствии с матрицей. Как я уже сказал, я не знаю openGl и не могу помочь. Прочитайте документ Android о матрице вращения, там есть одно предложение, в котором говорится, что вам не нужно переназначать для OpenGl. Для меня координаты устройства являются функцией времени, и матрицы вращения точно говорят мне, каковы эти координаты по отношению к мировым координатам.   -  person Hoan Nguyen    schedule 12.03.2013


Ответы (1)


Блокировка карданного подвеса происходит, когда вы хотите извлечь (Эйлеровы) углы поворота из матрицы вращения, в основном при некотором конкретном вращении мы теряем степень свободы в уравнении между компонентами матрицы вращения и углами поворота, и фактические углы поворота не могут быть восстановлены,

Таким образом, в вашем коде это может произойти по адресу: SensorManager.getOrientation(mRotationMatrix, ориентацияVals);

Вы должны каким-то образом решить проблему, прежде чем извлекать углы поворота, это можно сделать, изменив компоненты кватерниона, как описано здесь:

http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToEuler/

person user1700988    schedule 23.09.2015