效果图:

1.点击前

2.点击后

说明:效果就是我在给模型打标签时保存视角和坐标,点击标签的时候读取到坐标数据,再转动到对应视角。


1.安装 TWEEN

npm install --save @tweenjs/tween.js

2.在当前页引入

import TWEEN from "@tweenjs/tween.js";

3.添加标注时,将添加标注时的相机视角与模型的坐标进行保存(添加标注的逻辑在我之前的博客)

 // 创建标签createLableObj (text, vector) {let laberDiv = document.createElement('div');//创建div容器laberDiv.className = 'laber_name';// laberDiv.textContent = text;laberDiv.innerHTML = `<div class='label_count'><span class='close'>X</span>${text}</div>`// 给标签设置坐标位置laberDiv.setAttribute("data-point", JSON.stringify(camera.position))laberDiv.setAttribute("data-place", JSON.stringify(this.controls.target))let pointLabel = new CSS2DObject(laberDiv);pointLabel.position.set(vector.x, vector.y, vector.z);return pointLabel;},

4.监听标签点击事件,

// 监听标签盒子内的标签点击事件let _this = this;document.getElementsByClassName("allLabel")[0].addEventListener('click', function (e) {// 选中当前标签时显示详情if (e.target.className == "laber_name") {// 获取标签的坐标let labelPoint = JSON.parse(e.target.getAttribute("data-point"));// 获取创建标签时的中心点let labelPlace = JSON.parse(e.target.getAttribute("data-place"));// let newControlsPoint = { x: 0, y: 0, z: 0 },//中心点为场景中间_this.animateCamera(camera.position, _this.controls.target, labelPoint, labelPlace, e)}// 点击取消时隐藏标签详情if (e.target.className == 'close') {// 回到初始状态_this.initPoint()}}, true)

5.坐标过渡

// 模型角度变化函数animateCamera (oldP, oldC, newP, newC, e) {let _this = this;var p1 = {x1: oldP.x,y1: oldP.y,z1: oldP.z,x2: oldC.x,y2: oldC.y,z2: oldC.z,}var p2 = {x1: newP.x,y1: newP.y,z1: newP.z,x2: newC.x,y2: newC.y,z2: newC.z,}var tween = new TWEEN.Tween(p1).to(p2, 1800);//第一段动画var update = function (object) {camera.position.set(object.x1, object.y1, object.z1);_this.controls.target.set(object.x2, object.y2, object.z2);camera.lookAt(0, 0, 0);//保证动画执行时,相机焦距在中心点_this.controls.enabled = false;_this.controls.update();};tween.onUpdate(update);// 动画完成后的执行函数tween.onComplete(() => {_this.controls.enabled = true; //执行完成后开启控制//这一段是为了实现点击标签时,高亮当前标签所在的模块,但是有问题,后期再说,不需要的可以删掉if (e) {_this.events.pickPosition.x = e.clientX / renderer.domElement.clientWidth * 2 - 1;_this.events.pickPosition.y = -(e.clientY / renderer.domElement.clientHeight * 2) + 1;// 点击区域高亮显示_this.pickEvents('show', _this.events.pickPosition, scene, camera, obj => {// obj.material.emissive.setHex(0xEA3639)// obj.userData.checked = !obj.userData.checked;// if (!obj.userData.checked) {//   // 恢复默认颜色//   obj.material.emissive.setHex(_this.events.pickedObjectSavedColor)// } else {//   // 将其发射颜色设置为闪烁的红色/黄色//   obj.material.emissive.setHex(0xFF3443)// }})}});tween.easing(TWEEN.Easing.Quadratic.InOut);tween.start();},

重点:需要在动画中加入这么一行,才能开启过渡效果

