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
Feb 25 Javascript
SwfUpload在IE10上不出现上传按钮的解决方法
Jun 25 Javascript
JS操作CSS随机改变网页背景实现思路
Mar 10 Javascript
jQuery随机密码生成的方法
Mar 09 Javascript
Flash图片上传组件 swfupload使用指南
Mar 14 Javascript
网页中JS函数自动执行常用三种方法
Mar 30 Javascript
利用fecha进行JS日期处理
Nov 21 Javascript
JSON键值对序列化和反序列化解析
Jan 24 Javascript
js+html制作简单验证码
Feb 16 Javascript
javascript 判断一个对象为数组的方法
May 03 Javascript
vue2里面ref的具体使用方法
Oct 27 Javascript
在 Typescript 中使用可被复用的 Vue Mixin功能
Apr 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命名空间(Namespace)的使用详解
2013/05/04 PHP
php可生成缩略图的文件上传类实例
2014/12/17 PHP
WordPress的文章自动添加关键词及关键词的SEO优化
2016/03/01 PHP
PHP仿微信发红包领红包效果
2016/10/30 PHP
基于jquery的tab切换 js原理
2010/04/01 Javascript
使用cluster 将自己的Node服务器扩展为多线程服务器
2014/11/10 Javascript
js图片跟随鼠标移动代码
2015/11/26 Javascript
JavaScript中instanceof运算符的使用示例
2016/06/08 Javascript
JS实现的表格行上下移动操作示例
2016/08/03 Javascript
适用于手机端的jQuery图片滑块动画
2016/12/09 Javascript
基于JS实现9种不同的面包屑和分布式多步骤导航效果
2017/02/21 Javascript
ES6新特性之变量和字符串用法示例
2017/04/01 Javascript
JS常用正则表达式总结【经典】
2017/05/12 Javascript
JavaScript+HTML5实现的日期比较功能示例
2017/07/12 Javascript
Angular实现下载安装包的功能代码分享
2017/09/05 Javascript
vue展示dicom文件医疗系统的实现代码
2018/08/27 Javascript
初探Vue3.0 中的一大亮点Proxy的使用
2018/12/06 Javascript
element-ui多文件上传的实现示例
2019/04/10 Javascript
Vue实现图书管理小案例
2020/12/03 Vue.js
python list 合并连接字符串的方法
2013/03/09 Python
Python中__init__和__new__的区别详解
2014/07/09 Python
深入理解Python变量与常量
2016/06/02 Python
Python实现的多线程http压力测试代码
2017/02/08 Python
python 计算数组中每个数字出现多少次--“Bucket”桶的思想
2017/12/19 Python
Python机器学习算法之k均值聚类(k-means)
2018/02/23 Python
Python爬虫之正则表达式的使用教程详解
2018/10/25 Python
Python操作MySQL数据库的两种方式实例分析【pymysql和pandas】
2019/03/18 Python
python 如何使用find和find_all爬虫、找文本的实现
2020/10/16 Python
jupyter notebook快速入门及使用详解
2020/11/13 Python
狗狗玩具、零食和咀嚼物的月度送货服务:Super Chewer
2018/08/22 全球购物
后勤园长自我鉴定
2013/10/17 职场文书
2014法制宣传日活动总结
2014/07/09 职场文书
安全保卫工作竞聘材料
2014/08/25 职场文书
工程部岗位职责范本
2015/04/11 职场文书
日本动漫十大公认神作:第五现已全网禁播,《死亡笔记》在榜
2022/03/18 日漫
java项目构建Gradle的使用教程
2022/03/24 Java/Android