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 扩展方法
May 06 Javascript
node.js中的fs.readSync方法使用说明
Dec 17 Javascript
javascript元素动态创建实现方法
May 13 Javascript
JavaScript根据CSS的Media Queries来判断浏览设备的方法
May 10 Javascript
Node.js开启Https的实践详解
Oct 25 Javascript
JS异步文件分片断点上传的实现思路
Dec 25 Javascript
ajax实现动态下拉框示例
Jan 10 Javascript
node.js基于mongodb的搜索分页示例
Jan 22 Javascript
jquery DataTable实现前后台动态分页
Jun 17 jQuery
node.js中TCP Socket多进程间的消息推送示例详解
Jul 10 Javascript
CountUp.js实现数字滚动增值效果
Oct 17 Javascript
JavaScript 严格模式(use strict)用法实例分析
Mar 04 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
理解PHP5中static和const关键字的区别
2007/03/19 PHP
PHP可逆加密/解密函数分享
2012/09/25 PHP
php广告加载类用法实例
2014/09/23 PHP
Yii把CGridView文本框换成下拉框的方法
2014/12/03 PHP
php 广告点击统计代码(php+mysql)
2018/02/21 PHP
tp5框架前台无限极导航菜单类实现方法分析
2020/03/29 PHP
JavaScript基本对象
2007/01/11 Javascript
javascript实现二分查找法实现代码
2007/11/12 Javascript
JavaScript 捕获窗口关闭事件
2009/07/26 Javascript
JavaScript插入动态样式实现代码
2012/02/22 Javascript
Javascript图像处理—为矩阵添加常用方法
2012/12/27 Javascript
jQuery实现表单提交时判断的方法
2014/12/13 Javascript
js实现数字每三位加逗号的方法
2015/02/05 Javascript
js中函数声明与函数表达式
2015/06/03 Javascript
完美解决IE不支持Data.parse()的问题
2016/11/24 Javascript
使用Phantomjs和Node完成网页的截屏快照的方法
2019/07/16 Javascript
Postman内建变量常用方法实例解析
2020/07/28 Javascript
python字典的常用操作方法小结
2016/05/16 Python
Python2.7+pytesser实现简单验证码的识别方法
2017/12/29 Python
tensorflow实现简单的卷积网络
2018/05/24 Python
树莓派用python中的OpenCV输出USB摄像头画面
2019/06/22 Python
关于Python核心框架tornado的异步协程的2种方法详解
2019/08/28 Python
Python3变量与基本数据类型用法实例分析
2020/02/14 Python
Python使用graphviz画流程图过程解析
2020/03/31 Python
Windows下PyCharm配置Anaconda环境(超详细教程)
2020/07/31 Python
移动端Web页面的CSS3 flex布局快速上手指南
2016/05/31 HTML / CSS
HTML5 Canvas的常用线条属性值总结
2016/03/17 HTML / CSS
html5 postMessage解决跨域、跨窗口消息传递方案
2016/12/20 HTML / CSS
h5移动端调用支付宝、微信支付的实现
2020/06/08 HTML / CSS
巴西24小时在线药房:Drogasil
2020/06/20 全球购物
中文专业毕业生自荐书范文
2014/01/04 职场文书
可贵的沉默教学反思
2014/02/06 职场文书
党员民主生活会整改措施
2014/09/26 职场文书
正风肃纪查摆剖析材料
2014/10/10 职场文书
党的群众路线教育实践活动督导组工作情况汇报
2014/10/28 职场文书
java协程框架quasar和kotlin中的协程对比分析
2022/02/24 Java/Android