1

我正在尝试修改 TrackballControls.js,使其旋转类似于 OrbitControls.js,其中地平线保持平坦,但保持在场景(特别是 collada 建筑模型)上和周围旋转的能力。我现在大部分时间都在努力解决这个问题,但我是一名设计师,而不是程序员。:-) 我什至不确定我是否应该专注于 this.rotateCamera 和/或 this.update。

(顺便说一句,我只会使用 OrbitControls.js,但它不支持平移,这在查看大型 collada 建筑模型时是必要的。)

任何帮助将非常感激。

4

1 回答 1

0

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

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

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:21:29.033 回答