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 相关文章推荐
javascript的propertyIsEnumerable()方法使用介绍
Apr 09 Javascript
ECMAScript6的新特性箭头函数(Arrow Function)详细介绍
Jun 07 Javascript
js实现延时加载Flash的方法
Nov 26 Javascript
妙用Bootstrap的 popover插件实现校验表单提示功能
Aug 29 Javascript
JS常用加密编码与算法实例总结
Dec 22 Javascript
微信小程序 图片绝对定位(背景图片)
Apr 05 Javascript
微信小程序实现文字跑马灯效果
May 26 Javascript
vue axios 给生产环境和发布环境配置不同的接口地址(推荐)
May 08 Javascript
让Vue也可以使用Redux的方法
May 23 Javascript
Nginx设置为Node.js的前端服务器方法总结
Mar 27 Javascript
vue中v-show和v-if的异同及v-show用法
Jun 06 Javascript
如何基于JS截获动态代码
Dec 25 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 输出缓存详解
2009/06/20 PHP
joomla jce editor 解决上传中文名文件失败问题
2013/06/09 PHP
php版微信发红包接口用法示例
2016/09/23 PHP
浅谈Laravel模板实体转义带来的坑
2019/10/22 PHP
JavaScript与Div对层定位和移动获得坐标的实现代码
2010/09/08 Javascript
jQuery 选择表格(table)里的行和列及改变简单样式
2012/12/15 Javascript
12行javascript代码绘制一个八卦图
2015/04/02 Javascript
jQuery操作基本控件方法实例分析
2015/12/31 Javascript
浏览器复制插件zeroclipboard使用指南
2016/03/26 Javascript
巧方法 JavaScript获取超链接的绝对URL地址
2016/06/14 Javascript
vue.js国际化 vue-i18n插件的使用详解
2017/07/07 Javascript
JavaScript实现QQ列表展开收缩扩展功能
2017/10/30 Javascript
vue input实现点击按钮文字增删功能示例
2019/01/29 Javascript
详解50行代码,Node爬虫练手项目
2019/04/22 Javascript
微信小程序 自定义复选框实现代码实例
2019/09/04 Javascript
JavaScript中数组去重的5种方法
2020/07/04 Javascript
vue2.0 解决抽取公用js的问题
2020/07/31 Javascript
js实现有趣的倒计时效果
2021/01/19 Javascript
python赋值操作方法分享
2013/03/23 Python
Python中encode()方法的使用简介
2015/05/18 Python
浅析Python中return和finally共同挖的坑
2017/08/18 Python
Python基础练习之用户登录实现代码分享
2017/11/08 Python
使用python获取csv文本的某行或某列数据的实例
2018/04/03 Python
Django中反向生成models.py的实例讲解
2018/05/30 Python
python人民币小写转大写辅助工具
2018/06/20 Python
python3 实现函数写文件路径的正确方法
2019/11/27 Python
Python:合并两个numpy矩阵的实现
2019/12/02 Python
pytorch 自定义卷积核进行卷积操作方式
2019/12/30 Python
Python 使用SFTP和FTP实现对服务器的文件下载功能
2020/12/17 Python
幼儿园长自我鉴定
2013/10/17 职场文书
建筑行业的大学生自我评价
2013/12/08 职场文书
生日寄语大全
2014/04/08 职场文书
初中生期末评语大全
2014/04/24 职场文书
小班教师个人总结
2015/02/05 职场文书
Spring Data JPA的Audit功能审计数据库的变更
2021/06/26 Java/Android
漫画「请问您今天要来点兔子吗?」最新杂志彩页公开
2022/03/24 日漫