Three.js利用orbit controls插件(轨道控制)控制模型交互动作详解


Posted in Javascript onSeptember 25, 2017

前言

本文主要给大家介绍了关于Three.js利用orbit controls插件(轨道控制)控制模型交互动作的相关内容,这个效果相对于第八节的轨迹球插件使用上感觉要好,虽然轨迹球插件可以来回的滚动,但是容易分辨不清楚上下左右的关系,容易混乱,适合调试,而轨道控制插件orbit则适合客户使用,还不会产生混乱效果。下面讲一下使用。

(1)首先引入插件,文件地址在官方案例的examples/js/controls/OrbitControls.js。

(2)然后实例化函数,把相机和渲染器的dom传入,并设置相关设置。

//用户交互插件 鼠标左键按住旋转,右键按住平移,滚轮缩放 
 var controls; 
 function initControls() { 
 
 controls = new THREE.OrbitControls( camera, renderer.domElement ); 
 
 // 如果使用animate方法时,将此函数删除 
 //controls.addEventListener( 'change', render ); 
 // 使动画循环使用时阻尼或自转 意思是否有惯性 
 controls.enableDamping = true; 
 //动态阻尼系数 就是鼠标拖拽旋转灵敏度 
 //controls.dampingFactor = 0.25; 
 //是否可以缩放 
 controls.enableZoom = true; 
 //是否自动旋转 
 controls.autoRotate = true; 
 //设置相机距离原点的最远距离 
 controls.minDistance = 200; 
 //设置相机距离原点的最远距离 
 controls.maxDistance = 600; 
 //是否开启右键拖拽 
 controls.enablePan = true; 
 }

(3)最后,在animate函数内调用orbit的update()更新。

function animate() { 
 //更新控制器 
 controls.update(); 
 render(); 
 
 //更新性能插件 
 stats.update(); 
 requestAnimationFrame(animate); 
 }

就实现了相关效果。

下面是全部案例代码:

<!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/OrbitControls.js"></script> 
<script src="examples/js/libs/stats.min.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 stats; 
 function initStats() { 
 stats = new Stats(); 
 document.body.appendChild(stats.dom); 
 } 
 
 //用户交互插件 鼠标左键按住旋转,右键按住平移,滚轮缩放 
 var controls; 
 function initControls() { 
 
 controls = new THREE.OrbitControls( camera, renderer.domElement ); 
 
 // 如果使用animate方法时,将此函数删除 
 //controls.addEventListener( 'change', render ); 
 // 使动画循环使用时阻尼或自转 意思是否有惯性 
 controls.enableDamping = true; 
 //动态阻尼系数 就是鼠标拖拽旋转灵敏度 
 //controls.dampingFactor = 0.25; 
 //是否可以缩放 
 controls.enableZoom = true; 
 //是否自动旋转 
 controls.autoRotate = true; 
 //设置相机距离原点的最远距离 
 controls.minDistance = 200; 
 //设置相机距离原点的最远距离 
 controls.maxDistance = 600; 
 //是否开启右键拖拽 
 controls.enablePan = true; 
 } 
 
 function render() { 
 renderer.render( scene, camera ); 
 } 
 
 //窗口变动触发的函数 
 function onWindowResize() { 
 camera.aspect = window.innerWidth / window.innerHeight; 
 camera.updateProjectionMatrix(); 
 render(); 
 renderer.setSize( window.innerWidth, window.innerHeight ); 
 
 } 
 
 function animate() { 
 //更新控制器 
 controls.update(); 
 render(); 
 
 //更新性能插件 
 stats.update(); 
 requestAnimationFrame(animate); 
 } 
 
 function draw() { 
 initRender(); 
 initScene(); 
 initCamera(); 
 initLight(); 
 initModel(); 
 initControls(); 
 initStats(); 
 
 animate(); 
 window.onresize = onWindowResize; 
 } 
</script> 
</html>

总结

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

