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实现的可以编辑选择的下拉框的代码
Nov 19 Javascript
禁止IE用右键的JS代码
Dec 30 Javascript
js实现的黑背景灰色二级导航菜单效果代码
Aug 24 Javascript
跟我学习javascript的定时器
Nov 19 Javascript
学习使用bootstrap基本控件(table、form、button)
Apr 12 Javascript
jQuery EasyUI框架中的Datagrid数据表格组件结构详解
Jun 09 Javascript
jQuery实现Select下拉列表进行状态选择功能
Mar 30 jQuery
详解JavaScript中的数组合并方法和对象合并方法
May 11 Javascript
基于Vue2-Calendar改进的日历组件(含中文使用说明)
Apr 14 Javascript
layui实现数据分页功能
Jul 27 Javascript
JavaScript闭包原理与用法学习笔记
May 29 Javascript
vue使用echarts图表自适应的几种解决方案
Dec 04 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入门速成教程
2007/03/19 PHP
简单的php购物车代码
2020/06/05 PHP
jquery的$(document).ready()和onload的加载顺序
2010/05/26 Javascript
关于document.cookie的使用javascript
2010/10/29 Javascript
JsDom 编程小结
2011/08/09 Javascript
Raphael带文本标签可拖动的图形实现代码
2013/02/20 Javascript
轻量级的原生js日历插件calendar.js使用指南
2015/04/28 Javascript
使用AngularJS对路由进行安全性处理的方法
2015/06/18 Javascript
jQuery短信验证倒计时功能实现方法详解
2016/05/25 Javascript
详解VueJs异步动态加载块
2017/03/09 Javascript
详解如何将angular-ui的图片轮播组件封装成一个指令
2017/05/09 Javascript
JS实现无缝循环marquee滚动效果
2017/05/22 Javascript
js构建二叉树进行数值数组的去重与优化详解
2018/03/26 Javascript
vue项目中使用Hbuilder打包app 设置沉浸式状态栏的方法
2018/10/22 Javascript
微信小程序实现星星评价效果
2018/11/02 Javascript
vue.js路由mode配置之去掉url上默认的#方法
2019/11/01 Javascript
python 排列组合之itertools
2013/03/20 Python
python 连接sqlite及简单操作
2017/06/30 Python
python2和python3的输入和输出区别介绍
2018/11/20 Python
对python多线程中Lock()与RLock()锁详解
2019/01/11 Python
Python实现简单的列表冒泡排序和反转列表操作示例
2019/07/10 Python
python数据化运营的重要意义
2019/11/25 Python
Python如何基于smtplib发不同格式的邮件
2019/12/30 Python
css3实现背景颜色渐变让图片不再是唯一的实现方式
2012/12/18 HTML / CSS
html5拖曳操作 HTML5实现网页元素的拖放操作
2013/01/02 HTML / CSS
uniapp+Html5端实现PC端适配
2020/07/15 HTML / CSS
学生励志演讲稿
2014/01/06 职场文书
小学生田径运动会广播稿
2014/09/11 职场文书
学生会干部自我鉴定2014
2014/09/18 职场文书
师德师风自查材料
2014/10/14 职场文书
学院党的群众路线教育实践活动第一阶段情况汇报
2014/10/25 职场文书
未中标通知书
2015/04/17 职场文书
2015年教研组工作总结
2015/05/04 职场文书
总经理致辞
2015/07/29 职场文书
2019年最新七夕唯美祝福语(60条)
2019/07/22 职场文书
node.js如何自定义实现一个EventEmitter
2021/07/16 Javascript