Three.js基礎探尋九——網格

  在學習了幾何形狀材質以後,咱們就能使用他們來建立物體了。最經常使用的一種物體就是網格(Mesh),網格是由頂點、邊、面等組成的物體;其餘物體包括線段(Line)、骨骼(Bone)、粒子系統(ParticleSystem)等。建立物體須要指定幾何形狀和材質,其中,幾何形狀決定了物體的頂點位置等信息,材質決定了物體的顏色、紋理等信息。 javascript

  本篇將介紹建立較爲經常使用的物體:網格,而後介紹如何修改物體的屬性。html

1.建立網格java

  在前幾篇中,咱們學習瞭如何建立幾何形狀材質,而網格的建立很是簡單,只要把幾何形狀與材質傳入其構造函數。最經常使用的物體是網格(Mesh),它表明包含點、線、面的幾何體,其構造函數是: canvas

Mesh(geometry, material)

  下面,讓咱們經過一個具體的例子瞭解如何建立網格:函數

var material = new THREE.MeshLambertMaterial({

    color: 0xffff00

});

var geometry = new THREE.CubeGeometry(1, 2, 3);

var mesh = new THREE.Mesh(geometry, material);

scene.add(mesh);

  若是material和geometry以後不會複用的話,也能夠合在一塊兒寫爲: 學習

var mesh = new THREE.Mesh(new THREE.CubeGeometry(1, 2, 3),

    new THREE.MeshLambertMaterial({

        color: 0xffff00

    })

);

scene.add(mesh);

  添加光照後,獲得的效果爲:測試

  若是不指定material,則每次會隨機分配一種wireframe爲true的材質,每次刷新頁面後的顏色是不一樣的,一種可能的效果是:spa

  源碼:3d

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>3.js測試9.1</title> 
    </head>
    <body onload="init()">
        <canvas id="mainCanvas" width="400px" height="300px" ></canvas>
    </body>
    <script type="text/javascript" src="js/three.min.js"></script>
    <script type="text/javascript">
        function init() {
            var renderer = new THREE.WebGLRenderer({
                canvas: document.getElementById('mainCanvas')
            });
            renderer.setClearColor(0x000000);
            var scene = new THREE.Scene();
            
            // camera
            var camera = new THREE.OrthographicCamera(-2.5, 2.5, 1.875, -1.875, 0.1, 100);
            camera.position.set(5, 5, 20);
            camera.lookAt(new THREE.Vector3(0, 0, 0));
            scene.add(camera);
            
            var material = new THREE.MeshLambertMaterial({
                color: 0xffff00
            });
//          var material = new THREE.MeshBasicMaterial({
//              color: 0xffff00,
//              wireframe: true
//          });
            var geometry = new THREE.CubeGeometry(1, 2, 3);
            var mesh = new THREE.Mesh(geometry, material);
            scene.add(mesh);
            
            var light = new THREE.DirectionalLight(0xffffff);
            light.position.set(20, 10, 5);
            scene.add(light);
            
            // render
            renderer.render(scene, camera);
        }
    </script>
</html>

 

 

 

2.修改屬性code

  2.1 修改材質

  除了在構造函數中指定材質,在網格被建立後,也能對材質進行修改:

var material = new THREE.MeshLambertMaterial({

    color: 0xffff00

});

var geometry = new THREE.CubeGeometry(1, 2, 3);

var mesh = new THREE.Mesh(geometry, material);

    scene.add(mesh);

mesh.material = new THREE.MeshLambertMaterial({

    color: 0xff0000

});

  最終顯示的顏色是紅色:

  源碼:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>3.js測試9.2</title> 
    </head>
    <body onload="init()">
        <canvas id="mainCanvas" width="400px" height="300px" ></canvas>
    </body>
    <script type="text/javascript" src="js/three.min.js"></script>  
    <script type="text/javascript">
        function init() {
            var renderer = new THREE.WebGLRenderer({
                canvas: document.getElementById('mainCanvas')
            });
            renderer.setClearColor(0x000000);
            var scene = new THREE.Scene();
            
            // camera
            var camera = new THREE.OrthographicCamera(-2.5, 2.5, 1.875, -1.875, 0.1, 100);
            camera.position.set(5, 5, 20);
            camera.lookAt(new THREE.Vector3(0, 0, 0));
            scene.add(camera);
            
            var material = new THREE.MeshLambertMaterial({
                color: 0xffff00
            });
            var geometry = new THREE.CubeGeometry(1, 2, 3);
            var mesh = new THREE.Mesh(geometry, material);
            scene.add(mesh);
            
            mesh.material = new THREE.MeshLambertMaterial({
                color: 0xff0000
            });
            
            var light = new THREE.DirectionalLight(0xffffff);
            light.position.set(20, 10, 5);
            scene.add(light);
            
            // render
            renderer.render(scene, camera);
        }
    </script>