Javascript 相关文章推荐
背景音乐每次刷新都可以自动更换
Feb 01 Javascript
js弹窗代码 可以指定弹出间隔
Jul 03 Javascript
鼠标拖动实现DIV排序示例代码
Oct 14 Javascript
jQuery树形插件jquery.simpleTree.js用法分析
Sep 05 Javascript
vue+socket.io+express+mongodb 实现简易多房间在线群聊示例
Oct 21 Javascript
js实现把时间戳转换为yyyy-MM-dd hh:mm 格式(es6语法)
Dec 28 Javascript
浅谈webpack打包之后的文件过大的解决方法
Mar 07 Javascript
微信小程序如何通过用户授权获取手机号(getPhoneNumber)
Jan 21 Javascript
JavaScript canvas实现雪花随机动态飘落
Feb 08 Javascript
Vuex中的Mutations的具体使用方法
Jun 01 Javascript
为react组件库添加typescript类型提示的方法
Jun 15 Javascript
javascript实现数字时钟效果
Feb 06 Javascript
vuex中使用对象展开运算符的示例
Sep 25 #Javascript
Three.js利用性能插件stats实现性能监听的方法
Sep 25 #Javascript
Three.js如何用轨迹球插件(trackball)增加对模型的交互功能详解
Sep 25 #Javascript
Three.js入门之hello world以及如何绘制线
Sep 25 #Javascript
es6系列教程_ Map详解以及常用api介绍
Sep 25 #Javascript
简单谈谈js的数据类型
Sep 25 #Javascript
实现两个文本框同时输入的实例
Sep 25 #Javascript
You might like
php中3种方法删除字符串中间的空格
2014/03/10 PHP
php提高网站效率的技巧
2015/09/29 PHP
JavaScript脚本语言在网页中的简单应用
2007/05/13 Javascript
浅析jquery的js图表组件highcharts
2014/03/06 Javascript
浅谈jQuery构造函数分析
2015/05/11 Javascript
arguments对象验证函数的参数是否合法
2015/06/26 Javascript
jQuery EasyUI Dialog拖不下来如何解决
2015/09/28 Javascript
常见的javascript跨域通信方法
2015/12/31 Javascript
javascript js 操作数组 增删改查的简单实现
2016/06/20 Javascript
JSON字符串和JSON对象相互转化实例详解
2017/01/05 Javascript
深入理解javascript中的 “this”
2017/01/17 Javascript
bootstrap中的 form表单属性role=&quot;form&quot;的作用详解
2017/01/20 Javascript
使用JQuery实现图片轮播效果的实例(推荐)
2017/10/24 jQuery
Angular4 反向代理Details实践
2018/05/30 Javascript
了解Javascript中函数作为对象的魅力
2019/06/19 Javascript
微信小程序跳转到其他网页(外部链接)的实现方法
2019/09/20 Javascript
微信小程序日历插件代码实例
2019/12/04 Javascript
python中subprocess批量执行linux命令
2018/04/27 Python
python spyder中读取txt为图片的方法
2018/04/27 Python
Django实现单用户登录的方法示例
2019/03/28 Python
Python3.5字符串常用操作实例详解
2019/05/01 Python
Django外键(ForeignKey)操作以及related_name的作用详解
2019/07/29 Python
Python使用psutil获取进程信息的例子
2019/12/17 Python
python 微信好友特征数据分析及可视化
2020/01/07 Python
python 爬取百度文库并下载(免费文章限定)
2020/12/04 Python
python 通过exifread读取照片信息
2020/12/24 Python
详解CSS3 Media Queries中媒体属性的使用
2016/02/29 HTML / CSS
斯洛伐克时尚服装网上商店:Cellbes
2016/10/20 全球购物
超市促销活动方案
2014/03/05 职场文书
毕业晚会主持词
2014/03/24 职场文书
服务标兵事迹材料
2014/05/04 职场文书
正科级干部考察材料
2014/05/29 职场文书
2014年财务部工作总结
2014/11/11 职场文书
七夕情人节问候语
2015/11/11 职场文书
创业计划书之网吧
2019/10/10 职场文书
导游词之镇江-金山寺
2019/10/14 职场文书