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 相关文章推荐
JavaScript 对Cookie 操作的封装小结
Dec 31 Javascript
javascript 闭包
Sep 15 Javascript
js解析与序列化json数据(三)json的解析探讨
Feb 01 Javascript
document.createElement()用法及注意事项(ff下不兼容)
Mar 13 Javascript
前台js对象在后台转化java对象的问题探讨
Dec 20 Javascript
$.extend 的一个小问题
Jun 18 Javascript
整理Javascript函数学习笔记
Dec 01 Javascript
浅谈javascript运算符——条件,逗号,赋值,()和void运算符
Jul 15 Javascript
jQuery实现弹出窗口弹出div层的实例代码
Jan 09 Javascript
基于react组件之间的参数传递(详解)
Sep 05 Javascript
vue实现前台列表数据过滤搜索、分页效果
May 28 Javascript
Vue中computed和watch有哪些区别
Dec 19 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
WordPress中查询文章的循环Loop结构及用法分析
2015/12/17 PHP
如何判断php mysqli扩展类是否开启
2016/12/24 PHP
Laravel框架处理用户的请求操作详解
2019/12/20 PHP
yii2.0框架场景的简单使用示例
2020/01/25 PHP
JavaScript For Beginners(转载)
2007/01/05 Javascript
图像替换新技术 状态域方法
2010/01/28 Javascript
jquery中实现简单的tabs插件功能的代码
2011/03/02 Javascript
用js实现trim()的解决办法
2013/04/16 Javascript
js导出table到excel同时兼容FF和IE示例
2013/09/03 Javascript
Jquery中ajax方法data参数的用法小结
2014/02/12 Javascript
javascript关于运动的各种问题经典总结
2015/04/27 Javascript
js变量提升深入理解
2016/09/16 Javascript
详细讲解JavaScript中的this绑定
2016/10/10 Javascript
十大 Node.js 的 Web 框架(快速提升工作效率)
2017/06/30 Javascript
nodejs 搭建简易服务器的图文教程(推荐)
2017/07/18 NodeJs
jQuery条件分页 代替离线查询(附代码)
2017/08/17 jQuery
微信小程序中post方法与get方法的封装
2017/09/26 Javascript
详解promise.then,process.nextTick, setTimeout 以及 setImmediate的执行顺序
2018/11/21 Javascript
小程序识别身份证,银行卡,营业执照,驾照的实现
2019/11/05 Javascript
python基于urllib实现按照百度音乐分类下载mp3的方法
2015/05/25 Python
利用python求解物理学中的双弹簧质能系统详解
2017/09/29 Python
python 中的list和array的不同之处及转换问题
2018/03/13 Python
python实现连连看辅助之图像识别延伸
2019/07/17 Python
pytorch实现onehot编码转为普通label标签
2020/01/02 Python
python matplotlib中的subplot函数使用详解
2020/01/19 Python
ITK 实现多张图像转成单个nii.gz或mha文件案例
2020/07/01 Python
ubuntu16.04升级Python3.5到Python3.7的方法步骤
2020/08/20 Python
CSS3中HSL和HSLA的简单使用示例
2015/07/14 HTML / CSS
全球500多个机场的接送服务:Suntransfers
2019/06/03 全球购物
英国百年闻名的优质健康产品连锁店:Holland & Barrett
2019/12/19 全球购物
世界经理人咨询有限公司面试
2014/09/23 面试题
2015年组织部工作总结
2015/04/03 职场文书
二审答辩状范文
2015/05/22 职场文书
开学典礼观后感
2015/06/15 职场文书
2016党员入党决心书
2015/09/22 职场文书
Python基础之变量的相关知识总结
2021/06/23 Python