Я ищу способ определить, смотрит ли камера (a
) в том же направлении, что и конкретный объект (b
).
Я работаю только с поворотами, потому что здесь нас не волнуют положения (поэтому мы можем считать, что оба они расположены в начале координат).
Я работаю с кватернионами, используя gl-матрицу.
После многих поисков и тестов я понял, что могу определить «расстояние» (величину?) между двумя кватернионами, используя скалярное произведение.
var a = quat.create();
quat.rotateY(a, a, Math.PI);
var b = quat.create();
quat.rotateY(b, b, Math.PI);
quat.dot(a, b)
Это хорошо работает во многих случаях (возвращает число в диапазоне [0..1]: от 1
, если оба смотрят в одном направлении, до 0
, если оба смотрят в противоположные стороны).
Однако в моем случае я не хочу заботиться о «прокрутке» между объектами. Я имею в виду, что камера (a
) может быть перевернута относительно (b
), но все равно смотреть в ту же точку.
Например, если я поверну b
на 180 градусов вокруг Z, я получу скалярное произведение, которое будет около 0
, хотя оно все еще смотрит в том же направлении.
var a = quat.create();
quat.rotateY(a, a, Math.PI);
var b = quat.create();
quat.rotateY(b, b, Math.PI);
quat.rotateZ(b, b, Math.PI);
quat.dot(a, b);
Я пробовал много вещей, таких как умножение обратного числа a
на b
или [s]lerp
, но я все еще не могу получить ничего, что соответствовало бы моим требованиям.
Конечно, я не могу просто отделиться и работать с абсолютной осью Z, потому что здесь все относительно, поэтому крен может быть вокруг любой оси.
Как я могу получить этот результат?
РЕДАКТИРОВАТЬ: благодаря ответу LutzL, вот как я реализовал решение:
var r = quat.create();
quat.invert(r, a);
quat.multiply(r, r, b);
var distance = r[3]*r[3] - r[0]*r[0] - r[1]*r[1] + r[2]*r[2];