threejs使用tweenjs实现点击标签过渡到相应视角相关推荐

  1. iframe的属性及其简单使用(点击标签切换页面)

    iframe的相关属性 详细内容参考:HTML <iframe> 标签 属性 值 描述 align left right top middle bottom 不赞成使用.请使用样式代替. ...

  2. MyEclipse导入主题文件epf后xml及jsp等页面中点击标签之后显示灰白

    MyEclipse导入主题文件epf后xml及jsp等页面中点击标签之后显示灰白,症状如下: 解决方案如下:

  3. html在文本框中显示内容,js如何实现点击标签文字,文字在文本框出现

    js实现点击标签文字,文字出现在文本框里,下面2种方法实现的功能略有不同,总体来说方法一功能更强大. 第一种方法:随意点击任何标签都会出现在文本框中,如何第二次点击标签,对应的文字就会在文本框中消失. ...

  4. Android viewPager2 + fragment 模拟微信首页2(滑动页面标签同步变化,点击标签滑动页面)

    可以实现的方式:BottomNavigationView 这里我们不使用BottomNavigationView,手动来写代码 先看一下效果 fragment + viewPager2模拟微信首页2( ...

  5. VUE使用Three.js实现模型,点击交互,相机旋转视角跟随移动(Threejs中使用Tweenjs,含demo源码)

    目录 一.Three.js是什么? 二.VUE简单使用Three.js步骤 1.npm安装 2.template模板 3.引入库 4.定义全局变量 5.初始化场景 6.初始化相机 7.初始化灯光 8. ...

  6. h5jumppage.php,h5使用webviewjsbridge跟原生交互,点击标签调用2次webview

    问题描述 使用vue循环一个标签列表,点击列表里面的标签,调用app给的跳转页面的方法,第一次跳转页面后,点击返回按钮回到本页面,再次点击列表里面的标签,调用了2次webview,只有第一次点击的时候 ...

  7. html怎样创建复选框,如何使用可点击标签创建HTML复选框

    方法1:包装标签 将复选框包装在 label 标记内: Text 方法2:使用for属性 使用 for 属性(匹配复选框 id ): Text NOTE :页面上的ID必须是唯一的! 解释 由于其他答 ...

  8. vue + threejs 给3D模型添加label标签(dom的方式)

    webGL.js封装的代码. const THREE = window.THREE; // webGL对象配置 export const webglOBJ = {renderDom: null,Sce ...

  9. Threejs之粒子动画/点击交互

    随意 粒子动画 管道 扫光柱 点击事件 粒子动画 function createParticle() {var geometry = new THREE.Geometry();var mouse = ...

最新文章

  1. PHPEXCEL使用实例
  2. 新站优化最应该考虑哪些方面
  3. hitchhiker部署_《 Hitchhiker的Python机器学习指南》
  4. python产生随机数random.random_Python内置random模块生成随机数的方法
  5. Redis系统管理相关指令简介
  6. 灯塔预计2022年春节档票房在70亿至80亿元之间
  7. 编辑距离 在输入检测中的应用
  8. datagrid java_Easyui Datagrid增删改及后台交互(java)
  9. Java-数字相关类
  10. 苹果春季发布会确认:AirPods2、Apple TV服务等来袭,3月25日见
  11. 贝叶斯分析之利用线性回归模型理解并预测数据(三)
  12. java虚拟机启动失败_Eclipse 启动提示java虚拟机启动失败
  13. Calibre电子书简繁转换
  14. 书摘---网络搜集整理 (11--20)
  15. MyBatis 同时执行多条语句【简单扼要】
  16. Python爬虫实战:爬取贝壳网二手房成交数据,将数据存入Excel。
  17. UE4 输入系统详解一、 UE4如何获取win系统输入消息
  18. java接口里面可以定义变量么?
  19. 解决one-stage目标检测正负样本不均衡的另类方法--Gradient Harmonized
  20. 这四个微信小技巧,职场人一定要学会

热门文章

  1. 推荐系统应用---新闻资讯类
  2. keystore was tampered with,or password was incorrect解决办法
  3. 无线网服务器亮红灯什么情况,无线网猫光信号闪红灯是什么原因
  4. NAT hairpin,端口回流,回环NAT
  5. 清空el-form表单数据(整理)
  6. CHIP-seq流程学习笔记(9)-使用IDR 软件对生物学重复样本间的差异peak进行提取
  7. [转] Photoshop教程8000例
  8. Unity冒险游戏集合
  9. 尚硅谷docker基础篇 2018版
  10. UNIX环境高级编程(APUE)读书笔记