Концептуально кватернион может хранить вращение вокруг оси на некоторый градус. Теперь, каков численно самый надежный и наименее трудоемкий способ вращения оси?
Например, когда у меня есть кватернион, который поворачивается на 90 градусов вокруг оси Y, и я хочу, чтобы эти 90 градусов применялись к какой-то другой произвольной оси, описываемой нормализованным вектором.
Обновлено: Поскольку это также возникло, я добавил ответ о том, как правильно изменить ось, вокруг которой кватернион вращается с другим кватернионом.





Немного неясно, какова ваша реальная цель, делая то, что вы описываете.
Чтобы на самом деле сохранить угол, но изменить ось, вы должны использовать Quaternion.ToAngleAxis , изменить ось, а затем передать ее обратно в Quaternion.AngleAxis
например
Quaternion someRotation;
someRotation.ToAngleAxis(out var angle, out var axis);
var newAxis = Vector3.up;
var newRotation = Quaternion.AngleAxis(angle, new axis);
Или вы меняете существующий Quaternion на другой, используя * лайк
Quaternion newRotation = someRotation * Quaternion.Euler(90, 0, 0);
который примет существующее вращение и повернет его на 90° вокруг оси X.
Вторая часть делает именно то, что я говорю: она вращает существующее вращение. Вроде добавления дополнительного поворота к уже существующему ;) См. Кватернионный оператор *. Очевидно, что он не редактирует существующие повороты, а возвращает новый в результате объединения обоих поворотов;)
Я просто хотел указать, что первое и второе решение не приведут к одному и тому же результату. Но в этом разговоре, похоже, не хватает твердых терминов, чтобы описать то, что мы хотим сказать. Потому что для меня «вращение кватерниона» означает изменение его оси вращения, а не добавление еще одной сверху, но, поскольку я как бы придумал этот термин, вероятно, нет смысла обсуждать это дальше.
Об этом есть несколько сообщений, я опубликовал то, что я нашел, что сработало для меня в этом вопросе: stackoverflow.com/questions/39040325/…
Решение @derHugo решает проблему, которую я изначально задал, но секундная часть его ответа не делает того, что он, казалось, описывал. Чтобы повернуть ось вращения кватернионов с другим кватернионом, вам нужно будет применить повороты по-другому.
Например. у вас есть кватернион yQuaternion, который вращается на 90° вокруг оси y и хочет повернуться, его ось вращения на 90° вокруг оси x (что приведет к повороту кватерниона на 90° вокруг оси z) вы бы надо сделать следующее.
// The quaternion, we want to "rotate"
var yQuaternion = Quaternion.Euler(0f, 90f, 0f);
// The quaternion we want to rotate by.
var xQuaternion = Quaternion.Euler(90f, 0f, 0f);
var result = xQuaternion * yRotation * Quaternion.Inverse(xQuaternion);
Что здесь происходит, так это то, что мы сначала поворачиваем назад к нашей желаемой оси, затем применяем вращение, которое мы хотим использовать, а затем возвращаем вращение, которое мы изначально применили.
ПРИМЕЧАНИЕ. Я совершенно уверен, что выражение «повернуть кватернион» не является допустимым термином, когда речь идет об этих операциях с кватернионом.
Спасибо за ответ, я не знал о
ToAngleAxis. Первое решение решает проблему, которую я описал. Но второй неверен, так как он не будет «вращать» первую ось кватернионов, а просто применит сначала вращение вокруг оси x, а затемsomeRotationпосле,someRotationвсе еще находясь на своей оси.