WebGL学习教程之Three.js学习笔记(第一篇)


Posted in Javascript onApril 25, 2019

webgl介绍

WebGL是一种3D绘图协议,它把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的一个JavaScript绑定,WebGL可以为HTML5 Canvas提供硬件3D加速渲染。

WebGL技术标准免去了开发网页专用渲染插件的麻烦,可被用于创建具有复杂3D结构的网站页面,甚至可以用来设计3D网页游戏。

 原生的WebGl比较复杂,主要通过对顶点着色器和片元着色器的操作,来实现渲染,但实现起来比较复杂,需要一定的数学基础,但更多的是需要学习基础的耐心。

Three.js介绍

Three.js是一个js的开源框架,它把webgl的所有东西都封装好了,我们不再需要去了解webgl那些比较麻烦的细节,直接在此框架上进行开发,既方便,又快捷,而且很容易就能学习,相对于原生的webgl花100多行代码画几个三角形,Three.js只需要几行代码就能实现更复杂的3D效果。

下载地址: https://github.com/mrdoob/three.js。

环境搭建

为了以后的学习方便,首先是搭建一个万能框架,所有的three.js开发都可以在此框架上进行。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Three.js</title>
  <script src="../../../Import/three.js"></script>
  <script src="../../../Import/stats.js"></script>
  <script src="../../../Import/Setting.js"></script>
  <style type="text/css">
    div#canvas-frame {
      border: none;
      cursor: pointer;
      width: 100%;
      height: 850px;
      background-color: #333333;
    }
  </style>
  <script>
    let renderer;
    function initThree() {
      //TODO
    }
    let camera;
    function initCamera() {
      //TODO
    }
    let scene;
    function initScene() {
      //TODO
    }
    let light;
    function initLight() {
      //TODO
    }
    let cube;
    function initObject() {
      //TODO
    }
    //提前定义好的一个功能文件,方便以后的每一个程序调用
    function initSetting() {
    loadAutoScreen(camera,renderer);//自适应屏幕
    loadFullScreen();//网页全屏播放
    loadStats();//性能检测插件
    }
    function threeStart() {
      initSetting();
      initThree();
      initCamera();
      initScene();
      initLight();
      initObject();
      animation();
    }
    function animation(){
      renderer.clear();
      renderer.render(scene,camera);
      stats.update();
      requestAnimationFrame(animation);
    }
  </script>
</head>
<body onload="threeStart()">
<div id="canvas-frame"></div>
</body>
</html>

其中Setting.js是我写在另一个文件里面的功能文件,把一些常用的功能放在里面,方便以后写的程序可以直接去调用

Setting.js的代码如下:

//进入全屏模式的函数
function loadFullScreen() {
  //进入全屏
  function requestFullScreen(element) {
    let de = document.querySelector(element) || document.documentElement;
    if (de.requestFullscreen) {
      de.requestFullscreen();
    } else if (de.mozRequestFullScreen) {
      de.mozRequestFullScreen();
    } else if (de.webkitRequestFullScreen) {
      de.webkitRequestFullScreen();
    }
  }
//退出全屏
  function exitFullscreen(element) {
    let de = document.querySelector(element) || document.documentElement;
    if (de.exitFullscreen) {
      de.exitFullscreen();
    } else if (de.mozCancelFullScreen) {
      de.mozCancelFullScreen();
    } else if (de.webkitCancelFullScreen) {
      de.webkitCancelFullScreen();
    }
  }
  //监听事件
  document.onkeydown = function (ev) {
    keydownForScreen(ev);
  }
  //按键检测,112对应键盘的F2,可以检测其他的键位
  function keydownForScreen(ev) {
    if (ev.keyCode == 113) {
      requestFullScreen();
      requestFullScreen('body');
      requestFullScreen('#main');
    }
  }
}
//加载性能监视器的函数
function loadStats() {
  stats = new Stats();
  stats.domElement.style.position = 'absolute';
  stats.domElement.style.left = '8px';
  stats.domElement.style.top = '8px';
  let body = document.getElementsByTagName('body');
  body[0].appendChild(stats.domElement);
}
//屏幕适应的函数
function loadAutoScreen(camera, renderer) {
  window.addEventListener('resize', onResize, false);
  function onResize() {
    camera.aspect = window.innerWidth / window.innerHeight;
    camera.updateProjectionMatrix();
    renderer.setSize(window.innerWidth, window.innerHeight);
  }
}

还有另一个引入的文件stats.js的下载地址:https://github.com/mrdoob/stats.js

