11

有谁知道是否/如何修改轨迹球控件以保持水平,但仍允许您围绕对象旋转?

通过将axis.x 和axis.z 设置为0,它会停止滚动,但也会停止在对象上旋转的能力。

轨道控制接近我正在寻找的,但没有平移的能力。

有什么帮助吗?

4

3 回答 3

5

自从提出这个问题以来已经有一段时间了,但是我遇到了同样的问题并且在网上没有找到太多讨论,所以我想我会发布我的解决方案。

如果你必须使用 TrackballControls 并且你想要一个平坦的地平线,你可以简单地编辑 TrackballControls.js 库,在 'this.rotateCamera' 方法的末尾添加以下行

this.object.up = new THREE.Vector3(0,1,0); 这会将相机向上方向锁定在 (0,1,0) 方向(即 y 方向)。整个修改后的方法函数将显示为:

this.rotateCamera = function () {

var angle = Math.acos( _rotateStart.dot( _rotateEnd ) / _rotateStart.length() / _rotateEnd.length() );

if ( angle ) {

    var axis = ( new THREE.Vector3() ).crossVectors( _rotateStart, _rotateEnd ).normalize();
        quaternion = new THREE.Quaternion();

    angle *= _this.rotateSpeed;

    quaternion.setFromAxisAngle( axis, -angle );

    _eye.applyQuaternion( quaternion );
    _this.object.up.applyQuaternion( quaternion );

    _rotateEnd.applyQuaternion( quaternion );

    if ( _this.staticMoving ) {

        _rotateStart.copy( _rotateEnd );

    } else {

        quaternion.setFromAxisAngle( axis, angle * ( _this.dynamicDampingFactor - 1.0 ) );
        _rotateStart.applyQuaternion( quaternion );

    }

}

// Lock the camera up direction
this.object.up = new THREE.Vector3(0,1,0);

};
于 2015-12-10T18:25:28.247 回答
0

这似乎对我有用,仍在研究它背后的数学。[编辑] 我camera.lookAt(someObj)先用,然后这个。

camera.rotation.z = Math.sin(camera.rotation.y)/3.5
于 2012-11-22T05:32:37.837 回答
0

WestLangley 评论为基础,在 OrbitControls 上启用screenSpacePanning,为您提供与 TrackballControls 相同的功能,无需滚动。

  let controls = new THREE.OrbitControls(camera);
  controls.screenSpacePanning = true;
于 2019-09-19T12:48:25.877 回答