代码之家  ›  专栏  ›  技术社区  ›  Hide

三.js鼠标左键单击相机可以平滑地向前移动

  •  0
  • Hide  · 技术社区  · 6 年前

    three.js . 它的概念是有这么多文本的宇宙。我想让相机向前移动鼠标左键点击。另外,在鼠标右键单击时向后移动相机。

    (zoom in/zoom out) 用鼠标滚动。但现在我必须切换到鼠标左/右键点击。

    (如果用户按住鼠标左键,相机必须连续向后移动)

    前面的代码(滚动移动)在这里。

    document.addEventListener('wheel', onMouseWheel, false);
    function onMouseWheel( event ) {
      camera.position.z += event.deltaY * 0.1; // move camera along z-axis
    }
    

    所以,参考它,我把代码改成这样:

    var hold = false;
    
    document.addEventListener('contextmenu', onContextMenu, false);
    document.addEventListener('mousedown', onMouseDown, false);
    document.addEventListener('mouseup', onMouseUp, false);
    
    function onContextMenu(event) { // Prevent right click
      event.preventDefault();
    }
    
    function onMouseDown(event) {
      hold = true;
      switch (event.which) {
        case 1: // if left click
          moveForward();
          break;
        case 3: // if right click
          moveBackward();
          break;
      }
    }
    
    function onMouseUp(event) {
      console.log('mouse up');
      hold = false;
    }
    
    function moveForward() {
      while (hold === true) {
        camera.position.z -= 0.1;
      }
    }
    
    function moveBackward() {
      while (hold === true) {
        camera.position.z += 0.1;
      }
    }

    hold

    有什么解决办法吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Brakebein    6 年前

    您需要在动画/渲染循环中设置摄影机位置的动画。因此,每次渲染调用都会进一步设置摄影机位置。

    var hold = -1;
    
    document.addEventListener('contextmenu', onContextMenu, false);
    document.addEventListener('mousedown', onMouseDown, false);
    document.addEventListener('mouseup', onMouseUp, false);
    
    function onContextMenu(event) { // Prevent right click
      event.preventDefault();
    }
    
    function onMouseDown(event) {
      hold = event.which;
    }
    
    function onMouseUp(event) {
      console.log('mouse up');
      hold = -1;
    }
    
    // render loop
    function animate() {
    
      requestAnimationFrame(animate);
    
      switch(hold) {
        case 1:
          camera.position.z -= 0.1;
          break;
        case 3:
          camera.position.z += 0.1;
          break;
      }
    
      renderer.render(scene, camera);
    
    }