7

我想要实现的是有两种控制模式,一种是自由的“飞行”模式,一种是以对象为中心的模式(轨迹球),按下按钮可以在它们之间无缝切换。

我最初尝试使用 TrackBallControls 和 FlyControls。这两者的问题在于 TrackballControls 基于欧拉角,而 FlyControls 基于四元数。我尝试通过执行将 camera.rotation 向量转换为四元数,

quaternion.setFromEuler( target ); //where target, a Vector3 that contains degrees

并手动设置位置(因为他们使用相同的位置对象),虽然它似乎正在工作,但稍微旋转相机 - 并切换控制,开始产生可怕的错误结果。此外,从四元数 (setEulerFromQuaternion) 中获取欧拉角会导致错误数据。

所以,虽然我能够在它们之间切换,但我永远无法同步它们的旋转坐标,所以当相机位置正确时“打开”,旋转是错误的。

PS。我对 FirstPersonControls(欧拉角)也有一些结果,但是它使用的屏幕 lat,long 方法很容易出错,并且在 Z 轴旋转时完全失败。

4

2 回答 2

14

这样的事情呢?

function onClick() {

    var prevCamera = camera;

    camera = new THREE.PerspectiveCamera(...);
    camera.position.copy( prevCamera.position );
    camera.rotation.copy( prevCamera.rotation );

    var MODE = { TRACKBALL: 0, FLY: 1 };

    switch( mode ) {

        case MODE.FLY:

            controls = new THREE.TrackballControls( camera );

            mode = MODE.TRACKBALL;

            break;

        case MODE.TRACKBALL:

            controls = new THREE.FlyControls( camera );

            mode = MODE.FLY;

            break;

    }

}
于 2012-07-03T10:59:58.793 回答
1

制作一个新相机是解除所有使用之前控件设置的键盘/鼠标事件的最简单方法。如果您不这样做,您将在飞行模式打开时触发轨道控制事件。

于 2018-01-21T21:10:14.630 回答