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 相关文章推荐
让iframe子窗体取父窗体地址栏参数(querystring)
Oct 13 Javascript
JavaScript Title、alt提示(Tips)实现源码解读
Dec 12 Javascript
在浏览器中获取当前执行的脚本文件名的代码
Jul 19 Javascript
轻松学习jQuery插件EasyUI EasyUI实现拖动基本操作
Nov 30 Javascript
JS实现星星评分功能实例代码(两种方法)
Jun 09 Javascript
vue子组件使用自定义事件向父组件传递数据
May 27 Javascript
前端跨域的几种解决方式总结(推荐)
Aug 16 Javascript
原生JavaScrpit中异步请求Ajax实现方法
Nov 03 Javascript
微信小程序实现城市列表选择
Jun 05 Javascript
用Cordova打包Vue项目的方法步骤
Feb 02 Javascript
详解vue beforeRouteEnter 异步获取数据给实例问题
Aug 09 Javascript
React Hook用法示例详解(6个常见hook)
Apr 28 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
如何用phpmyadmin设置mysql数据库用户的权限
2012/01/09 PHP
解析使用substr截取UTF-8中文字符串出现乱码的问题
2013/06/20 PHP
php中的比较运算符详解
2013/10/28 PHP
PHP 实现的将图片转换为TXT
2015/10/21 PHP
PHP开发之用微信远程遥控服务器
2018/01/25 PHP
PHP通过文件保存和更新信息的方法分析
2019/09/12 PHP
学习ExtJS table布局
2009/10/08 Javascript
JavaScript类和继承 prototype属性
2010/09/03 Javascript
Javascript中For In语句用法实例
2015/05/14 Javascript
JavaScript 常见安全漏洞和自动化检测技术
2015/08/21 Javascript
轻松实现javascript数据双向绑定
2015/11/11 Javascript
简单介绍JavaScript数据类型之隐式类型转换
2015/12/28 Javascript
JS实现的自定义水平滚动字体插件完整实例
2016/06/17 Javascript
Bootstrap3制作搜索框样式的方法
2016/07/11 Javascript
Javascript农历与公历相互转换的简单实例
2016/10/09 Javascript
Angularjs实现搜索关键字高亮显示效果
2017/01/17 Javascript
浅谈angular2的http请求返回结果的subcribe注意事项
2017/03/01 Javascript
JS如何实现在页面上快速定位(锚点跳转问题)
2017/08/14 Javascript
使用FormData实现上传多个文件
2018/12/04 Javascript
javascript之分片上传,断点续传的实际项目实现详解
2019/09/05 Javascript
基于js判断浏览器是否支持webGL
2020/04/18 Javascript
原生JavaScript实现弹幕组件的示例代码
2020/10/12 Javascript
[05:24]TI9采访——教练
2019/08/24 DOTA
python自动zip压缩目录的方法
2015/06/28 Python
selenium跳过webdriver检测并模拟登录淘宝
2019/06/12 Python
使用python制作游戏下载进度条的代码(程序说明见注释)
2019/10/24 Python
完美解决pycharm 不显示代码提示问题
2020/06/02 Python
Python Map 函数的使用
2020/08/28 Python
python实现登录与注册系统
2020/11/30 Python
驾驶员岗位职责
2014/01/29 职场文书
节约电力资源的建议书
2014/03/12 职场文书
新年主持词
2014/03/27 职场文书
综合实践活动总结
2014/05/05 职场文书
2015年幼儿园新年寄语
2014/12/08 职场文书
《唯一的听众》教学反思
2016/02/18 职场文书
手把手教你从零开始react+antd搭建项目
2021/06/03 Javascript