我已经阅读了很多关于这两个控件的内容,目前我正在使用TrackballControls。
我需要沿所有三个轴旋转一个物体(两个控件都已经这样做了),但是我还需要手动设置一个新的相机位置/旋转。这并没有真正起作用。
我的解决方法是 禁用轨迹球控制, 获取新位置的四元数对象, 将这些应用于camera.up 然后启用相机
但如上所述,这并不是真正稳定的。
我读到OrbitControls可能是这项任务的更好解决方案。但OrbitControls对物体的垂直旋转有“限制”,我需要无限制地旋转我的物体。
所以我的问题是:
1。哪种控制系统更适合我的任务
2. 如果是轨迹球 - 您将如何手动设置新的相机位置和旋转?如果它是轨道 - 有没有办法禁用这个垂直旋转限制?
非常感谢!!
问候 - Misa
答案 0 :(得分:25)
首先,TrackballControls
和OrbitControls
旋转相机,而不是对象。
其次,OrbitControls
强制执行相机up
方向,TrackballControls
允许相机上下颠倒。
TrackballControls
有reset()
方法,可将target
(旋转中心),相机position
和相机up
矢量恢复为原始设置
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()
方法。检查源代码。
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();
我仍在努力限制范围内的角度,而不是禁用它......