three.js和TrackballControls - 保持地平线

时间:2013-01-10 18:44:06

标签: three.js webgl

我正在尝试修改TrackballControls.js,使其旋转类似于OrbitControls.js,其中地平线保持平坦,但保持在场景上旋转的能力(特别是collada建筑模型)。我一直试图在一天的大部分时间里弄清楚这一点,但我是一名设计师,而不是一名程序员。 :-)我甚至不确定我是否应该关注this.rotateCamera和/或this.update。

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

非常感谢任何帮助。

1 个答案:

答案 0 :(得分: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);

};