计算两个3D矢量之间的角度

时间:2015-04-02 08:20:06

标签: javascript math vector geometry leap-motion

注意:我对矢量数学完全没有任何线索,特别是在3D中。

我目前正在开发一些Javascript代码,用于确定Leap Motion控制器捕获的Finger是否被扩展(即完全笔直)。

Leap Motion为我们提供了一个API,它为我们提供了手,手指和骨骼的对象。骨骼特别具有几个属性,例如位置矢量,方向矢量等,请参阅here for the Documentation

我的想法是采取远端Phalang(手指尖)和近端Phalang(手指的第一个骨头),通过获取骨骼的两个方向矢量的点积来计算它们之间的角度,然后决定是否它是直的还是没有。像这样,基本上是:

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 个答案:

答案 0 :(得分:0)

正确的公式是

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

其中norm是欧几里德范数或长度。

你应该得到一个错误的结果,但a和b的长度应该是不变的,所以结果应该一直是错误的......

答案 1 :(得分:0)

如果这些向量被归一化,则

点积是向量之间角度的余弦。因此,在计算点积

之前,请确保a和b已归一化