1. 程式人生 > >Three.JS提升學習5:從外部載入幾何體

Three.JS提升學習5:從外部載入幾何體

本文學習資源來自《Three.js 開發指南:WebGL的JavaScript 3D庫》

從外部載入幾體體

支援的三維格式

Three.js 可以讀取幾種三維檔案格式,並從中匯入幾體體和網格,支援的檔案格式有:

格式 描述
JSON Three.js自己的JSON檔案格式
OBJ或MTL OBJ是一種簡單的三維檔案格式,由Wavefront Technologies建立。它是使用最廣泛的三維檔案格式,用來定義物件的幾體體。MTL檔案常同OBJ檔案一起使用。在一個MTL檔案中,用OBJ檔案定義物件的材質 Three.js還有一個可定製的OBJ匯出器,叫作OBJExporter.js,可以用來將Three.js中的模型匯出到一個OBJ檔案。
Collada 一種用基於XML的格式定義的數字內容的格式,也是一種被廣泛使用的格式。
STL STereoLithphy 立體成型術 的縮寫,廣泛用於快速成型。如三維印表機的模型檔案通常是STL檔案。Three.js還有一個可定製的STL匯出器,叫作STLExporter.js,可以用來將Three.js中的模型匯出到一個STL檔案。
CTM 由openCTM一種檔案格式
VTK Visualization Toolkit建立一種檔案格式,用來指定頂點和麵。
AWD 一種用於三維場景的二進位制格式,通常與http://away3d.com
引擎一起使用。這個載入程式不支援壓縮的AWD檔案。
Assimp Open asset import library (也稱為 Assimp ) 是一種匯入各種三維模型格式的標準方法。
VRML Virtual Reality Modeling Language的縮寫
Babylon 是一個三維JavaScript遊戲庫
PDB 由Protein Data bank建立,用於定義蛋白質的形狀。
PLY 這種格式的全稱是多邊形(Polygon)檔案格式,通常用來儲存三維掃描器的資訊

以Three.js的JSON格式儲存和載入

儲存和載入THREE.Mesh

            this.save = function () {
                var result = knot.toJSON();
                localStorage.setItem("json", JSON.stringify(result));
            };

            this.load = function () {

                scene.remove(loadedMesh);

                var json = localStorage.getItem("json");

                if (json) {
                    var loadedGeometry = JSON.parse(json);
                    var loader = new THREE.ObjectLoader();

                    loadedMesh = loader.parse(loadedGeometry);
                    loadedMesh.position.x -= 50;
                    scene.add(loadedMesh);
                }
            }

這裡將THREE.Mesh匯出為JSON,並儲存到了localStorage裡。

這裡寫圖片描述

儲存和載入場景

需要載入庫:

<script type="text/javascript" src="../libs/SceneLoader.js"></script>
<script type="text/javascript" src="../libs/SceneExporter.js"></script>
            this.exportScene = function () {
                var exporter = new THREE.SceneExporter();
                var sceneJson = JSON.stringify(exporter.parse(scene));
                localStorage.setItem('scene', sceneJson);
            };

            this.clearScene = function () {
                scene = new THREE.Scene();
            };

            this.importScene = function () {
                var json = (localStorage.getItem('scene'));
                var sceneLoader = new THREE.SceneLoader();

                sceneLoader.parse(JSON.parse(json), function (e) {
                    scene = e.scene;
                }, '.');
            }

使用 Blender

要從Blender中匯出Three.js醋,首先要將Three.js匯出器新增到Blender中。這裡省略該部分內容,可參考《Three.js開發指南》 P165 頁的介紹。
匯出的js大概是這樣的:
這裡寫圖片描述

材質:
這裡寫圖片描述

Three.js載入模型:

       var loader = new THREE.JSONLoader();
        loader.load('../assets/models/misc_chair01.js', function (geometry, mat) {
            mesh = new THREE.Mesh(geometry, mat[0]);

            mesh.scale.x = 15;
            mesh.scale.y = 15;
            mesh.scale.z = 15;

            scene.add(mesh);

        }, '../assets/models/');

執行效果:
這裡寫圖片描述

匯入三維格式

匯入這些三維格式都需要引入額外的js檔案。

OBJ和MTL

引入js

    <script type="text/javascript" src="../libs/OBJLoader.js"></script>

匯入模型再賦予材質的程式碼:

        var loader = new THREE.OBJLoader();
        loader.load('../assets/models/pinecone.obj', function (loadedMesh) {
            var material = new THREE.MeshLambertMaterial({color: 0x5C3A21});

            // loadedMesh is a group of meshes. For
            // each mesh set the material, and compute the information
            // three.js needs for rendering.
            loadedMesh.children.forEach(function (child) {
                child.material = material;
                child.geometry.computeFaceNormals();
                child.geometry.computeVertexNormals();
            });

            mesh = loadedMesh;
            loadedMesh.scale.set(100, 100, 100);
            loadedMesh.rotation.x = -0.3;
            scene.add(loadedMesh);
        });

執行示例:
這裡寫圖片描述

下面的示例是載入模型並直接賦予材質:

<!--引入js:-->
    <script type="text/javascript" src="../libs/OBJLoader.js"></script>
    <script type="text/javascript" src="../libs/MTLLoader.js"></script>
    <script type="text/javascript" src="../libs/OBJMTLLoader.js"></script>
        var loader = new THREE.OBJMTLLoader();

        loader.load('../assets/models/butterfly.obj', '../assets/models/butterfly.mtl', function (object) {

            // configure the wings
            var wing2 = object.children[5].children[0];
            var wing1 = object.children[4].children[0];

            wing1.material.opacity = 0.6;
            wing1.material.transparent = true;
            wing1.material.depthTest = false;
            wing1.material.side = THREE.DoubleSide;

            wing2.material.opacity = 0.6;
            wing2.material.depthTest = false;
            wing2.material.transparent = true;
            wing2.material.side = THREE.DoubleSide;

            object.scale.set(140, 140, 140);
            mesh = object;
            scene.add(mesh);

            object.rotation.x = 0.2;
            object.rotation.y = -1.3;
        });

這裡寫圖片描述

載入Collada模型(副檔名為.dae)

<!--引入 js-->

    <script type="text/javascript" src="../libs/ColladaLoader.js"></script>

<!--載入模型-->
        var loader = new THREE.ColladaLoader();

        var mesh;
        loader.load("../assets/models/dae/Truck_dae.dae", function (result) {
            mesh = result.scene.children[0].children[0].clone();
            mesh.scale.set(4, 4, 4);
            scene.add(mesh);
        });

效果:
這裡寫圖片描述

載入STL、CTM、VTK、AWD、Assimp、VRML和Babylon模型

類似上面的方式,省略相關內容。