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中的运用上部
Nov 20 Javascript
JS删除数组元素的函数介绍
Mar 27 Javascript
c#程序员对TypeScript的认识过程
Jun 19 Javascript
jQuery实现三级菜单的代码
May 09 Javascript
原生js实现简单的Ripple按钮实例代码
Mar 24 Javascript
ECMAScript6--解构
Mar 30 Javascript
js使用html2canvas实现屏幕截取的示例代码
Aug 28 Javascript
详解Vue.js使用Swiper.js在iOS
Sep 10 Javascript
深入理解react 组件类型及使用场景
Mar 07 Javascript
移动端底部导航固定配合vue-router实现组件切换功能
Jun 13 Javascript
JS array数组检测方式解析
May 19 Javascript
Javascript confirm多种使用方法解析
Sep 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
smarty 原来也不过如此~~呵呵
2006/11/25 PHP
探讨如何使用SimpleXML函数来加载和解析XML文档
2013/06/07 PHP
PHP页面输出时js设置input框的选中值
2016/09/30 PHP
动态创建script标签实现跨域资源访问的方法介绍
2014/02/28 Javascript
js 获取浏览器版本以此来调整CSS的样式
2014/06/03 Javascript
jQuery中bind()方法用法实例
2015/01/19 Javascript
理解js对象继承的N种模式
2016/01/25 Javascript
基于JQuery的$.ajax方法进行异步请求导致页面闪烁的解决办法
2016/05/10 Javascript
angular route中使用resolve在uglify压缩后问题解决
2016/09/21 Javascript
原生js实现鼠标跟随效果
2017/02/28 Javascript
利用node.js写一个爬取知乎妹纸图的小爬虫
2017/05/03 Javascript
React 组件间的通信示例
2018/06/14 Javascript
vue中的数据绑定原理的实现
2018/07/02 Javascript
JavaScript学习笔记之数组基本操作示例
2019/01/09 Javascript
express + jwt + postMan验证实现持久化登录
2019/06/05 Javascript
基于Cesium绘制抛物弧线
2020/11/18 Javascript
[01:18:43]2014 DOTA2华西杯精英邀请赛5 24 iG VS DK
2014/05/25 DOTA
python列表与元组详解实例
2013/11/01 Python
用Python中的字典来处理索引统计的方法
2015/05/05 Python
python实现JAVA源代码从ANSI到UTF-8的批量转换方法
2015/08/10 Python
Python if语句知识点用法总结
2018/06/10 Python
Python中Numpy包的安装与使用方法简明教程
2018/07/03 Python
pandas去除重复列的实现方法
2019/01/29 Python
html5移动端价格输入键盘的实现
2019/09/16 HTML / CSS
广播体操比赛口号
2014/06/10 职场文书
记账会计岗位职责
2014/06/16 职场文书
小学生安全责任书
2014/07/25 职场文书
2014和解协议书范文
2014/09/15 职场文书
2015届本科毕业生自我鉴定
2014/09/27 职场文书
交警正风肃纪剖析材料
2014/10/29 职场文书
2014年幼儿园学期工作总结
2014/12/05 职场文书
有关水浒传的读书笔记
2015/06/25 职场文书
python面向对象版学生信息管理系统
2021/06/24 Python
教你快速构建一个基于nginx的web集群项目
2021/11/27 Servers
Android开发实现极为简单的QQ登录页面
2022/04/24 Java/Android
阿里面试Nacos配置中心交互模型是push还是pull原理解析
2022/07/23 Java/Android