首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >切换三个FlyControls控件(从TrackBall到FlyControls,反之亦然)

切换三个FlyControls控件(从TrackBall到FlyControls,反之亦然)
EN

Stack Overflow用户
提问于 2012-07-03 13:29:55
回答 2查看 4.5K关注 0票数 7

我试图实现的是有两种控制模式,一种是自由的“飞行”模式,另一种是以对象为中心的模式(轨迹球),只需按一下按钮就可以在这两种模式之间无缝切换。

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

代码语言:javascript
复制
quaternion.setFromEuler( target ); //where target, a Vector3 that contains degrees

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-03 18:59:59

像这样的怎么样?

代码语言:javascript
复制
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;

    }

}
票数 13
EN

Stack Overflow用户

发布于 2018-01-22 05:10:15

创建新摄影机是解除绑定使用以前的控件设置的所有键盘/鼠标事件的最简单方法。如果你不这样做,你会在飞行模式下触发orbitcontrol事件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11304998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档