至此,一个万能的架子就已经搭建完成,可以开始编写第一个three.js程序

总结

以上所述是小编给大家介绍的WebGL学习教程之Three.js学习笔记,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
5款Javascript颜色选择器
Oct 25 Javascript
jQuery EasyUI API 中文文档 - ComboTree组合树
Oct 11 Javascript
捕获浏览器关闭、刷新事件不同情况下的处理方法
Jun 02 Javascript
JQUERY表单暂存功能插件分享
Feb 23 Javascript
jQuery实现定位滚动条位置
Aug 05 Javascript
Jquery AJAX POST与GET之间的区别详细介绍
Oct 17 Javascript
angularjs 动态从后台获取下拉框的值方法
Aug 13 Javascript
vue通过滚动行为实现从列表到详情,返回列表原位置的方法
Aug 31 Javascript
vue 优化CDN加速的方法示例
Sep 19 Javascript
bootstrap table合并行数据并居中对齐效果
Oct 17 Javascript
Vue表单绑定的实例代码(单选按钮,选择框(单选时,多选时,用 v-for 渲染的动态选项)
May 13 Javascript
Vue实现将数据库中带html标签的内容输出(原始HTML(Raw HTML))
Oct 28 Javascript
Angular封装搜索框组件操作示例
Apr 25 #Javascript
Vue使用zTree插件封装树组件操作示例
Apr 25 #Javascript
详解javascript中的Error对象
Apr 25 #Javascript
Vue开发之封装上传文件组件与用法示例
Apr 25 #Javascript
vue2.0自定义指令示例代码详解
Apr 25 #Javascript
Vue开发之封装分页组件与使用示例
Apr 25 #Javascript
Vue注册组件命名时不能用大写的原因浅析
Apr 25 #Javascript
You might like
收音机的保养
2021/03/01 无线电
yii gridview实现时间段筛选功能
2017/08/15 PHP
JavaScript 新手24条实用建议[TUTS+]
2009/06/21 Javascript
24款非常有用的 jQuery 插件分享
2011/04/06 Javascript
javascript权威指南 学习笔记之变量作用域分享
2011/09/28 Javascript
javascript使用定时函数实现跳转到某个页面
2013/12/25 Javascript
一个简单的Node.js异步操作管理器分享
2014/04/29 Javascript
jQuery插件分享之分页插件jqPagination
2014/06/06 Javascript
nodejs实现发出蜂鸣声音(系统报警声)的方法
2017/01/18 NodeJs
jquery操作select取值赋值与设置选中实例
2017/02/28 Javascript
JavaScript 中的 this 简单规则
2017/09/19 Javascript
requireJS模块化实现返回顶部功能的方法详解
2017/10/16 Javascript
nodejs操作mongodb的填删改查模块的制作及引入实例
2018/01/02 NodeJs
Vue中使用vee-validate表单验证的方法
2018/05/09 Javascript
Angular 中使用 FineReport不显示报表直接打印预览
2019/08/21 Javascript
[55:32]2018DOTA2亚洲邀请赛 4.4 淘汰赛 EG vs LGD 第二场
2018/04/05 DOTA
安装Python的web.py框架并从hello world开始编程
2015/04/25 Python
详解Python实现多进程异步事件驱动引擎
2017/08/25 Python
pycharm如何实现跨目录调用文件
2020/02/28 Python
Pycharm无法打开双击没反应的问题及解决方案
2020/08/17 Python
Linux文件操作命令都有哪些
2016/07/23 面试题
总经理岗位职责
2013/11/09 职场文书
终止劳动合同协议书
2014/10/05 职场文书
2015高考寄语集锦
2015/02/27 职场文书
小学国庆节活动总结
2015/03/23 职场文书
办公经费申请报告
2015/05/15 职场文书
投诉信回复范文
2015/07/03 职场文书
2019求职信:应届生求职信范文
2019/04/24 职场文书
四年级作文之植物
2019/09/20 职场文书
导游词之山西祁县乔家大院
2019/10/14 职场文书
Windows下使用Nginx+Tomcat做负载均衡的完整步骤
2021/03/31 Servers
Springboot如何使用logback实现多环境配置?
2021/06/16 Java/Android
Redis主从配置和底层实现原理解析(实战记录)
2021/06/30 Redis
Java实战之课程信息管理系统的实现
2022/04/01 Java/Android
改造DE1103三步曲
2022/04/07 无线电
MongoDB支持的索引类型
2022/04/11 MongoDB