Three.js是一款開源的主流3D繪圖JS引擎,原做者是Mr.Doob,Three.js項目地址爲javascript
咱們知道WebGL是一種網頁3D繪圖標準,和jQuery簡化了HTML DOM操做同樣,Three.js 能夠簡化WebGL編程java
嚴格意義上講,除了WebGL以外,Three.js也支持其餘渲染器如Canvas 2D,所以即便在不支持WebGL的瀏覽器中,也能夠回退git
1.下載壓縮庫並將其包含在您的HTML中github
<script src="three.js"></script>
複製代碼
2.將其安裝並導入爲模塊npm
npm install three
//在使用Webpack或Browserify之類的工具捆綁文件,經過捆綁全部依賴項,它們能夠在瀏覽器中「 require('modules')」
var THREE = require('three');
var scene = new THREE.Scene();
//或者利用ES6導入語法
import * as THREE from 'three';
const scene = new THREE.Scene();
//只想導入three.js庫的選定部分,例如Scene:
import { Scene } from 'three';
const scene = new Scene();
複製代碼
若是你學習過WebGL程序,你應該瞭解建立一個WebGL程序,你基本上須要四個步驟:編程
這基本是一種過程式編程,而Three.js則不盡相同,其使用面向對象的方式來構建應用程序,包含3個基本對象:場景(scene),相機(camera),以及一個渲染器(render)。拿電影來類比的話,場景對應於整個佈景空間,相機是拍攝鏡頭,渲染器用來把拍攝好的場景轉換成膠捲(對於網頁來說,是電腦屏幕)。 場景和相機表明了3D觀察空間和數據模型,渲染器則包含了WebGL繪圖上下文和着色器。canvas
//建立場景
var scene = new THREE.Scene();
複製代碼
// Three.js的架構支持多種camera,這裏使用最經常使用的遠景相機(PerspectiveCamera),
//也就是相似人眼的觀察方式
var camera = new THREE
.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );
複製代碼
屬性介紹:瀏覽器
//渲染器,全部魔法效果都在這裏產生。除了咱們這裏使用的WebGLRenderer,three.js
//支持一些其它渲染器,基本上只是用來回退處理那些不支持WebGL的舊式用戶瀏覽器。
var renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );
複製代碼
除了建立renderer實例,咱們還須要設置渲染空間的尺寸,通常就使用目標屏幕的寬高(window.innerWidth和window.innerHeight),也能夠給定一個小尺寸。 若是你想保持渲染空間的尺寸,但使用一個較低的分辨率,你能夠在調用setSize的時候設置參數updateStyle爲false,好比 setSize(window.innerWidth/2, window.innerHeight/2, false) 將使用1/2分辨率來繪製你的應用程序,假定 緩存
上面的都是準備工做,電影佈景都好了,演員還沒進場。接下來咱們添加「演員」。安全
var geometry = new THREE.BoxGeometry( 1, 1, 1 );
var material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );
var cube = new THREE.Mesh( geometry, material );
scene.add( cube );
camera.position.z = 5;
複製代碼
爲了建立一個立方體,咱們須要使用盒子模型(BoxGeometry),這是一個包含立方體全部頂點和填充面的對象。 除了這個幾何模型(geometry)外,咱們還須要一個材料(material)來對其着色。Three.js支持多種材料,如今咱們只使用 網孔基礎材料(MeshBasicMaterial)。 全部材料都含有一個屬性對象。這裏簡單起見,咱們只提供了顏色值爲0x00ff00,表示綠色。這和CSS和Photoshop中16進制顏色值同樣。 第3件事是咱們須要一個網孔(Mesh)。網孔是用來承載幾何模型的一個對象,還能夠把材料應用到它上面,而後添加到場景中完成旋轉動畫。 默認狀況下,當咱們調用 scene.add() 時,對象將被添加到原點處,即座標點(0,0,0),這將致使相機和立方體發生空間重疊。爲了不這樣,咱們把相機(camera)的位置移出來一些。
若是你在新建做品中拷貝了前述的代碼,並點擊[運行],你仍是看不到任何東西,由於咱們尚未實際去渲染它。爲此,咱們須要一個 渲染循環(render loop)。
function render() {
requestAnimationFrame( render );
renderer.render( scene, camera );
}
render();
複製代碼
這將建立一個循環,以每秒60次的頻率來繪製場景。閱讀過本站相關教程的同窗,可能會熟悉requestAnimationFrame這個函數,它用來替代 setInterval, 這個新接口具有多個優勢,好比瀏覽器Tab切換後中止渲染以節約資源、和屏幕刷新同步避免無效刷新、在不支持該接口的瀏覽器中能安全回退爲setInterval。
若是你一步步完成前述的代碼,點擊[運行],你如今應該能夠看到一個綠色的立方體,如今咱們添加一點動畫,讓它轉動起來。 把以下代碼加在 render 函數中 renderer.render 這行代碼以前:
cube.rotation.x += 0.1;
cube.rotation.y += 0.1;
複製代碼
這樣咱們就使用Three.js完成了一個旋轉的立方體。基本上,若是要改變立方體的運動,咱們都是在render循環中處理。
var THREE = require('three');
var scene = new THREE.Scene();
var camera=new THREE.PerspectiveCamera(
75,
window.innerWidth/window.innerHeight,
0.1,1000
);
var renderer=new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );
var geometry=new THREE.BoxGeometry(1,1,1);
var material=new THREE.MeshBasicMaterial( { color: 0x00ff00 })
var cube=new THREE.Mesh(geometry,material);
scene.add( cube );
camera.position.z = 5;
var render=function() {
requestAnimationFrame( render );
cube.rotation.x += 0.1;
cube.rotation.y += 0.1;
renderer.render( scene, camera );
}
render();
複製代碼