2014-02-07 40 views
0

我在three.js中實現了一個模型查看器,其中兩個場景是疊加的。主場景中的對象使用TrackballControls進行控制。疊加場景中的對象使用不受任何控制類別控制的單獨相機進行投影。我這樣做是爲了允許主場景中的對象縮放,旋轉和平移覆蓋場景中的對象以模擬旋轉(通過重繪對象,因爲應該顯示與xy軸平行的平面以外的任何內容)。我連續渲染了這兩個場景,如下所示:在兩個場景中使用TrackballControls

this.renderer.render(this.scene, this.camera); 
this.renderer.clear(false, true, false); 
this.renderer.render(this.overlayScene, this.overlayCamera); 

大多數情況下工作正常。我遇到的問題是,當我重繪覆蓋場景中的對象時,它與主場景中的旋轉不同步。我試圖在覆蓋場景中使用TrackballControls,但這似乎使得重繪對象變得更加困難。有沒有比使用兩個場景來實現相同目標更好的方法?如果使用兩個場景是最好的方法,我怎樣才能保持兩個場景同步?

+0

如果我明白你的問題是正確的,我曾經有同樣的問題。我用兩個場景解決了這個問題,但是對於第二個場景,攝像機是靜態的,並且與主場景攝像機處於相同的起始位置。現在,如果控制對象的(凸輪)旋轉等於疊加場景凸輪旋轉,則通過您使用的任何控制移動主場景中的凸輪,請檢查疊加場景。如果沒有,我用newMat4.extractRotation()來獲取mainCam的旋轉矩陣,然後轉置這個旋轉矩陣。然後我使用obj.setFromRotationMatrix在我想以INVERSE方式旋轉的對象上。 – GuyGood

回答

0

如果我理解你的問題是正確的,我曾經有過同樣的問題。我用兩個場景解決了這個問題,但是對於第二個場景,攝像機是靜態的,並且與主場景攝像機處於相同的起始位置。現在,如果控制對象的(凸輪)旋轉等於疊加場景凸輪旋轉,則通過您使用的任何控制移動主場景中的凸輪,請檢查疊加場景。如果不是,我用rotMatrix.extractRotation()來獲得mainCam (Three.Matrix4())的旋轉矩陣,然後轉置這個旋轉矩陣。

if (!controls.object.rotation.equals(camRot)) 
    camRot.copy(controls.object.rotation); 
    rotMatrix.extractRotation(controls.object.matrix); 
    rotMatrix.transpose(); 
    someObject.rotation.setFromRotationMatrix(rotMatrix); 

其中

var camRot = new THREE.Euler(); 
var rotMatrix = new THREE.Matrix4(); 

是:我然後我想在相反的方式旋轉對象(一個或多個)上使用obj.setFromRotationMatrix。 不知道是否有一個更簡單的解決方案,或者如果數學在某些邊緣情況下有點錯誤,但這種方式,我的場景保持同步,一切適用於我:)