</html>

  2.2 位置、縮放、旋轉

  位置、縮放、旋轉是物體三個經常使用屬性。因爲THREE.Mesh基礎自THREE.Object3D,所以包含scale、rotation、position三個屬性。它們都是THREE.Vector3實例,所以修改其值的方法是相同的,這裏以位置爲例。

  THREE.Vector3有x、y、z三個屬性,若是隻設置其中一個屬性,則能夠用如下方法:

mesh.position.z = 1;

  若是須要同時設置多個屬性,可使用如下兩種方法:

mesh.position.set(1.5, -0.5, 0);

  或者:

mesh.position = new THREE.Vector3(1.5, -0.5, 0);

  縮放對應的屬性是scale,旋轉對應的屬性是rotation,具體方法與上例相同,分別表示沿x、y、z三軸縮放或旋轉。

  源碼:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>3.js測試9.3</title>
    </head>
    <body onload="init()">
        <canvas id="mainCanvas" width="400px" height="300px" ></canvas>
    </body>
    <script type="text/javascript" src="js/three.min.js"></script>
    <script type="text/javascript">
        function init() {
            var renderer = new THREE.WebGLRenderer({
                canvas: document.getElementById('mainCanvas')
            });
            renderer.setClearColor(0x000000);
            var scene = new THREE.Scene();
            
            // camera
            var camera = new THREE.OrthographicCamera(-2.5, 2.5, 1.875, -1.875, 0.1, 100);
            camera.position.set(5, 5, 20);
            camera.lookAt(new THREE.Vector3(0, 0, 0));
            scene.add(camera);
            
            var material = new THREE.MeshLambertMaterial({
                color: 0xffff00
            });
            var geometry = new THREE.CubeGeometry(1, 2, 3);
            var mesh = new THREE.Mesh(geometry, material);
            scene.add(mesh);
            
            mesh.position.set(1.5, -0.5, 0);
            mesh.position = new THREE.Vector3(1.5, -0.5, 0);
            mesh.position.z = 1;
            
            var light = new THREE.DirectionalLight(0xffffff);
            light.position.set(20, 10, 5);
            scene.add(light);
            
            drawAxes(scene);
            
            // render
            renderer.render(scene, camera);
        }
        
        function drawAxes(scene) {
            // x-axis
            var xGeo = new THREE.Geometry();
            xGeo.vertices.push(new THREE.Vector3(0, 0, 0));
            xGeo.vertices.push(new THREE.Vector3(1, 0, 0));
            var xMat = new THREE.LineBasicMaterial({
                color: 0xff0000
            });
            var xAxis = new THREE.Line(xGeo, xMat);
            scene.add(xAxis);
            
            // y-axis
            var yGeo = new THREE.Geometry();
            yGeo.vertices.push(new THREE.Vector3(0, 0, 0));
            yGeo.vertices.push(new THREE.Vector3(0, 1, 0));
            var yMat = new THREE.LineBasicMaterial({
                color: 0x00ff00
            });
            var yAxis = new THREE.Line(yGeo, yMat);
            scene.add(yAxis);
            
            // z-axis
            var zGeo = new THREE.Geometry();
            zGeo.vertices.push(new THREE.Vector3(0, 0, 0));
            zGeo.vertices.push(new THREE.Vector3(0, 0, 1));
            var zMat = new THREE.LineBasicMaterial({
                color: 0x00ccff
            });
            var zAxis = new THREE.Line(zGeo, zMat);
            scene.add(zAxis);
        }
    </script>
</html>

 

 

整理自張雯莉《Three.js入門指南》

相關文章
相關標籤/搜索