OrbitControl或TrackballControl

时间:2013-09-02 21:51:43

标签: three.js

我已经阅读了很多关于这两个控件的内容,目前我正在使用TrackballControls。

我需要沿所有三个轴旋转一个物体(两个控件都已经这样做了),但是我还需要手动设置一个新的相机位置/旋转。这并没有真正起作用。

我的解决方法是 禁用轨迹球控制, 获取新位置的四元数对象, 将这些应用于camera.up 然后启用相机

但如上所述,这并不是真正稳定的。

我读到OrbitControls可能是这项任务的更好解决方案。但OrbitControls对物体的垂直旋转有“限制”,我需要无限制地旋转我的物体。

所以我的问题是:

1。哪种控制系统更适合我的任务

2. 如果是轨迹球 - 您将如何手动设置新的相机位置和旋转?如果它是轨道 - 有没有办法禁用这个垂直旋转限制?

非常感谢!!

问候 - Misa

2 个答案:

答案 0 :(得分:25)

首先,TrackballControlsOrbitControls旋转相机,而不是对象。

其次,OrbitControls强制执行相机up方向,TrackballControls允许相机上下颠倒。

TrackballControlsreset()方法,可将target(旋转中心),相机position和相机up矢量恢复为原始设置

controls.reset();

上述代码将恢复原始positiontargetup向量。如果您愿意,也可以在致电controls.reset()之前更改这些内容。

controls.position0.set( 0, 0, 10 ); // set a new desired position
controls.target0.set( 0, 0, 0 ); // set a new target
controls.up0.set( 0, 1, 0 ); // set a new up vector
controls.reset();

阅读reset()函数源代码,以便了解它的作用。

编辑:OrbitControls现在也有reset()方法。检查源代码。

three.js r.82

答案 1 :(得分:0)

强制使用TrackballControls'要仅旋转水平,找到函数getMouseProjectionOnBall的实现并添加一行:

var getMouseProjectionOnBall = (function() {
    var vector = new THREE.Vector3();
    var objectUp = new THREE.Vector3();
    var mouseOnBall = new THREE.Vector3();

    return function(pageX, pageY) {
      mouseOnBall.set(
        (pageX - _this.screen.width * 0.5 - _this.screen.left) / (_this.screen.width * 0.5),
        (_this.screen.height * 0.5 + _this.screen.top - pageY) / (_this.screen.height * 0.5),
        0.0);

      mouseOnBall.setY(0); // add this

      var length = mouseOnBall.length();

我仍在努力限制范围内的角度,而不是禁用它......