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 相关文章推荐
广泛收集的jQuery拖放插件集合
Apr 09 Javascript
jquery实现漂浮在网页右侧的qq在线客服插件示例
May 13 Javascript
基于JavaScript实现一定时间后去执行一个函数
Dec 14 Javascript
使用postMesssage()实现跨域iframe页面间的信息传递方法
Mar 29 Javascript
jQuery中text() val()和html()的区别实例详解
Jun 28 Javascript
window.open打开窗口被拦截的快速解决方法
Aug 04 Javascript
JavaScript中ES6字符串扩展方法
Aug 26 Javascript
Angular和Vue双向数据绑定的实现原理(重点是vue的双向绑定)
Nov 22 Javascript
Vue.js实战之利用vue-router实现跳转页面
Apr 01 Javascript
BootStrap 动态表单效果
Jun 02 Javascript
微信小程序代码上传、审核发布小程序
May 18 Javascript
VueCli3.0中集成MockApi的方法示例
Jul 05 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 Transfer Code
2006/10/09 PHP
PHP连接SQLSERVER 注意事项(附dll文件下载)
2012/06/28 PHP
php 使用file_get_contents读取大文件的方法
2014/11/13 PHP
利用PHP脚本在Linux下用md5函数加密字符串的方法
2015/06/29 PHP
php简单的上传类分享
2016/05/15 PHP
JavaScript之Getters和Setters 平台支持等详细介绍
2012/12/07 Javascript
JS图片无缝滚动(简单利于使用)
2013/06/17 Javascript
解析Jquery中如何把一段html代码动态写入到DIV中(实例说明)
2013/07/09 Javascript
jquery获取复选框被选中的值
2014/04/10 Javascript
js实现仿百度瀑布流的方法
2015/02/05 Javascript
深入浅析Node.js 事件循环
2015/12/20 Javascript
JavaScript绑定事件监听函数的通用方法
2016/05/14 Javascript
JS基于构造函数实现的菜单滑动显隐效果【测试可用】
2016/06/21 Javascript
JavaScript SHA1加密算法实现详细代码
2016/10/06 Javascript
JS函数动态传递参数的方法分析【基于arguments对象】
2019/06/05 Javascript
VueCli3.0中集成MockApi的方法示例
2019/07/05 Javascript
JQuery实现ul中添加LI和删除指定的Li元素功能完整示例
2019/10/16 jQuery
node.js中对Event Loop事件循环的理解与应用实例分析
2020/02/14 Javascript
[00:43]2016完美“圣”典风云人物:单车宣传片
2016/12/02 DOTA
Python统计文件中去重后uuid个数的方法
2015/07/30 Python
Python爬虫DOTA排行榜爬取实例(分享)
2017/06/13 Python
Python中函数及默认参数的定义与调用操作实例分析
2017/07/25 Python
pymysql模块的使用(增删改查)详解
2019/09/09 Python
python numpy 矩阵堆叠实例
2020/01/17 Python
tensorflow实现将ckpt转pb文件的方法
2020/04/22 Python
python类共享变量操作
2020/09/03 Python
HTML5 weui使用笔记
2019/11/21 HTML / CSS
玩具反斗城天猫官方旗舰店:享誉全球的玩具店
2017/10/10 全球购物
日本索尼音乐商店:Sony Music Shop
2018/07/17 全球购物
珍珠鸟教学反思
2014/02/01 职场文书
意向书范本
2014/07/29 职场文书
关于旅游的活动方案
2014/08/15 职场文书
商场父亲节活动方案
2014/08/27 职场文书
群众路线教育实践活动剖析材料
2014/09/30 职场文书
工作失职造成投诉的检讨书范文
2014/10/05 职场文书
年终工作总结范文2014
2014/11/27 职场文书