2015-04-02 5 views
1

Примечание: У меня нет абсолютно никакой информации об векторной математике, особенно в 3D.Рассчитать угол между двумя 3D-векторами

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

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

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

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. Записывая значения направление Vectors показывает, что они действительно меняются, но как это имеет смысл? Пальчик не двигается, поэтому его направление должно оставаться неизменным.

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

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

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

ответ

0

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

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

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

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

0

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

+0

Да, вы правы, забыл упомянуть об этом. Векторы направления нормализованы или, вернее, нет разницы, когда я снова нормализую векторы. – DodgerThud

Смежные вопросы