12

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

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

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

但如前所述,这并不能真正稳定地工作。

我读到 OrbitControls 可能是此类任务的更好解决方案。但是 OrbitControls 对对象的垂直旋转有一个“限制”,我需要无限制地旋转我的对象。

所以我的问题是:

1.哪个控制系统更适合我的任务

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

非常感谢!!

问候 - 米萨

4

2 回答 2

30

首先,TrackballControls旋转OrbitControls相机而不是物体。

其次,OrbitControls强制相机up方向,并TrackballControls允许相机倒置旋转。

TrackballControls有一个reset()方法,可以将target(旋转中心)、cameraposition和 cameraup矢量恢复到它们的原始设置。

controls.reset();

上面的代码将恢复原来的position, target, 和up向量。如果需要,您也可以在调用之前更改这些设置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()方法。检查源代码。

三.js r.82

于 2013-09-02T22:50:11.047 回答
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();

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

于 2014-11-07T05:06:23.063 回答