Как рассчитать кватернион относительно повернутой системы координат в Unity 3D?

Я пытаюсь повернуть вектор с помощью кватерниона, построенного с помощью Quaternion.Euler(x,y,z), он работает, как и ожидалось, но проблема в том, что вращение выполняется относительно мировой системы координат, тогда как я хочу повернуть относительно самого вектора.

Итак, я хочу принять систему координат как

z = vector's direction,     
x = vector's perpendicular (any)  
y = world y.

поэтому мой код таков:

myVector = euler * myVector;

однако мне нужно

myVector = localEuler * myVector;

поэтому мне нужно вычислить localEuler как функцию euler и myVector.

Как я могу это сделать ?

Спасибо за любую помощь!

Я попытался :

localEuler = Quaternion.Euler(euler.x * myVector.x ,euler.y * myVector.y ,euler.z * myVector.z );

это не сработало. Я думаю, это точечный продукт.

P.S.

Я думаю, что у этого есть встроенный код для Transforms : Transform.RotateAround(), но мне нужно сделать это с Vector3, а не с Transform.


person jeff    schedule 20.12.2013    source источник


Ответы (1)


Я решил свою проблему.

Мое решение было таким:

  • Используйте 1_;

так, например, чтобы вращаться вокруг «локального» x, rotationAxis должен быть перпендикулярен моему вектору, который вычисляется следующим образом:

var rotationAxis : Vector3 = Quaternion.Euler(0,90,0) * myVector;
rotationAxis.y = 0;

то новый кватернион вычисляется следующим образом:

var localEuler:Quaternion = Quaternion.AngleAxis(euler.x , rotationAxis);

тогда вектор повернут правильно:

myVector = localEuler * myVector;
person jeff    schedule 20.12.2013
comment
Привет, я не понимаю твоего ответа. ось вращения перпендикулярна моему вектору в каком направлении. В конце концов, это трехмерное пространство. - person Boon; 13.07.2014
comment
@Boon да, предложение не полностью определяет перпендикуляр, однако приведенное ниже уравнение объясняет, что оно означает. Вы можете поэкспериментировать с ним и посмотреть, какой перпендикуляр у вас получится. - person jeff; 15.07.2014