2017-08-14 88 views
0

我試圖讓一個旋轉的Object3D元素的孫子到lookAt()相機。Three.js更新Object3D的孫子的旋轉

我已經嘗試了很多方法。 Three.js Object3D.lookAt()函數的源代碼明確指出:// This method does not support objects with rotated and/or translated parent(s)

我把它理解爲場景中渲染圖的一部分。我試過複製lookAt()的代碼。

我的結構是這樣Object3D() [旋轉] - >Object3d() - >Object3D() [文網我要面對鏡頭在每一幀]

lookAt(textObject, artistProps) { 
    let m1 = textObject.matrixWorld.clone(); 
    textObject.matrixAutoUpdate = false; 
    m1.lookAt(textObject.localToWorld(textObject.position), Props.camera.position, THREE.Object3D.DefaultUp); 
    textObject.quaternion.setFromRotationMatrix(m1); 
    textObject.matrixWorld.makeRotationFromQuaternion(textObject.quaternion); 
    textObject.matrixWorldNeedsUpdate = true; 
    textObject.updateMatrixWorld(); 
} 

這只是我所試過的例子。很明顯,我的做法是錯誤的。我現在在想,我需要將子對象保留在自己的場景級容器中,以便它們可以獨立於旋轉父級而與世界空間相關聯。

文本網格(孫子Object3D)旋轉實際上沒有發生。它在這種情況下沒有更新。我檢查了文檔,仍然不明白爲什麼它甚至沒有改變任何東西。

在此先感謝您的幫助!

+1

參見[這個答案](https://stackoverflow.com/questions/36156460/why-is-lookat-not-looking-at-specified-vector/36160110#36160110 )。 – WestLangley

回答

0

您可以使用此功能:

var alwaysLookAtCamera = function() { 
    var worldPos = new THREE.Vector3(); 
    if (+THREE.REVISION > 85) { 
     return function (object, camera) { 
      object.onBeforeRender = function() { 
       worldPos.setFromMatrixPosition(object.matrixWorld); 
       object.matrixWorld.lookAt(camera.position, worldPos, THREE.Object3D.DefaultUp); 
       object.modelViewMatrix.multiplyMatrices(camera.matrixWorldInverse, object.matrixWorld); 
       object.normalMatrix.getNormalMatrix(object.modelViewMatrix); 
      }; 
     }; 
    } else { 
     return function (object, camera) { 
      object.onBeforeRender = function() { 
       worldPos.setFromMatrixPosition(object.matrixWorld); 
       object.matrixWorld.lookAt(camera.position, worldPos, THREE.Object3D.DefaultUp); 
      }; 
     } 
    } 
}(); 

像這樣旋轉的父母使用它的對象:(檢查this fiddle

alwaysLookAtCamera(anyObjectFromTheScene, camera); 

基本上,它覆蓋了一個給定對象的matrixWorld在渲染之前。

但是,我不建議使用這個函數,因爲three.js不是像這樣使用的。

檢查WestLangley's answer,爲妥善解決

+0

真是太棒了,非常感謝。我覺得應該用這些信息更新三個文檔... – Alex