使用带有两个场景的TrackballControls

时间:2014-02-07 17:22:42

标签: three.js

我在three.js中实现了一个模型查看器,其中叠加为两个场景。使用TrackballControls控制主场景中的对象。叠加场景中的对象使用不受任何控件类控制的单独相机进行投影。我这样做是为了允许主场景中的对象进行缩放,旋转和平移以及叠加场景中的对象来模拟旋转(通过重绘对象,因为不应该显示平行于xy轴的平面以外的任何内容)。我依次渲染这两个场景:

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

大部分工作都很好。我遇到的问题是,当我在重叠场景中重绘对象时,它与主场景中的旋转不同步。我尝试在叠加场景中使用TrackballControls,但这似乎使得重绘对象变得更加困难。有没有比使用两个场景更好的方法来实现相同的目标?如果使用两个场景是最好的方法,我怎么能保持两个场景同步?

1 个答案:

答案 0 :(得分:0)

如果我理解你的问题,我曾经遇到过同样的问题。我通过两个场景解决了这个问题但是对于第二个场景,摄像机是静态的并且与主场景摄像机处于相同的起始位置。现在,当您使用的任何控件移动主场景中的凸轮时,如果控制对象的(凸轮)旋转等于叠加场景凸轮旋转,请检查叠加场景。如果没有,我使用rotMatrix.extractRotation()来获取mainCam (Three.Matrix4())的旋转矩阵,然后转换此旋转矩阵。然后我在想要以反向方式旋转的对象上使用obj.setFromRotationMatrix

 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();

是。 不确定是否有更简单的解决方案,或者在某些边缘情况下数学是否有些错误但是这样,我的场景保持同步,一切都适合我:)