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 相关文章推荐
asp.net下利用js实现返回上一页的实现方法小集
Nov 24 Javascript
基于jQuery的淡入淡出可自动切换的幻灯插件打包下载
Sep 15 Javascript
腾讯UED 漂亮的提示信息效果代码
Sep 12 Javascript
javascript实现实时输出当前的时间
Apr 27 Javascript
JQuery中attr方法和removeAttr方法用法实例
May 18 Javascript
JS实现的自定义右键菜单实例二则
Sep 01 Javascript
javascript 广告移动特效的实现代码
Jun 25 Javascript
JS弹出新窗口被拦截的解决方法
Aug 09 Javascript
jQuery 检查某个元素在页面上是否存在实例代码
Oct 27 Javascript
详解JavaScript中return的用法
May 08 Javascript
Vue2.0中三种常用传值方式(父传子、子传父、非父子组件传值)
Aug 16 Javascript
Node.js利用Express实现用户注册登陆功能(推荐)
Oct 26 Javascript
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中动态HTML的输出技术
2006/10/09 PHP
PHP分页显示制作详细讲解
2006/12/05 PHP
jquery实现的元素的left增加N像素 鼠标移开会慢慢的移动到原来的位置
2010/03/21 Javascript
JS实现下拉框的动态添加(附效果)
2013/04/03 Javascript
无缝滚动js代码通俗易懂(自写)
2013/06/19 Javascript
浅析javascript中function 的 length 属性
2014/05/27 Javascript
基于jquery实现智能表单验证操作
2016/05/09 Javascript
JavaScript中的ParseInt(&quot;08&quot;)和“09”返回0的原因分析及解决办法
2016/05/19 Javascript
浅析JavaScript中命名空间namespace模式
2016/06/22 Javascript
Vue2递归组件实现树形菜单
2017/04/10 Javascript
详解vue嵌套路由-query传递参数
2017/05/23 Javascript
JS字符串去除连续或全部重复字符的实例
2018/03/08 Javascript
微信小程序实现图片滚动效果示例
2018/12/05 Javascript
JS实现的贪吃蛇游戏案例详解
2019/05/01 Javascript
使用xampp将angular项目运行在web服务器的教程
2019/09/16 Javascript
[01:12:40]DOTA2-DPC中国联赛 正赛 DLG vs XG BO3 第三场 1月25日
2021/03/11 DOTA
python 获取页面表格数据存放到csv中的方法
2018/12/26 Python
Python如何实现强制数据类型转换
2019/11/22 Python
python创建ArcGIS shape文件的实现
2019/12/06 Python
Python StringIO如何在内存中读写str
2020/01/07 Python
Python语法之精妙的十个知识点(装B语法)
2020/01/18 Python
10分钟入门CSS3 Animation
2018/12/25 HTML / CSS
Html5移动端适配IphoneX等机型的方法
2019/06/25 HTML / CSS
英国在线房屋中介网站:Yopa
2018/01/09 全球购物
获取邓白氏信用报告:Dun & Bradstreet
2019/01/22 全球购物
俄罗斯达美乐比萨外送服务:Domino’s Pizza
2020/12/18 全球购物
什么是.net的Remoting技术
2016/07/08 面试题
船舶专业个人求职信范文
2014/01/02 职场文书
党支部书记岗位责任制
2014/02/11 职场文书
高中运动会入场词
2014/02/14 职场文书
少先队学雷锋活动月总结
2014/03/09 职场文书
财务部绩效考核方案
2014/05/04 职场文书
干部作风整顿个人剖析材料
2014/10/06 职场文书
门卫管理制度范本
2015/08/05 职场文书
2016年质量月活动总结报告
2016/04/05 职场文书
Python实现的扫码工具居然这么好用!
2021/06/07 Python