天天看點

詳解Three.js環境搭建與一個簡單例子

一、環境準備

1.開發工具選用WebStorm,因為WebStorm自帶了一個本地伺服器,而Three.js的很多特性需要在伺服器端才能展現。

詳解Three.js環境搭建與一個簡單例子

2.three.js庫的下載下傳與導入

3.打開調用three.js的html的網頁檔案時,需要借助WebStorm提供的本地伺服器,如圖所示,通過點選右上角浏覽器圖示而打開網頁檔案。

詳解Three.js環境搭建與一個簡單例子

二、檔案結構

詳解Three.js環境搭建與一個簡單例子

三、例子展示

詳解Three.js環境搭建與一個簡單例子

四、源碼展示

html檔案:

<!DOCTYPE html>

<html>

    <head>
        <title>Example</title>
        <script src="three.js"></script>
    </head>

    <body>

        <!-- 用于接收three.js畫面的輸出 -->
        <div id="WebGL-output"> </div>

        <script>

            // 當頁面加載完畢後,調用此函數,初始化畫面
            function init() {

                // 建立【場景】,場景用于存放各種物體、光源等
                var scene = new THREE.Scene();

                // 建立【相機】,相機相當于視角,可以定義視角(相機)的在【場景】中的朝向,遠近面等
                var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);

                // 建立【渲染器】,渲染器用于加載畫面,計算指定【相機】角度下浏覽器中【場景】的樣子
                var renderer = new THREE.WebGLRenderer();

                renderer.setClearColor(new THREE.Color(0xEEEEEE, 1.0));
                renderer.setSize(window.innerWidth, window.innerHeight);
                renderer.shadowMapEnabled = true;

                // 展示坐标軸
                var axes = new THREE.AxisHelper(50);
                scene.add(axes);

                // 建立地面
                var planeGeometry = new THREE.PlaneGeometry(60, 20, 1, 1);
                var planeMaterial = new THREE.MeshLambertMaterial({color: 0xffffff});
                var plane = new THREE.Mesh(planeGeometry, planeMaterial);
                plane.receiveShadow = true;

                // 将地面旋轉一定角度
                plane.rotation.x = -0.5 * Math.PI;
                plane.position.x = 15;
                plane.position.y = 0;
                plane.position.z = 0;

                // 将地面添加到場景中
                scene.add(plane);

                // 建立立方體
                var cubeGeometry = new THREE.BoxGeometry(4, 4, 4);
                var cubeMaterial = new THREE.MeshLambertMaterial({color: 0xff0000});
                var cube = new THREE.Mesh(cubeGeometry, cubeMaterial);
                cube.castShadow = true;

                // 設定立方體的位置坐标
                cube.position.x = -4;
                cube.position.y = 3;
                cube.position.z = 0;

                // 将立方體添加到場景中
                scene.add(cube);


                var sphereGeometry = new THREE.SphereGeometry(4, 20, 20);
                var sphereMaterial = new THREE.MeshLambertMaterial({color: 0x7777ff});
                var sphere = new THREE.Mesh(sphereGeometry, sphereMaterial);

                sphere.position.x = 20;
                sphere.position.y = 0;
                sphere.position.z = 2;
                sphere.castShadow = true;

                scene.add(sphere);

                // 設定相機的位置和視角朝向
                camera.position.x = -30;
                camera.position.y = 40;
                camera.position.z = 30;
                camera.lookAt(scene.position);

                // 增加環境光源
                var ambientLight = new THREE.AmbientLight(0x0c0c0c);
                scene.add(ambientLight);

                // 增加點光源
                var spotLight = new THREE.SpotLight(0xffffff);
                spotLight.position.set(-40, 60, -10);
                spotLight.castShadow = true;
                scene.add(spotLight);

                // 将畫面輸出到id為WebGL-output的div标簽中
                document.getElementById("WebGL-output").appendChild(renderer.domElement);

                // 渲染【場景】
                var step = 0;
                renderScene();

                function renderScene() {
                    // 立方體旋轉
                    cube.rotation.x += 0;
                    cube.rotation.y += 0.1;
                    cube.rotation.z += 0.1;

                    // 球體跳躍
                    step += 0.04;
                    sphere.position.x = 20 + ( 10 * (Math.cos(step)));
                    sphere.position.y = 4 + ( 10 * Math.abs(Math.sin(step)));

                    // 遞歸渲染
                    requestAnimationFrame(renderScene);
                    renderer.render(scene, camera);
                }

            }

            window.onload = init;

        </script>

    </body>

</html>      

五、附加

1.球體運動的算法介紹:

詳解Three.js環境搭建與一個簡單例子

2.對比 Three.js中的 requestAnimationFrame() 與原生js中的setInterval():

繼續閱讀