天天看點

three.js一覽

前不久在微信公衆号上看到一篇文章介紹three.js實作webVR的文章,覺得前端真的是無所不能呀,下面是three.js官網的一個事例,自己簡單翻譯一遍增加印象和了解。

Creating a scene

Before we start

官網有提供一個html模闆,複制在自己的編輯器裡,并下載下傳three.js庫。

<!DOCTYPE html>
<html>
    <head>
        <meta charset=utf-8>
        <title>My first Three.js app</title>
        <style>
            body { margin: ; }
            canvas { width: %; height: % }
        </style>
    </head>
    <body>
        <script src="js/three.js"></script>
        <script>
            // Our Javascript will go here.
        </script>
    </body>
</html>
           

Creating the scene

運作three.js程式,我們需要三樣東西:

A scene, a camera, and a renderer

var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera( , window.innerWidth / window.innerHeight, ,  );

var renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );
           

我們現在建立了

the scene, our camera and the renderer

,在three.js中與camera有點不同的是,我們使用

PerspectiveCamera

1.第一個參數是視圖領域;

2.第二個參數是樣式比例,我們總是想要元素的width被height分割,或者,當你在寬屏放映老電影時,将會得到相同的結果,圖像看起來被壓扁了。

3.後面的參數是對象的near and far水準。意思就是,如果對象離camera距離過遠大于這個值或者太近小于這個值都不會被渲染出來。現在,不必太擔心這個值,你可能會使用其他值來得到一個更舒适的performance。

接下來便是渲染了。這裡使用了WebGLRenderer,three.js借用了一些别的東西以幫助使用者相容那些不支援webgl的浏覽器。

為了建立一個render執行個體,我們需要set size,我們使用了app的width,height設定size,這樣更好的填充我們的app.如果想要更好表現出來,可以使用比例子中設定的width,height更小的值。

如果你要使用一個低分辨率的來渲染建立的對象,那麼你需要調用

setSize

的第三個參數updateStyle,并設定為false,例如,

setSize(window.innerWidth/2, window.innerHeight/2, false)

最後,我們把render element添加至HTML document中。一個canvas元素便展現在裝置中。

添加下面代碼,便實作了一個3d視圖。

var geometry = new THREE.BoxGeometry( , ,  );
var material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );
var cube = new THREE.Mesh( geometry, material );
scene.add( cube );

camera.position.z = ;
           

建立一個3d元素,我們需要

BoxGeometry

,它是一個對象容納我們建立的點和填充物。點選了解更多

在這個幾何體中,我們需要添加一些material來粉飾它。three.js有許多material,但是卻堅持使用MeshBasicMaterial。所有的material都含有我們需要調用的屬性,為了友善,這裡隻使用了顔色屬性。

第三件我們需要做的就是mesh。一個mesh對象一個幾何體geometry,并調用metarial給這個幾何體,這樣我們就能渲染進scene中,并可以四處移動。

預設的,three.js使用scene.add(),由于,預設的會把對象添加至坐标(0,0,0)的位置,為了避免對象的覆寫,是以我們需要給對象來點偏移,就如例子中camera.position.z = 5;,移動camera一點點。

Rendering the scene

如果你隻是copy了上邊的代碼放在html檔案中,你将不會看到任何東西,因為我們還沒有render任何東西,是以,我們需要調用一個render loop。

function render() {
    requestAnimationFrame( render );
    renderer.render( scene, camera );
}
render();
           

我們将會調用一個loop會使得每秒render to draw the scene 60次.如果你是第一次寫game,你會問為什麼我們不使用setInteral?我們可以使用,但是requestAnimationFrame有一系列的好處,可能最重要的原因是當我們離開目前頁面,動畫會自動暫停,是以很好的節約了寶貴的程序空間。

Animating the cube

下面我們添加一些代碼讓它轉動起來

cube.rotation.x += ;
cube.rotation.y += ;
           

如此這個3d幾何體的每個部分都會動起來,當然,元素的移動或者改變都會經過the render loop.

ok,到此就完成了一個小demo,下面是完整的代碼:

<html>
    <head>
        <title>My first Three.js app</title>
        <style>
            body { margin: ; }
            canvas { width: %; height: % }
        </style>
    </head>
    <body>
        <script src="js/three.js"></script>
        <script>
            var scene = new THREE.Scene();
            var camera = new THREE.PerspectiveCamera( , window.innerWidth/window.innerHeight, ,  );

            var renderer = new THREE.WebGLRenderer();
            renderer.setSize( window.innerWidth, window.innerHeight );
            document.body.appendChild( renderer.domElement );

            var geometry = new THREE.BoxGeometry( , ,  );
            var material = new THREE.MeshBasicMaterial( { color:  } );
            var cube = new THREE.Mesh( geometry, material );
            scene.add( cube );

            camera.position.z = ;

            var render = function () {
                requestAnimationFrame( render );

                cube.rotation.x += ;
                cube.rotation.y += ;

                renderer.render(scene, camera);
            };

            render();
        </script>
    </body>
</html>
           

文章來源:http://threejs.org/docs/index.html#Reference/Extras.Geometries/BoxGeometry