Javascript 计算两个三维矢量之间的角度

Javascript 计算两个三维矢量之间的角度,javascript,math,vector,geometry,leap-motion,Javascript,Math,Vector,Geometry,Leap Motion,注:我对向量数学一无所知,尤其是3D 我目前正在编写一些Javascript代码,用于确定被Leap Motion控制器捕获的手指是否被延伸(即完全笔直) Leap Motion为我们提供了一个API,为我们提供了手、手指和骨骼的对象。骨骼尤其具有多个属性,例如位置向量、方向向量等,请参见 我的想法是取远端指骨(指尖)和近端指骨(手指的第一块骨头),通过得到骨头的两个方向向量的点积来计算它们之间的角度,然后确定它是否是直的。就像这样,本质上: var a = hand.indexFinger.d

注:我对向量数学一无所知,尤其是3D

我目前正在编写一些Javascript代码,用于确定被Leap Motion控制器捕获的手指是否被延伸(即完全笔直)

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度范围内发生变化

我尝试过使用位置值,这给了我一个结果,因为这些值看起来太大了

所以,我的问题是:如何可靠地计算两个向量之间的角度?我在这里遗漏了什么?

正确的公式是

cos(angle) = dot(a,b)/(norm(a)*norm(b))
其中,
norm
是欧几里德范数或长度


你应该得到一个错误的结果,但是a和b的长度应该是恒定的,所以结果应该一直是错误的…

如果向量被归一化,点积就是向量之间角度的余弦。因此,在计算点积之前,请确保a和b是标准化的

是的,你是对的,忘了提到它。方向向量是标准化的,或者更确切地说,当我再次标准化向量时,没有区别。