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 相关文章推荐
(function(){})()的用法与优点
Mar 11 Javascript
Javascript中正则表达式的全局匹配模式分析
Apr 26 Javascript
js鼠标滑轮滚动事件绑定的简单实例(兼容主流浏览器)
Jan 14 Javascript
深入理解javascript的执行顺序
Apr 04 Javascript
jquery中attr和prop的区别分析
Mar 16 Javascript
js获取页面description的方法
May 21 Javascript
AngularJS 与Bootstrap实现表格分页实例代码
Oct 14 Javascript
jQGrid动态填充select下拉框的选项值(动态填充)
Nov 28 Javascript
Vue2.0 多 Tab切换组件的封装实例
Jul 28 Javascript
原生javascript实现文件异步上传的实例讲解
Oct 26 Javascript
Vue 用Vant实现时间选择器的示例代码
Oct 25 Javascript
深入理解Vue的数据响应式
May 15 Vue.js
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数组合并array_merge()函数使用注意事项
2014/06/19 PHP
PHP的Yii框架中移除组件所绑定的行为的方法
2016/03/18 PHP
JavaScript 工具库 Cloudgamer JavaScript Library v0.1 发布
2009/10/29 Javascript
Javascript Math ceil()、floor()、round()三个函数的区别
2010/03/09 Javascript
fancybox1.3.1 基于Jquery的插件在IE中图片显示问题
2010/10/01 Javascript
各浏览器对click方法的支持差异小结
2011/07/31 Javascript
getJSON调用后台json数据时函数被调用两次的原因猜想
2013/09/29 Javascript
js有序数组的连接问题
2013/10/01 Javascript
extjs_02_grid显示本地数据、显示跨域数据
2014/06/23 Javascript
JavaScript中的全局对象介绍
2015/01/01 Javascript
javascript运动详解
2015/07/06 Javascript
HTML5 Shiv完美解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法
2015/11/25 Javascript
JavaScript中关联原型链属性特性
2016/02/13 Javascript
javascript Promise简单学习使用方法小结
2016/05/17 Javascript
原生js验证简洁注册登录页面
2016/12/17 Javascript
JavaScript获取当前时间向前推三个月的方法示例
2017/02/04 Javascript
vue2手机APP项目添加开屏广告或者闪屏广告
2017/11/28 Javascript
[01:32]TI奖金增速竟因它再创新高!DOTA2勇士令状不朽珍藏Ⅰ饰品欣赏
2018/05/18 DOTA
python去除所有html标签的方法
2015/05/05 Python
Django中模版的子目录与include标签的使用方法
2015/07/16 Python
一步步解析Python斗牛游戏的概率
2016/02/12 Python
python之文件的读写和文件目录以及文件夹的操作实现代码
2016/08/28 Python
解决pip install的时候报错timed out的问题
2018/06/12 Python
Python3实现爬取简书首页文章标题和文章链接的方法【测试可用】
2018/12/11 Python
postman传递当前时间戳实例详解
2019/09/14 Python
python读写Excel表格的实例代码(简单实用)
2019/12/19 Python
matplotlib绘制鼠标的十字光标的实现(内置方式)
2021/01/06 Python
详解Python 中的 defaultdict 数据类型
2021/02/22 Python
美国知名的在线旅游服务网站:Priceline
2016/07/23 全球购物
2014端午节活动策划方案
2014/01/27 职场文书
保险公司演讲稿
2014/09/02 职场文书
委托证明书
2014/09/17 职场文书
2014年前台接待工作总结
2014/12/05 职场文书
2016新年慰问信范文
2015/03/25 职场文书
《酸的和甜的》教学反思
2016/02/18 职场文书
解决Mysql中的innoDB幻读问题
2022/04/29 MySQL