Three.js如何用轨迹球插件(trackball)增加对模型的交互功能详解


Posted in Javascript onSeptember 25, 2017

前言

之前我们已经简单的给大家介绍了关于three.js入门的一些案例,下面本文将详细介绍关于Three.js如何用轨迹球插件(trackball)增加对模型的交互功能,下面话不多说了,来一起看看详细的介绍吧。

这是three.js的一个组件,需要额外的引入文件,文件的地址是在官方下载的案例examples/js/controls/TrackballControls.js。

只需要和案例里面一样设置相关的属性,并在实例化的时候讲相机传入。就可以实现交互效果。

可以实现的效果:

  • 鼠标按住左键可以旋转模型
  • 鼠标按住右键拖拽可以移动模型
  • 鼠标滚轮可以缩放模型

案例代码:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
 <meta charset="UTF-8"> 
 <title>Title</title> 
 <style type="text/css"> 
 html, body { 
  margin: 0; 
  height: 100%; 
 } 
 
 canvas { 
  display: block; 
 } 
 
 </style> 
</head> 
<body onload="draw();"> 
 
</body> 
<script src="build/three.js"></script> 
<script src="examples/js/controls/TrackballControls.js"></script> 
<script> 
 var renderer; 
 function initRender() { 
 renderer = new THREE.WebGLRenderer({antialias:true}); 
 renderer.setSize(window.innerWidth, window.innerHeight); 
 document.body.appendChild(renderer.domElement); 
 } 
 
 var camera; 
 function initCamera() { 
 camera = new THREE.PerspectiveCamera(45, window.innerWidth/window.innerHeight, 1, 10000); 
 camera.position.set(0, 0, 400); 
 } 
 
 var scene; 
 function initScene() { 
 scene = new THREE.Scene(); 
 } 
 
 var light; 
 function initLight() { 
 scene.add(new THREE.AmbientLight(0x404040)); 
 
 light = new THREE.DirectionalLight(0xffffff); 
 light.position.set(1,1,1); 
 scene.add(light); 
 } 
 
 function initModel() { 
 var map = new THREE.TextureLoader().load("examples/textures/UV_Grid_Sm.jpg"); 
 var material = new THREE.MeshLambertMaterial({map:map}); 
 
 var cube = new THREE.Mesh(new THREE.BoxGeometry(100, 200, 100, 1, 1, 1), material); 
 scene.add(cube); 
 } 
 
 //用户交互插件 鼠标左键按住旋转,右键按住平移,滚轮缩放 
 var controls; 
 function initControls() { 
 controls = new THREE.TrackballControls( camera ); 
 //旋转速度 
 controls.rotateSpeed = 5; 
 //变焦速度 
 controls.zoomSpeed = 3; 
 //平移速度 
 controls.panSpeed = 0.8; 
 //是否不变焦 
 controls.noZoom = false; 
 //是否不平移 
 controls.noPan = false; 
 //是否开启移动惯性 
 controls.staticMoving = false; 
 //动态阻尼系数 就是灵敏度 
 controls.dynamicDampingFactor = 0.3; 
 //未知,占时先保留 
 //controls.keys = [ 65, 83, 68 ]; 
 controls.addEventListener( 'change', render ); 
 } 
 
 function render() { 
 renderer.render( scene, camera ); 
 } 
 
 //窗口变动触发的函数 
 function onWindowResize() { 
 
 camera.aspect = window.innerWidth / window.innerHeight; 
 camera.updateProjectionMatrix(); 
 controls.handleResize(); 
 render(); 
 renderer.setSize( window.innerWidth, window.innerHeight ); 
 
 } 
 
 function animate() { 
 //更新控制器 
 controls.update(); 
 render(); 
 requestAnimationFrame(animate); 
 } 
 
 function draw() { 
 initRender(); 
 initScene(); 
 initCamera(); 
 initLight(); 
 initModel(); 
 initControls(); 
 
 animate(); 
 window.onresize = onWindowResize; 
 } 
