У меня есть простая реализация кватерниона для вращения объекта. Если я создам два кватерниона, представляющих вращения вокруг одного и того же вектора, выровненного по оси (т. е. вдоль оси X, Y или Z), результат будет таким же, как одиночное вращение по сумме их величин (т. е. вращение на PI/2, затем PI /2 снова совпадает с вращением на PI). Это хорошо.
Как только ось вращения не выровнена по осям, конкатенации отклоняются от ожидаемых (поворот на PI/2, затем снова PI/2 не совпадает с вращением на PI). Это не хорошо.
После изучения моего кода в течение пары дней я не вижу ничего плохого, поэтому позвольте мне спросить сейчас: я каким-то образом принципиально неправильно понимаю, как работают кватернионы? Я рассуждаю о кватернионах с точки зрения поворота оси на угол, который они представляют, потому что, честно говоря, я не совсем понимаю кватернионы.
Если нет, можете ли вы взглянуть на мой код? :-) Я только что отправил все это (написанное на Java — я ориентируюсь на Android) на GitHub: https://github.com/wtracy/quaternions В каталоге Quaternions находится проект Eclipse. (Вам не нужно, чтобы Eclipse что-то читал, но это удобно.) Класс quaternion находится в папке src/. В папке test/ находятся тесты JUnit и заглушки классов, необходимых для запуска моего класса Quaternion.
Я сделал все возможное, чтобы сделать мой код и тесты простыми для понимания. Я чувствую себя глупо, прося Интернет найти ошибку в моем коде, но у меня нет идей. :-П