使用的控制器是threejs轨迹球控制器TrackballControls,默认左键转动,滚轮缩放,右键平移,通过查阅文档,我们可以通过以下代码来修改鼠标操作:
controls = new TrackballControls(camera, renderer.domElement);
controls.mouseButtons = {
//左键平移
LEFT: THREE.MOUSE.PAN,
//滚轮滑动
MIDDLE: THREE.MOUSE.DOLLY,
//右键旋转
RIGHT: THREE.MOUSE.ROTATE,
};
现在我的需求是:
- 鼠标左键无作用;
- 按下鼠标滚轮平移模型,滚动鼠标滚轮缩放模型;
- 按下鼠标右键转动模型。
左右键还好说,鼠标滚轮该怎么办呢?没办法只能去看控制器的源码。
可以看到,这里定义了6种不同的状态,现在还不知道是干嘛的,接着往下看:
在onMouseDown方法中,根据不同的按键修改了_state的值:
首先我们知道,onmousedown事件中,button为0、1、2时分别代表按下了左键、滚轮、右键,正好上面这个方法是通过判断event.button的值来执行不同的操作的,我在按下左键时,把_state改为它上面定义的NONE,左键是不是就没有作用了呢?试一下,我将代表左键的0赋给NONE:
(需要先在项目中新建TrackballControls.js并将源码粘进去,通过相对路径的方式引入,不要直接从three引入,不然不生效)
// 原来的
// const STATE = {
// NONE: -1,
// ROTATE: 0,
// ZOOM: 1,
// PAN: 2,
// TOUCH_ROTATE: 3,
// TOUCH_ZOOM_PAN: 4,
// };
// 修改后
const STATE = {
NONE: 0,
ROTATE: 2,
ZOOM: -1,
PAN: 1,
TOUCH_ROTATE: 3,
TOUCH_ZOOM_PAN: 4,
};
再将方法中的_state也改为NONE:
function onMouseDown(event) {
console.log("鼠标---", event.button);
if (_state === STATE.NONE) {
switch (event.button) {
case scope.mouseButtons.LEFT:
// _state = STATE.ROTATE;
_state = STATE.NONE;
break;
case scope.mouseButtons.MIDDLE:
// _state = STATE.ZOOM;
_state = STATE.PAN;
break;
case scope.mouseButtons.RIGHT:
// _state = STATE.PAN;
_state = STATE.ROTATE;
break;
}
}
......
本来用于转动的左键真的没有作用啦!以此类推,把其他两个键也改了试试,真的生效啦!