Как умножить кватернион на вектор? - PullRequest
1 голос
/ 24 сентября 2019

Я использую CesiumJs

У меня есть кватернион (x, y, z, w) У меня есть вектор (x, y, z)

Я хочу умножить этот кватернион наВектор, в основном на данный момент я делаю вращение, и я хочу умножить это вращение на Вектор вперед (0,0,1), чтобы получить точку в направлении, но у CesiumJ в данный момент нет этих функций..

Я знаю, что есть какой-то способ умножить Vector на Quaternion, я делал это в Unity, но я не знаю точно, как

Я нашел эту формулу v' = q * v * (q^-1), но что именно(q^-1)?

Ответы [ 2 ]

1 голос
/ 24 сентября 2019

Комментарий Marco13 правильный.в Цезии кватернионы обычно преобразуются в матрицы перед умножением на векторы, и для этого существуют встроенные функции.

Вот пример Sandcastle .

var position = new Cesium.Cartesian3(0, 0, 1);  // x, y, z

// Could instead use:
// var position = Cesium.Cartesian3.UNIT_Z.clone();

var quaternion = new Cesium.Quaternion(0.382683, 0, 0, 0.92388);  // x, y, z, w

// Could alternately use:  45 degrees (pi/4 radians) around X
//var quaternion = Cesium.Quaternion.fromAxisAngle(Cesium.Cartesian3.UNIT_X, Math.PI / 4);

var matrix = Cesium.Matrix3.fromQuaternion(quaternion);

var scratch1 = new Cesium.Cartesian3();
var result = Cesium.Matrix3.multiplyByVector(matrix, position, scratch1);

console.log(result);

// Result will be: (0, -0.7071063400800001, 0.7071079759110002)
// The +Z vector was rotated 45 degrees towards -Y, in a counter-clockwise
// rotation as seen from the +X axis.
1 голос
/ 24 сентября 2019

Вы можете «векторизовать» произведение кватернионов, т.е. записать его в терминах векторных операций, таких как скалярное произведение и перекрестное произведение.При этом вы получите формулу, эквивалентную формуле Эйлера-Родрига [1]:

v '= v + 2 * rx (s * v + rxv) / m

, где x представляетперекрестное произведение, s и r - скалярная и векторная части кватерниона соответственно, а m - сумма квадратов компонент кватерниона.

[1] https://en.m.wikipedia.org/wiki/Euler%E2%80%93Rodrigues_formula

...