Я работаю с 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;
Или есть однострочный оператор, который будет работать так же хорошо?
Да, вы делаете это правильно, однострочного утверждения нет 🙂
В 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);
Других решений пока нет …