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 相关文章推荐
JS随机漂浮广告代码具体实例
Nov 19 Javascript
js实例属性和原型属性示例详解
Nov 23 Javascript
使用jquery动态加载js文件的方法
Dec 24 Javascript
在JavaScript中使用NaN值的方法
Jun 05 Javascript
Bootstrap每天必学之媒体对象
Nov 30 Javascript
DOM中事件处理概览与原理的全面解析
Aug 16 Javascript
基于JS实现移动端向左滑动出现删除按钮功能
Feb 22 Javascript
vue绑定class与行间样式style详解
Aug 16 Javascript
详解webpack进阶之loader篇
Aug 23 Javascript
解决webpack+Vue引入iView找不到字体文件的问题
Sep 28 Javascript
ES6入门教程之Array.from()方法
Mar 23 Javascript
Nuxt的路由动画效果案例
Nov 06 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
PHP Zip解压 文件在线解压缩的函数代码
2010/05/26 PHP
Zend Framework上传文件重命名的实现方法
2016/11/25 PHP
Yii1.1中通过Sql查询进行的分页操作方法
2017/03/16 PHP
PHP自定义函数判断是否为Get、Post及Ajax提交的方法
2017/07/27 PHP
PHP实现自动发送邮件功能代码(qq 邮箱)
2017/08/18 PHP
JS中简单的实现像C#中using功能(有源码下载)
2007/01/09 Javascript
一个报数游戏js版(约瑟夫环问题)
2010/08/05 Javascript
超酷的网页音乐播放器DewPlayer使用方法
2010/12/18 Javascript
html+javascript实现可拖动可提交的弹出层对话框效果
2013/08/05 Javascript
使用js声明数组,对象在jsp页面中(获得ajax得到json数据)
2013/11/05 Javascript
jQuery验证插件 Validate详解
2014/11/20 Javascript
javascript中sort()的用法实例分析
2015/01/30 Javascript
jquery实现两个图片渐变切换效果的方法
2015/06/25 Javascript
JS+CSS实现表格高亮的方法
2015/08/05 Javascript
jQuery设置Easyui校验规则(推荐)
2016/11/21 Javascript
Angular2 Service实现简单音乐播放器服务
2017/02/24 Javascript
Node.js数据库操作之连接MySQL数据库(一)
2017/03/04 Javascript
vuex实现的简单购物车功能示例
2019/02/13 Javascript
ECharts地图绘制和钻取简易接口详解
2019/07/12 Javascript
原生js实现自定义滚动条组件
2021/01/20 Javascript
[01:01:22]VGJ.S vs OG 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
python 判断自定义对象类型
2009/03/21 Python
对python中数组的del,remove,pop区别详解
2018/11/07 Python
对Python Class之间函数的调用关系详解
2019/01/23 Python
在windows下使用python进行串口通讯的方法
2019/07/02 Python
SELENIUM自动化模拟键盘快捷键操作实现解析
2019/10/28 Python
Python数据可视化处理库PyEcharts柱状图,饼图,线性图,词云图常用实例详解
2020/02/10 Python
Python Dataframe常见索引方式详解
2020/05/27 Python
Python爬虫回测股票的实例讲解
2021/01/22 Python
美国首屈一指的高品质珠宝设计师和零售商:Allurez
2018/01/23 全球购物
美国班级戒指、帽子和礼服、毕业产品、年鉴:Balfour
2018/11/01 全球购物
Myholidays美国:在线旅游网站
2019/08/16 全球购物
迷你西餐厅创业计划书范文
2013/12/31 职场文书
北京离婚协议书范文2014
2014/09/29 职场文书
2015年党员发展工作总结
2015/05/13 职场文书
MySQL时间盲注的五种延时方法实现
2021/05/18 MySQL