需求:较为简单,对3D场景进行OrbitControls自带的拖动缩放功能。在自写一个点击具体3D物体拉近相机的功能,也就是flyTo()。

flyTo()是一个动画过程,(想要线上了解效果的可以参考cesium的效果,链接地址 Cesium Sandcastle,我认识这个函数名也是在cesium中)

1.引入OrbitControls,这个步骤为简单,不在详细说明。我使用的是vue项目。

//在script中引入orbitcontrolsimport {OrbitControls} from 'three/examples/jsm/controls/ObitControls.js';//在初始化3D场景完成后创建控制对象this.controls = new OrbitControls(this.camera,this.renderer.domElement);

至此,拖动和缩放功能应该没问题了。接下来实现flyTo()的功能。

2.flyTo()的实现。

思路:不断修改摄像头的位置和看的方向,最后聚焦于目标,涉及到 camera.position,camera.lookAt(),controls.target(不修改这个会出现一个小bug),不断修改使用tween.js。

菜全了开始动手。

// 引入,请写在正确的位置
import TWEEN from '@tweenjs/tween.js';// 在变换之前使用一个全局变量记录过程值,
// 因为tween.js在update过程是修改参数的本身,不会返回新产生的return
// 如果只修改一个参数,例如positon,只需要将position传进去即可,
// 但是同时修改两个值,我的选择是将两个值组合在一块成为一个值
this.current = { x:this.camera.position.x,y:this.camera.position.y,z:this.camera.position.z,x1:this.controls.target.x,y1:this.controls.target.y,z1:this.controls.target.z}
this.flyTo(this.getResultData(mesh))// 计算出相机的目标位置和朝向 ,参数是被选中的物体
getResultData(mesh){let target = {x:mesh.position.x+300, //增加一些偏移量,使相机与目标物体之间有些距离,以便于观察y:mesh.position.y+300,z:mesh.position.z+150,x1:mesh.position.x,y1:mesh.position.y,z1:mesh.position.z}return target;},
flyTo(target){this.tween = new TWEEN.tween(this.current);// 这一部分一定要加上,不然flyTo动作完成后,// 不论点击任何位置,controls都会将lootAt指向flyTo之前的位置// 将controls 的观察目标设置为选中物体this.tween.onComplete(()=>{let temp = new THREE.Vector3(target.x1,target.y1,target.z1);this.controls.target = temp;});// 每次更新相机位置和朝向this.onUpdate(()={this.camera.position = new THREE.Vector3(this.current.x,this.current.y,this.current.z);this.camera.lootAt(this.current.x1,this.current.y1,this.current.z1);});this.tween.to(target,500);this.tween.start();
},
// 在threejs的animate函数中添加animate(){TWEEN.update();
},

到这里功能基本完成,但是会有一个问题,就是执行controls的拖动后,在放开鼠标之前鼠标移动到了可选的mesh上,那放开拖动鼠标,会立马执行一次点击的操作,因为我flyTo()的触发事件就是click,所以算是很严重的问题。原因为拖动也是一次点击的过程。

解决思路:1、模式控制,拖动模式下取消click事件,需要flyTO()时设置controls.enable为false。2、修改controls源码,判断如果当次操作为鼠标左键拖动则取消本次的flyTo()。

// 打开 three/examples/jsm/controls/ObitControls.js
// 在第40行增加
this.stopClick = false; // 默认是可以clcik的
this.rotateCount = 0; // 记录本次拖动的持续时间,如果持续时间较短就认为是点击// 在252行添加
scope.rotateCount ++;
if(scope.rotateCount>3){scope.stopClick = true;
}// 在954行添加
if(scope.stopClick){setTimeout(()=>{scope.stopClick = false;},50);
}

然后再执行flyTO()之前判断controls.stopClick是否为真,如果是则直接返回。

代码全是手打,有可能存在打错的情况,请甄别。

Three.js搭配OrbitControls.js实现flyTo()_imcmuc的博客-CSDN博客需求:较为简单,对3D场景进行OrbitControls自带的拖动缩放功能。在自写一个点击具体3D物体拉近相机的功能,也就是flyTo()。flyTo()是一个动画过程,(想要线上了解效果的可以参考cesium的效果,链接地址Cesium Sandcastle,我认识这个函数名也是在cesium中)1.引入OrbitControls,这个步骤为简单,不在详细说明。我使用的是vue项目。//在script中引入orbitcontrolsimport {OrbitControls} from.https://blog.csdn.net/qq_38206656/article/details/123068682

Three.js搭配OrbitControls.js实现flyTo()相关推荐

  1. three.js使用OrbitControls.js控制几何体旋转、平移、缩放

    附带一个可用的OrbitControls.js http://www.yanhuangxueyuan.com/threejs/examples/js/controls/OrbitControls.js ...

  2. three.js轨道控制器OrbitControls.js

    学习交流欢迎加群:789723098,博主会将一些demo整理共享 轨道控制器OrbitControls.js是一个相当神奇的控件,用它可以实现场景用鼠标交互,让场景动起来,控制场景的旋转.平移,缩放 ...

  3. 服装搭配展示JS特效

    服装搭配展示JS特效  <!doctype html> <html lang="en">  <head>   <meta charset= ...

  4. fullPage.js和Wow.js不兼容的问题(已解决,方法待优化)

    问题描述 我在PC端项目里同时使用了fullPage.js和wow.js.两个组件的基准冲突了. 原因就是fullPage.js是通过对外容器dowebok的y坐标进行偏移从而进行一屏滚动的,变化的是 ...

  5. 【Three.js】Three.js快速上手教程

    1. Three.js简介 官网对 Three.js 的介绍非常简单:"Javascript 3D library". 即:three.js是JavaScript编写的WebGL第 ...

  6. JS基础(三)JS入门

    文章目录 JS入门 JS内部的一些对象 Date对象 JSON对象 操作BOM 操作DOM(超级重点) 定位查看DOM节点 使用document获取节点: 使用DOM节点对象获取DOM节点 修改DOM ...

  7. jQuery全屏滚动插件 Fullpage.js 及 move.js

    Fullpage.js 引入文件 <link rel="stylesheet" href="css/jquery.fullPage.css"> &l ...

  8. pdfh5.js 基于pdf.js和jQuery,web/h5/移动端PDF预览手势缩放插件。

    pdfh5.js 基于pdf.js和jQuery,web/h5/移动端PDF预览手势缩放插件. 注意:本地绝对路径地址不能加载,跨域问题用代理或者服务端解决. svg模式渲染存在缺陷,只能渲染普通pd ...

  9. php提交表单关闭弹出层,使用js实现关闭js弹出层的窗口

    本篇文章主要是对使用js实现关闭js弹出层的窗口的示例代码进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 function toggle() { theObj = document.getE ...

最新文章

  1. 开源大数据周刊-第44期
  2. 新内容,新交互”全球视频云创新挑战
  3. deMeer5_Attacker
  4. flower.php,flower.php
  5. VMware的linux虚拟机实现和windows的文件共享
  6. 4.2 字符串简介
  7. 【AD】Altium designer pcb 交叉选择模式
  8. python super().__init__()参数_python类中super()和__init__()的区别
  9. Sql Server2005 Transact-SQL
  10. 山东中职计算机应用基础课件,计算机应用基础课件(中职)-精选版.ppt
  11. STM32F103C8T6在Arduino框架下驱动ssd1306 0.96“ IIC OLED显示
  12. 2021深圳杯数学建模D题概览
  13. 硬盘运行与“AHCI 模式”还是“IDE 模式”
  14. 计算机中的PS颜色填充快捷键,ps中填充颜色的快捷键是什么(填充Shift+F5)
  15. linux下c/c++实例之三只允许单个程序运行
  16. 应用电路笔记(1)-三极管8550和8050应用
  17. P1075 质因数分解
  18. ps滤镜之旋转扭曲算法实现
  19. 多线程性能及效率问题
  20. vue3使用echarts并封装echarts组件

热门文章

  1. 微信小程序接入环信客服
  2. vuecli项目打包
  3. 使用matlab作单位阶跃响应,基于MATLAB的控制系统单位阶跃响应分析[共7页]
  4. 进阶-第28__深度探秘搜索技术_实战掌握误拼写时的fuzzy模糊搜索技术
  5. K近邻算法python实现并显示决策边界
  6. 【国企笔试】263、山有色:水发声 A 山河在:草木深 B 客舍青:柳色新 C 鸟飞绝:人踪灭 D 花作尘:鸟不惊
  7. virtualbox安装androidx86进入console控制台,不能进入启动界面,卡死在detecting android-x86 found at /dev/sda1
  8. 2022年PC推荐-组装机及品牌机 2022年8月16日(持续更新)
  9. android 手机 投影,100吋1080p 看Android双核手机连投影
  10. MIT 黑科技:通过脑电波和手势控制机器人