2013-03-27 61 views
0

因此,這裏是three.js主人的矢量,矩陣,旋轉,四元數問題!three.js父親子目標跟蹤

我有一個父對象在position(0,0,275)direction(0,0,-1),+ y和rotation(0,0,0)

連接到母體是關係的子對象:

rel_position(.5, 0, 0) 
rel_rotation(0, 0, 0) 

我也有一個目標在場景:

position(0, 100, 0) 

考慮船舶(父)與俯仰,偏航和滾轉。它有一個帶有俯仰和偏航的炮塔(小孩)。炮塔需要以給定的轉速(弧度/秒)跟蹤目標。

我花了5天試圖獲得一個適當的跟蹤算法。我能做的最好的辦法就是手動刪除父母和孩子的matrixAutoUpdate功能,更新矩陣。然後使用child.matrixWorld爲當前的子輪換創建旋轉矩陣或四元數。然後我可以創建一個輔助Object3D,它從子位置查看目標。我可以在孩子和輔助Object3D之間區別,並以rad/s爲基礎來取代四元數。但是,當我添加滾動到父項或目標被旋轉到八分圓(+, +, +)之外時,子旋轉(或四元數)計算會導致滾動旋轉。

任何方向上的一個孩子Object3D的跟蹤算法將非常感激。我的即將開展的項目將引用您的努力。

謝謝你的時間!

回答

1

也許lookAtworldToLocal方法的某些組合會起作用?既然你需要到目標物體的位置轉換成炮塔局部座標,然後相應地更改炮塔的轉動,這個怎麼樣:

turret.lookAt( turret.worldToLocal(target.position.clone()) ) 
+0

獲取建議!我採取了類似的方法來解決昨天發現的最終解決方案。我會嘗試你的代碼,看看我是否可以實現一個變體,因爲它比我的解決方案更優雅。見下文! – 2013-03-28 13:44:28

3

因此,這裏的答案! @Stemkoski,感謝您的指導。我採取了類似的方法來解決昨天發現的最終解決方案。由於反轉矩陣,這在計算能力上有點昂貴,但是效果很好。首先,如下創建一個新的矩陣:

var m = new THREE.Matrix4().getInverse(parent.matrix).multiply(target.matrix); 

此旋轉XYZ軸到新座標的參考幀X'Y'Z」基於父對象的旋轉。結果是X'Y'Z'參考幀中目標的Object3D矩陣。現在,通過從矩陣「M」創建一個新的Vector3我們使用可以得到一個相對位置:

var rel_pos = new THREE.Vector3().getPositionFromMatrix(m, 'XYZ'); 

現在創建一個虛假的對象在目標從孩子(炮塔)的位置

var child_faux = new THREE.Object3D(); //can be created outside the loop 
child_faux.position.copy(child.position); //copy the child local position 
child_faux.lookAt(rel_pos);  //look at the target 
child_faux.updateMatrix();  //Update the Matrix4 element for use in a second 
直視

最後,通過設置child_fuax來查看對象,我們已經自動設置了child_faux.rotation。我們可以通過以下獲得當前child.rotation和child_faux.rotation之間的相對旋轉(+或 - )

var diff = turret_target.rotation.sub(turret.rotation); 

從這裏我們可以設置一個簡單的算法,使轉動架(x和y)直到diff(x和y)變爲0。

var trackrate = .2 * delta; 
var diff = turret_target.rotation.sub(turret.rotation); 
turret.rotation.x += diff.x/Math.abs(diff.x) * trackrate; 
turret.rotation.y += diff.y/Math.abs(diff.y) * trackrate; 
turret.updateMatrix(); 

在那裏,我們有...在父組中旋轉的子對象的目標跟蹤算法!謝謝閱讀!