You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

three.js启用OrbitControls时点选导航相机抖动问题求助

Three.js 点选导航相机移动与OrbitControls冲突问题

我正在Three.js中开发一个带点选导航功能的测试项目。点选机制很简单:通过raycaster检测用户点击平面的位置,再用gsap移动相机:

const move_cam = () => {
    const new_pos = { ...marker.position };
    gsap.to(camera.position, {
      duration: 2,
      x: new_pos.x,
      z: new_pos.z,

      onComplete: () => {
      }
    });
  };

但搭配OrbitControls使用时,相机移动过程中始终指向同一目标(camera is moving but stays focused on one point),原因是OrbitControls会让相机持续看向设定目标以实现环绕效果。

我尝试过三种解决方法:

  • 移动时用controls.enabled= false禁用OrbitControls,动画结束后通过gsap的onComplete()回调恢复,但该设置仅禁用用户交互,相机仍会看向目标;
  • 在动画循环中添加条件,仅当相机未移动时执行controls.update(),但动画结束后相机立刻回到原目标;
  • 存储相机到目标的偏移量offset,动画结束时重新计算目标位置,虽然能运行,但动画结束时相机出现抖动(Camera twitches at the end of animation),对应的move_cam()函数如下:
const move_cam = () => {
    camera_is_moving = true;
    const offset = {
      x: controls.target.x - camera.position.x,
      y: controls.target.y - camera.position.y,
      z: controls.target.z - camera.position.z,
    };

    const new_pos = { ...marker.position };
    new_pos.y = CAMERA_HEIGHT;
    
    gsap.to(camera.position, {
      duration: 2,
      x: new_pos.x,
      y: new_pos.y,
      z: new_pos.z,

      onComplete: () => {
        controls.target.x = offset.x + camera.position.x;
        // controls.target.y= offset.x + camera.position.y;
        controls.target.z = offset.x + camera.position.z;

        offset.x = controls.target.x - camera.position.x;
        offset.y = controls.target.y - camera.position.y;
        offset.z = controls.target.z - camera.position.z;
        camera_is_moving = false;
      }

    });
  };

我的目标是让相机旋转角度在动画前后保持一致,尝试上述方法后仍存在抖动问题,恳请技术帮助。项目已上传至Github仓库,完整JS文件见对应分支。

内容的提问来源于stack exchange,提问作者mqbaka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 09:55:06