2015-04-02 80 views
1

注意:我完全不知道矢量數學問題,特別是在3D中。計算兩個3D矢量之間的夾角

我目前正在研究一些Javascript代碼,它決定了一個被Leap Motion控制器捕獲的手指是否被擴展(即完全直線)。

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。 Vector的方向顯示它們確實發生了變化,但這是否有意義呢?手指不動,所以它的方向應該保持不變。

對於拇指來說更糟糕的是,這些值根本不會加起來。一個擴展的拇指可以得到類似於IndexFinger的值,但是向上或向下旋轉拇指的範圍是60度!

我試過使用位置值而不是,這給了我NaN的結果,因爲值看起來很大。

所以,我的問題是:我怎樣才能可靠地計算兩個矢量之間的角度?我在這裏錯過了什麼?

回答

0

正確式是

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

其中norm是歐幾里得範數或長度。

你應該得到一個錯誤的結果,但a和b的長度應該是恆定的,所以結果應該是一致的錯......

0

點產品的角度,如果這些向量是向量之間的餘弦標準化。所以要確保a和b在計算點積之前被歸一化

+0

是的,你是對的,忘了提及它。方向向量被歸一化,或者說,當我再次歸一化向量時沒有區別。 – DodgerThud 2015-04-02 09:33:04