Android — Как вращать QQuaternion по двум осям

Я работаю с qglwidget и различными жестами для приложения для Android, и тема Quaternions полностью сбивает с толку, так что в основном это были предположения и проверки. Я был в состоянии сделать поворот вокруг одной оси на некоторое количество градусов, используя:

rotation=QQuaternion::fromAxisAndAngle(QVector3D(1,0,0),delta.y())*rotation;

Это дает желаемые результаты, как и то же утверждение в направлении х.

Мой вопрос, например, является ли правильный способ сделать вращение? И во-вторых, если я хочу вращаться на двух осях, я просто делаю:

rotation=QQuaternion::fromAxisAndAngle(QVector3D(1,0,0),delta.y())*rotation;
rotation=QQuaternion::fromAxisAndAngle(QVector3D(0,1,0),delta.x())*rotation;

Или есть однострочный оператор, который будет работать так же хорошо?

2

Решение

Да, вы делаете это правильно, однострочного утверждения нет 🙂

В 3D-приложениях очень распространено создание кватерниона из набора углов Эйлера, и мы делаем это, просто умножая вместе самые основные повороты, поскольку в любом случае вычисление довольно дешево (если вы не выполняете много из них, и определяется путем профилирования, что эта часть имеет решающее значение для производительности). Например, если вы используете соглашение Z-X-Z (как показано на первом рисунке Вот ), то вы бы написали:

QQuaternion rotation =
QQuaternion::fromAxisAndAngle(QVector3D(0,0,1), alpha) *
QQuaternion::fromAxisAndAngle(QVector3D(1,0,0), beta) *
QQuaternion::fromAxisAndAngle(QVector3D(0,0,1), gamma);

где alpha, beta а также gamma являются double значения, представляющие углы в градусах (будьте осторожны, а не в радианах).

Примечание: вы можете создать однострочник самостоятельно, обернув его в свой собственный метод:

static QQuaternion fromEuler(double alpha, double beta, double gamma);
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]