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 相关文章推荐
jQuery学习笔记之2个小技巧
Jan 19 Javascript
JavaScript控制table某列不显示的方法
Mar 16 Javascript
jQuery经过一段时间自动隐藏指定元素的方法
Mar 17 Javascript
jQuery遮罩层效果实例分析
Jan 14 Javascript
使用Require.js封装原生js轮播图的实现代码
Jun 15 Javascript
Webpack框架核心概念(知识点整理)
Dec 22 Javascript
微信小程序中使用wxss加载图片并实现动画效果
Aug 13 Javascript
vue debug 二种方法
Sep 16 Javascript
微信小程序导航栏滑动定位功能示例(实现CSS3的positionsticky效果)
Jan 24 Javascript
layui点击弹框页面 表单请求的方法
Sep 21 Javascript
p5.js绘制旋转的正方形
Oct 23 Javascript
javascript实现拼图游戏
Jan 29 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
DedeCMS dede_channeltype表字段注释
2010/04/07 PHP
PHP 简易输出CSV表格文件的方法详解
2013/06/20 PHP
php实用代码片段整理
2016/11/12 PHP
PHP实现微信提现功能(微信商城)
2019/11/21 PHP
JS 判断undefined的实现代码
2009/11/26 Javascript
jQuery实现点击文本框弹出热门标签的提示效果
2013/11/17 Javascript
js给页面加style无效果的解决方法
2014/01/20 Javascript
理解AngularJs指令
2015/12/10 Javascript
JQUERY表单暂存功能插件分享
2016/02/23 Javascript
AngularJS实现根据变量改变动态加载模板的方法
2016/11/04 Javascript
完美的js图片轮换效果
2017/02/05 Javascript
详解puppeteer使用代理
2018/12/27 Javascript
Vue的H5页面唤起支付宝支付功能
2019/04/18 Javascript
微信小程序自定义波浪组件使用方法详解
2019/09/21 Javascript
Python计算回文数的方法
2015/03/11 Python
对python opencv 添加文字 cv2.putText 的各参数介绍
2018/12/05 Python
Django框架设置cookies与获取cookies操作详解
2019/05/27 Python
python进程池实现的多进程文件夹copy器完整示例
2019/11/27 Python
opencv3/C++图像像素操作详解
2019/12/10 Python
python 回溯法模板详解
2020/02/26 Python
python数据库操作mysql:pymysql、sqlalchemy常见用法详解
2020/03/30 Python
基于python实现判断字符串是否数字算法
2020/07/10 Python
Python 爬虫性能相关总结
2020/08/03 Python
用CSS3实现Win8风格的方格导航菜单效果
2013/04/10 HTML / CSS
让IE支持CSS3的不完全兼容方案
2014/09/19 HTML / CSS
HTML5实现视频直播功能思路详解
2017/11/16 HTML / CSS
MONNIER Frères英国官网:源自巴黎女士奢侈品配饰电商平台
2018/12/06 全球购物
Rentalcars.com中国:世界上最大的在线汽车租赁服务
2019/08/22 全球购物
优秀学生自我鉴定范例
2013/12/18 职场文书
2014年“四风”问题个人整改措施
2014/09/17 职场文书
2015年党员个人自我评价
2015/03/03 职场文书
银行招聘自荐信
2015/03/06 职场文书
焦裕禄纪念馆观后感
2015/06/09 职场文书
赞助商致辞
2015/07/30 职场文书
2016高考感言
2015/08/01 职场文书
干部外出学习心得体会
2016/01/18 职场文书