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 相关文章推荐
Javascript无阻塞加载具体方式
Jun 28 Javascript
ExtJS4如何给同一个formpanel不同的url
May 02 Javascript
jQuery实现平滑滚动的标签分栏切换效果
Aug 28 Javascript
Jquery 全选反选实例代码
Nov 19 Javascript
JS图片左右无缝隙滚动的实现(兼容IE,Firefox 遵循W3C标准)
Sep 23 Javascript
完美的js div拖拽实例代码
Sep 24 Javascript
Node.js中常规的文件操作总结
Oct 13 Javascript
Javascript中的 “&amp;” 和 “|” 详解
Feb 02 Javascript
详解在AngularJS的controller外部直接获取$scope
Jun 02 Javascript
Vue.js实现价格计算器功能
Mar 30 Javascript
js实现移动端吸顶效果
Jan 08 Javascript
浅谈vue在html中出现{{}}的原因及解决方式
Nov 16 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
一个oracle+PHP的查询的例子
2006/10/09 PHP
php判断变量类型常用方法
2012/04/24 PHP
phpmyadmin出现Cannot start session without errors问题解决方法
2014/08/14 PHP
PHP微信API接口类
2016/08/22 PHP
thinkPHP5.0框架应用请求生命周期分析
2017/03/25 PHP
基于JQuery的一句话搞定手风琴菜单
2012/09/14 Javascript
详解JavaScript基于面向对象之创建对象(2)
2015/12/10 Javascript
Angularjs 实现一个幻灯片示例代码
2016/09/08 Javascript
浅谈js控制li标签排序问题 js调用php函数的方法
2016/10/16 Javascript
Vue 短信验证码组件开发详解
2017/02/14 Javascript
angularjs实现table增加tr的方法
2018/02/27 Javascript
Vue 组件封装 并使用 NPM 发布的教程
2018/09/30 Javascript
js实现移动端轮播图
2020/12/21 Javascript
es6数据变更同步到视图层的方法
2019/03/04 Javascript
javascript实现自由编辑图片代码详解
2019/06/21 Javascript
BootstrapValidator验证用户名已存在(ajax)
2019/11/08 Javascript
vue 对axios get pust put delete封装的实例代码
2020/01/05 Javascript
VueJS实现用户管理系统
2020/05/29 Javascript
javascript实现时间日期的格式化的方法汇总
2020/08/06 Javascript
Openlayers测量距离与面积的实现方法
2020/09/25 Javascript
python实现控制COM口的示例
2019/07/03 Python
Python中新式类与经典类的区别详析
2019/07/10 Python
Python 进程之间共享数据(全局变量)的方法
2019/07/16 Python
Win10+GPU版Pytorch1.1安装的安装步骤
2019/09/27 Python
django 实现简单的插入视频
2020/04/07 Python
python 线程的五个状态
2020/09/22 Python
css3动画效果抖动解决方法
2018/09/03 HTML / CSS
CK美国官网:Calvin Klein
2016/08/26 全球购物
凯普林包包西班牙官网:Kipling西班牙
2019/04/12 全球购物
网络编辑岗位职责范本
2014/02/10 职场文书
意向书范文
2014/03/31 职场文书
2014年国庆节广播稿
2014/09/19 职场文书
青年文明号汇报材料
2014/12/23 职场文书
2015年客服工作总结范文
2015/04/02 职场文书
关于python中readlines函数的参数hint的相关知识总结
2021/06/24 Python
TypeScript中条件类型精读与实践记录
2021/10/05 Javascript