Рассчитать угол между двумя трехмерными векторами

Примечание: я абсолютно не имею понятия о математике, особенно в 3D.

В настоящее время я работаю над некоторым кодом Javascript, который определяет, является ли палец, захваченный контроллером скачка движения, расширенным (то есть полностью прямым) или нет.

Leap Motion предоставляет нам API, который дает нам объект для рук, пальцев и костей. В частности, кости имеют несколько свойств, таких как векторы положения, векторы направления и т. Д., См. Здесь документацию.

Моя идея состояла в том, чтобы взять дистальный фаланг (кончик пальца) и проксимальный фаланг (первую кость пальца), вычислить угол между ними, получив точечное произведение двух векторов направления костей, а затем решить, является ли он прямым или нет. Вот так по сути:

var a = hand.indexFinger.distal.direction();
var b = hand.indexFinger.proximal.direction();
var dot = Leap.vec3.dot(a,b);
var degree = Math.acos(dot)*180/Math.PI;

Проблема здесь в том, что эти значения ненадежны, особенно если другие пальцы двигаются. Кажется, что направление Векторы костей меняются, когда другие пальцы меняют направление (???).

Например, когда все мои Пальцы вытянуты, значение степени примерно равно 0 и колеблется от -5 до 5. Когда я делаю кулак, значение возрастает до 10, 15, 20. Регистрация значений направления Векторы показывает что они действительно меняются, но как это имеет смысл? Палец не двигается, поэтому его направление должно оставаться прежним.

Еще хуже для большого пальца, значения не складываются там вообще. Удлиненный большой палец может получить значения, подобные IndexFinger, но при повороте большого пальца вверх или вниз изменяется в пределах 60 градусов!

Вместо этого я попытался использовать позиционные значения, что дает мне результаты NaN, потому что значения кажутся большими.

Итак, мой вопрос: как я могу надежно рассчитать угол между двумя векторами? Что мне здесь не хватает?

2 ответа

Решение

Правильная формула

cos(angle) = dot(a,b)/(norm(a)*norm(b))

где norm является евклидовой нормой или длиной.

Вы должны были получить неправильный результат, но длины a и b должны быть постоянными, поэтому результат должен был быть последовательно неправильным...

Точечное произведение - это косинус угла между векторами, если эти векторы нормализованы. Поэтому убедитесь, что a и b нормализованы до вычисления точечного произведения

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