课程表

three.js课程

工具箱
速查手册

Three 鼠标控制

当前位置:免费教程 » JS/JS库/框架 » three.js

为了使用鼠标操作三维场景,可以借助three.js众多控件之一OrbitControls.js,可以在下载的three.js-master文件中找到(three.js-master\examples\js\controls)。 然后和引入three.js文件一样在html文件中引入控件OrbitControls.js。本节课的目的不是为了深入讲解OrbitControls.js,主要目的一方面向大家展示下threejs的功能,另一方面后面课程学习过程中经常会通过鼠标旋转、缩放模型进行代码调试。

本站使用下面这个JS地址:

  1. https://www.w3xue.com/example/threejs/solarsystem/files/OrbitControls.js

代码实现

OrbitControls.js控件支持鼠标左中右键操作和键盘方向键操作,具体代码如下,使用下面的代码替换上一节中的renderer.render(scene,camera);即可。

  1. function render() {
  2.   renderer.render(scene,camera);//执行渲染操作
  3. }
  4. render();
  5. var controls = new THREE.OrbitControls(camera,renderer.domElement);//创建控件对象
  6. controls.addEventListener('change', render);//监听鼠标、键盘事件

OrbitControls.js控件提供了一个构造函数THREE.OrbitControls(),把一个相机对象作为参数的时候,执行代码new THREE.OrbitControls(camera,renderer.domElement),浏览器会自动检测鼠标键盘的变化, 并根据鼠标和键盘的变化更新相机对象的参数,比如你拖动鼠标左键,浏览器会检测到鼠标事件,把鼠标平移的距离按照一定算法转化为相机的的旋转角度,你可以联系生活中相机拍照,即使景物没有变化,你的相机拍摄角度发生了变化,自然渲染器渲染出的结果就变化了,通过定义监听事件controls.addEventListener('change', render),如果你连续操作鼠标,相机的参数不停的变化,同时会不停的调用渲染函数render()进行渲染,这样threejs就会使用相机新的位置或角度数据进行渲染。

执行构造函数THREE.OrbitControls()浏览器会同时干两件事,一是给浏览器定义了一个鼠标、键盘事件,自动检测鼠标键盘的变化,如果变化了就会自动更新相机的数据, 执行该构造函数同时会返回一个对象,可以给该对象添加一个监听事件,只要鼠标或键盘发生了变化,就会触发渲染函数。 关于监听函数addEventListener介绍可以关注本站的HTML手册《HTML5事件》这一章节

场景操作

缩放:滚动—鼠标中键

旋转:拖动—鼠标左键

平移:拖动—鼠标右键

requestAnimationFrame()使用情况

如果threejs代码中通过requestAnimationFrame()实现渲染器渲染方法render()的周期性调用,当通过OrbitControls操作改变相机状态的时候,没必要再通过controls.addEventListener('change', render)监听鼠标事件调用渲染函数,因为requestAnimationFrame()就会不停的调用渲染函数。

  1. function render() {
  2.   renderer.render(scene,camera);//执行渲染操作
  3.   // mesh.rotateY(0.01);//每次绕y轴旋转0.01弧度
  4.   requestAnimationFrame(render);//请求再次执行渲染函数render
  5. }
  6. render();
  7. var controls = new THREE.OrbitControls(camera,renderer.domElement);//创建控件对象
  8. // 已经通过requestAnimationFrame(render);周期性执行render函数,没必要再通过监听鼠标事件执行render函数
  9. // controls.addEventListener('change', render)

注意开发中不要同时使用requestAnimationFrame()或controls.addEventListener('change', render)调用同一个函数,这样会冲突。

在线运行实例

转载本站内容时,请务必注明来自W3xue,违者必究。
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号