Повернуть кватернион / изменить ось, вокруг которой он вращается

Концептуально кватернион может хранить вращение вокруг оси на некоторый градус. Теперь, каков численно самый надежный и наименее трудоемкий способ вращения оси?

Например, когда у меня есть кватернион, который поворачивается на 90 градусов вокруг оси Y, и я хочу, чтобы эти 90 градусов применялись к какой-то другой произвольной оси, описываемой нормализованным вектором.

Обновлено: Поскольку это также возникло, я добавил ответ о том, как правильно изменить ось, вокруг которой кватернион вращается с другим кватернионом.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
2 677
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Немного неясно, какова ваша реальная цель, делая то, что вы описываете.

Чтобы на самом деле сохранить угол, но изменить ось, вы должны использовать 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.

Спасибо за ответ, я не знал о ToAngleAxis. Первое решение решает проблему, которую я описал. Но второй неверен, так как он не будет «вращать» первую ось кватернионов, а просто применит сначала вращение вокруг оси x, а затем someRotation после, someRotation все еще находясь на своей оси.

T. Grumser 11.12.2020 11:42

Вторая часть делает именно то, что я говорю: она вращает существующее вращение. Вроде добавления дополнительного поворота к уже существующему ;) См. Кватернионный оператор *. Очевидно, что он не редактирует существующие повороты, а возвращает новый в результате объединения обоих поворотов;)

derHugo 11.12.2020 15:33

Я просто хотел указать, что первое и второе решение не приведут к одному и тому же результату. Но в этом разговоре, похоже, не хватает твердых терминов, чтобы описать то, что мы хотим сказать. Потому что для меня «вращение кватерниона» означает изменение его оси вращения, а не добавление еще одной сверху, но, поскольку я как бы придумал этот термин, вероятно, нет смысла обсуждать это дальше.

T. Grumser 11.12.2020 18:50

Об этом есть несколько сообщений, я опубликовал то, что я нашел, что сработало для меня в этом вопросе: stackoverflow.com/questions/39040325/…

aheigins 22.11.2022 12:34

Решение @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);

Что здесь происходит, так это то, что мы сначала поворачиваем назад к нашей желаемой оси, затем применяем вращение, которое мы хотим использовать, а затем возвращаем вращение, которое мы изначально применили.

ПРИМЕЧАНИЕ. Я совершенно уверен, что выражение «повернуть кватернион» не является допустимым термином, когда речь идет об этих операциях с кватернионом.

Другие вопросы по теме