WebGL是一種3D繪圖協議,它把JavaScript和OpenGL ES 2.0結合在一塊兒,經過增長OpenGL ES 2.0的一個JavaScript綁定,WebGL能夠爲HTML5 Canvas提供硬件3D加速渲染。javascript
WebGL技術標準免去了開發網頁專用渲染插件的麻煩,可被用於建立具備複雜3D結構的網站頁面,甚至能夠用來設計3D網頁遊戲。
原生的WebGl比較複雜,主要經過對頂點着色器和片元着色器的操做,來實現渲染,但實現起來比較複雜,須要必定的數學基礎,但更多的是須要學習基礎的耐心。css
Three.js是一個js的開源框架,它把webgl的全部東西都封裝好了,咱們再也不須要去了解webgl那些比較麻煩的細節,直接在此框架上進行開發,既方便,又快捷,並且很容易就能學習,相對於原生的webgl花100多行代碼畫幾個三角形,Three.js只須要幾行代碼就能實現更復雜的3D效果。html
下載地址: https://github.com/mrdoob/three.js。java
爲了之後的學習方便,首先是搭建一個萬能框架,全部的three.js開發均可以在此框架上進行。git
1<!DOCTYPE html>
2<html lang="en">
3<head>
4 <meta charset="UTF-8">
5 <title>Three.js</title>
6 <script src="../../../Import/three.js"></script>
7 <script src="../../../Import/stats.js"></script>
8 <script src="../../../Import/Setting.js"></script>
9 <style type="text/css">
10 div#canvas-frame {
11 border: none;
12 cursor: pointer;
13 width: 100%;
14 height: 850px;
15 background-color: #333333;
16 }
17 </style>
18 <script>
19 let renderer;
20 function initThree() {
21 //TODO
22 }
23 let camera;
24 function initCamera() {
25 //TODO
26 }
27 let scene;
28 function initScene() {
29 //TODO
30 }
31 let light;
32 function initLight() {
33 //TODO
34 }
35 let cube;
36 function initObject() {
37 //TODO
38 }
39
40 //提早定義好的一個功能文件,方便之後的每個程序調用
41 function initSetting() {
42 loadAutoScreen(camera,renderer);//自適應屏幕
43 loadFullScreen();//網頁全屏播放
44 loadStats();//性能檢測插件
45 }
46
47 function threeStart() {
48 initSetting();
49 initThree();
50 initCamera();
51 initScene();
52 initLight();
53 initObject();
54 animation();
55 }
56
57 function animation(){
58 renderer.clear();
59 renderer.render(scene,camera);
60 stats.update();
61 requestAnimationFrame(animation);
62 }
63
64 </script>
65
66</head>
67<body onload="threeStart()">
68<div id="canvas-frame"></div>
69</body>
70</html>
複製代碼
其中Setting.js是我寫在另外一個文件裏面的功能文件,把一些經常使用的功能放在裏面,方便之後寫的程序能夠直接去調用
Setting.js的代碼以下:github
1//進入全屏模式的函數
2function loadFullScreen() {
3 //進入全屏
4 function requestFullScreen(element) {
5 let de = document.querySelector(element) || document.documentElement;
6 if (de.requestFullscreen) {
7 de.requestFullscreen();
8 } else if (de.mozRequestFullScreen) {
9 de.mozRequestFullScreen();
10 } else if (de.webkitRequestFullScreen) {
11 de.webkitRequestFullScreen();
12 }
13 }
14
15//退出全屏
16 function exitFullscreen(element) {
17 let de = document.querySelector(element) || document.documentElement;
18 if (de.exitFullscreen) {
19 de.exitFullscreen();
20 } else if (de.mozCancelFullScreen) {
21 de.mozCancelFullScreen();
22 } else if (de.webkitCancelFullScreen) {
23 de.webkitCancelFullScreen();
24 }
25 }
26 //監聽事件
27 document.onkeydown = function (ev) {
28 keydownForScreen(ev);
29 }
30 //按鍵檢測,112對應鍵盤的F2,能夠檢測其餘的鍵位
31 function keydownForScreen(ev) {
32 if (ev.keyCode == 113) {
33 requestFullScreen();
34 requestFullScreen('body');
35 requestFullScreen('#main');
36 }
37 }
38}
39
40//加載性能監視器的函數
41function loadStats() {
42 stats = new Stats();
43 stats.domElement.style.position = 'absolute';
44 stats.domElement.style.left = '8px';
45 stats.domElement.style.top = '8px';
46 let body = document.getElementsByTagName('body');
47 body[0].appendChild(stats.domElement);
48}
49
50//屏幕適應的函數
51function loadAutoScreen(camera, renderer) {
52 window.addEventListener('resize', onResize, false);
53
54 function onResize() {
55 camera.aspect = window.innerWidth / window.innerHeight;
56 camera.updateProjectionMatrix();
57 renderer.setSize(window.innerWidth, window.innerHeight);
58 }
59}
複製代碼
還有另外一個引入的文件stats.js的下載地址:https://github.com/mrdoob/stats.jsweb
至此,一個萬能的架子就已經搭建完成,能夠開始編寫第一個three.js程序canvas