</script> 
</html>

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
jQuery UI Datepicker length为空或不是对象错误的解决方法
Dec 19 Javascript
js+css使DIV始终居于屏幕中间 左下 左上 右上 右下的代码集合
Mar 10 Javascript
jquery.cookie.js使用指南
Jan 05 Javascript
jquery实现点击页面计算点击次数
Jan 23 Javascript
javascript删除元素节点removeChild()用法实例
May 26 Javascript
Bootstrap所支持的表单控件实例详解
May 16 Javascript
基于JavaScript实现报警器提示音效果
Oct 27 Javascript
JavaScript设计模式之建造者模式实例教程
Jul 02 Javascript
Vue filter 过滤当前时间 实现实时更新效果
Dec 20 Javascript
如何使用 JavaScript 操作浏览器历史记录 API
Nov 24 Javascript
7个你应该知道的JS原生错误类型
Apr 29 Javascript
vite+vue3.0+ts+element-plus快速搭建项目的实现
Jun 24 Vue.js
Three.js入门之hello world以及如何绘制线
Sep 25 #Javascript
es6系列教程_ Map详解以及常用api介绍
Sep 25 #Javascript
简单谈谈js的数据类型
Sep 25 #Javascript
实现两个文本框同时输入的实例
Sep 25 #Javascript
zTree jQuery 树插件的使用(实例讲解)
Sep 25 #jQuery
对于input 框限定输入值为浮点型的js代码
Sep 25 #Javascript
静态页面实现 include 引入公用代码的示例
Sep 25 #Javascript
You might like
php 文件夹删除、php清除缓存程序
2009/08/25 PHP
理解和运用PHP中的多态性[译]
2011/08/02 PHP
CodeIgniter 完美解决URL含有中文字符串
2016/05/13 PHP
[JS]点出统计器
2020/10/11 Javascript
JavaScript触发器详解
2007/03/10 Javascript
FireFox与IE 下js兼容触发click事件的代码
2008/11/20 Javascript
js里的prototype使用示例
2010/11/19 Javascript
jQuery中Dom的基本操作小结
2014/01/23 Javascript
如何正确使用Nodejs 的 c++ module 链接到 OpenSSL
2014/08/03 NodeJs
深入探讨JavaScript String对象
2015/03/09 Javascript
JavaScript DOM基础
2015/04/13 Javascript
javascript中checkbox使用方法实例演示
2015/11/19 Javascript
AngularJs 弹出模态框(model)
2016/04/07 Javascript
Web Uploader文件上传插件使用详解
2016/05/10 Javascript
Bootstrap 布局组件(全)
2016/07/18 Javascript
有趣的bootstrap走动进度条
2016/12/01 Javascript
Websocket协议详解及简单实例代码
2016/12/12 Javascript
详解让sublime text3支持Vue语法高亮显示的示例
2017/09/29 Javascript
vue中路由验证和相应拦截的使用详解
2017/12/13 Javascript
在Vue中获取组件声明时的name属性方法
2018/09/12 Javascript
教你使用vue-cli快速构建的小说阅读器
2019/05/13 Javascript
Python解惑之整数比较详解
2017/04/24 Python
Django上线部署之IIS的配置方法
2019/08/22 Python
python并发爬虫实用工具tomorrow实用解析
2019/09/25 Python
Python从列表推导到zip()函数的5种技巧总结
2019/10/23 Python
解决安装新版PyQt5、PyQT5-tool后打不开并Designer.exe提示no Qt platform plugin的问题
2020/04/24 Python
python能否java成为主流语言吗
2020/06/22 Python
【HTML5】Canvas绘制简单图片教程
2016/05/13 HTML / CSS
机械设计制造专业个人求职信
2013/09/25 职场文书
语文课外活动总结
2014/08/27 职场文书
群众路线剖析材料范文
2014/10/09 职场文书
毕业生就业推荐表导师评语
2014/12/31 职场文书
2015年档案室工作总结
2015/05/23 职场文书
毛主席纪念堂观后感
2015/06/17 职场文书
Python实现双向链表基本操作
2022/05/25 Python
cypress测试本地web应用
2022/06/01 Javascript