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 相关文章推荐
11款基于Javascript的文件管理器
Oct 25 Javascript
读jQuery之十二 删除事件核心方法
Jul 31 Javascript
js中的数组Array定义与sort方法使用示例
Aug 29 Javascript
防止jQuery ajax Load使用缓存的方法小结
Feb 22 Javascript
jquery如何根据值设置默认的选中项
Mar 17 Javascript
实例代码讲解jquery easyui动态tab页
Nov 17 Javascript
JS 日期与时间戮相互转化的简单实例
Jun 22 Javascript
如何理解jQuery中的ajaxSubmit方法
Mar 13 Javascript
浅谈node中的cluster集群
Jun 02 Javascript
JavaScript中concat复制数组方法浅析
Jan 20 Javascript
详解vue引入子组件方法
Feb 12 Javascript
JavaScript仿京东秒杀倒计时
Mar 17 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生成SessionID和图片校验码的思路和实现代码
2009/03/10 PHP
php中利用post传递字符串重定向的实现代码
2011/04/21 PHP
destoon实现底部添加你是第几位访问者的方法
2014/07/15 PHP
PHP读取CURL模拟登录时生成Cookie文件的方法
2014/11/04 PHP
php+ajax实现无刷新动态加载数据技术
2015/04/28 PHP
PHP操作MySQL的mysql_fetch_* 函数的常见用法教程
2015/12/25 PHP
php判断是否连接上网络的方法实例详解
2016/12/14 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
2018/06/13 PHP
让焦点自动跳转
2006/07/01 Javascript
经验几则 推荐
2006/09/05 Javascript
js 得到文件后缀(通过正则实现)
2013/07/08 Javascript
jquery动感漂浮导航菜单代码分享
2020/04/15 Javascript
简单的vue-resourse获取json并应用到模板示例
2017/02/10 Javascript
js实现简易垂直滚动条
2017/02/22 Javascript
js获取地址栏参数的两种方法
2017/06/27 Javascript
vue.js过滤器+ajax实现事件监听及后台php数据交互实例
2018/05/22 Javascript
webpack4.x开发环境配置详解
2018/08/04 Javascript
Vue源码解析之数组变异的实现
2018/12/04 Javascript
mocha的时序规则讲解
2019/02/16 Javascript
Vue常用传值方式、父传子、子传父及非父子实例分析
2020/02/24 Javascript
python BeautifulSoup使用方法详解
2013/11/21 Python
Python中使用scapy模拟数据包实现arp攻击、dns放大攻击例子
2014/10/23 Python
python3如何将docx转换成pdf文件
2018/03/23 Python
对python3中pathlib库的Path类的使用详解
2018/10/14 Python
Django基础知识 URL路由系统详解
2019/07/18 Python
matplotlib基础绘图命令之bar的使用方法
2020/08/13 Python
Python自动创建Excel并获取内容
2020/09/16 Python
Python timeit模块原理及使用方法
2020/10/10 Python
使用HTML5 Canvas绘制直线或折线等线条的方法讲解
2016/03/14 HTML / CSS
生产管理的三大手法
2013/11/11 职场文书
本科毕业生自荐信
2014/05/26 职场文书
售房委托书
2014/08/30 职场文书
公务员政审材料
2014/12/23 职场文书
小学语文教学随笔
2015/08/14 职场文书
节约用水广告语60条
2019/11/14 职场文书
为什么node.js不适合大型项目
2021/04/28 Javascript