2013-05-22 41 views
2

我正在嘗試構建一個可以顯示SkinMesh的骨骼位置和方向的組件,並且遇到了一些障礙。不知何故,我無法確定骨骼的全球位置。獲取骨骼的全球位置

我曾嘗試:

this.updateMatrixWorld(true); 
this.traverse(function (bone) { 
    var twinGlobalPos = new THREE.Vector3().getPositionFromMatrix(bone.matrixWorld); 
    console.log(typeof (bone), "GlobalPos", twinGlobalPos.x, twinGlobalPos.y, twinGlobalPos.z); 
}); 

和明顯的變化上,不幸的是這似乎並沒有工作,所有的骨頭,除了根報告0,0,0的位置。根骨報告與SkinMesh相同的全局位置

我在做什麼錯了?有一些替代方法嗎?

回答

4

好吧,我自己找到了答案。

SkinMesh重載updateMatrixWorld的實現,該實現不對THREE.Bone的任何實例執行更新。相反,它委託給骨骼的更新方法,它維護矩陣'skinmatrix'。

Skinmatrix與worldMatrix類似,但使用SkinnedMesh作爲全局引用而不是場景。結合SkinnedMesh的worldMatrix和骨骼的SkinMatrix似乎可以做到這一點。

this.updateMatrixWorld(true); 
// assuming this is a SkinnedMesh 
var meshGlobal = new THREE.Vector3().setFromMatrixPosition(this.matrixWorld); 
this.traverse(function (bone) { 
    if(bone instanceof THREE.Bone) { 
     var twinGlobalPos = new THREE.Vector3().setFromMatrixPosition(bone.skinMatrix).add(meshGlobal); 
     console.log(typeof (bone), "GlobalPos", twinGlobalPos.x, twinGlobalPos.y, twinGlobalPos.z); 
    } 
}); 

上面的代碼似乎有伎倆。我可以看到爲什麼這個設計被選中,但它確實提出了一個goto,也許覆蓋了THREE.Bone上的localToWorldworldToLocal方法將是一個半解決方案?

0

所選答案可能已過時,因爲在當前版本中現在支持多個動畫。

var twinGlobalPos = new THREE.Vector3().setFromMatrixPosition(bone.skinMatrix).add(meshGlobal); 

現在應該尋找這樣的:

var twinGlobalPos = new THREE.Vector3().setFromMatrixPosition(bone.animationCache.animations[animation.data.name].originalMatrix).add(meshGlobal); 

或因爲人們使用不同版本的three.js所

這行(從安東的代碼)不要編輯原來的答案只是

var twinGlobalPos = new THREE.Vector3().setFromMatrixPosition(bone.position).add(meshGlobal);