threeJs導入3D皮卡丘.obj模型,使用.jpg貼圖,實現縮放旋轉查看功能

先來看下最終的效果,也可以訪問這裏查看案例。
threeJs導入3D皮卡丘.obj模型

導入obj模型

如果僅使用Mesh幾何而不加載任何外部資源,則網頁應直接在文件系統中運行,只需雙擊HTML文件打開即可以預覽。而由於3D模型是從外部加載進來的,由於瀏覽器的原始策略安全性限制,從文件系統加載將失敗,並出現安全異常。必須要啓動本地Web服務器來運行文件。

下載的模型文件如下:
threeJs導入3D皮卡丘.obj模型

默認情況下,three.js 僅包含少數幾個加載器(例如JSONLoader),其他加載器應單獨添加到應用程序中。例如:導入OBJ格式的模型,除了導入必要的three.js文件外,還需要導入OBJLoader.js文件。three.js中導入外部模型的加載器下載地址:https://github.com/mrdoob/three.js/tree/dev/examples/js/loaders

可以使用 script 標籤導入加載器文件

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

也可以使用 ES6 的 import 導入所需文件

import { OBJLoader } from 'three/examples/jsm/loaders/OBJLoader';

導入加載器後,就可以將模型添加到場景中了。語法在不同的加載程序中有所不同。OBJLoader的使用方法如下:

var objLoader = new THREE.OBJLoader();
//url 模型地址
//onLoad 加載完成後的回調函數,一般在這裏操作將模型添加到場景中
//onProgress 加載過程中觸發的函數,可以用來展示進度條
//onError 捕捉錯誤的回調函數
objLoader.load(url,onLoad,onProgress,onError);

function onLoad(object) {
    //......
    scene.add(object);	//將模型添加到場景中
});

function onProgress( xhr ) {
	if ( xhr.lengthComputable ) {
		var percentComplete = xhr.loaded / xhr.total * 100;
		console.log( 'model ' + Math.round( percentComplete, 2 ) + '% downloaded' );
	}
}

function onError() {}

設置模型的縮放比例:

object.scale.set(1, 1, 1);

設置模型的座標:

object.position.set(0, 0, 0);

添加模型周圍的立方體邊線:

var box = new THREE.Box3().setFromObject(object);
var box3Helper = new THREE.Box3Helper(box);
scene.add(box3Helper);

添加輔助工具x,y,z三維座標軸:

scene.add(new THREE.AxesHelper(20));

添加模型皮膚:

object.traverse(function(child) {
    if (child instanceof THREE.Mesh) {
        //設置模型皮膚
        child.material.map = THREE.ImageUtils.loadTexture( 'pikaqiu/p.jpg');
    }
});

PI屬性就是π,還表示了弧度π = 180°,Math.PI = 3.14 = 180°

Math.PI = 3.14 = 180°

案例的完整代碼如下:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>皮卡丘</title>
    </head>
    <body>
    </body>
    <script type="text/javascript" src="../js/three.js"></script>
    <script type="text/javascript" src="../js/loaders/OBJLoader.js"></script>
    <script type="text/javascript" src="../js/controls/OrbitControls.js"></script>
    <script>
        //場景
        var scene = new THREE.Scene();

        //相機
        var camera = new THREE.PerspectiveCamera(15, window.innerWidth / window.innerHeight, 0.1, 1000);
        //設置相機座標
        camera.position.set(50, 30, 100);

        //渲染器
        var renderer = new THREE.WebGLRenderer();
        //設置渲染器的顏色和大小
        renderer.setClearColor(0x404040);
        renderer.setSize(window.innerWidth, window.innerHeight);
        //將renderer(渲染器)的dom元素(renderer.domElement)添加到我們的HTML文檔中。
        //這就是渲染器用來顯示場景給我們看的<canvas>元素
        document.body.appendChild(renderer.domElement);
 
        //鼠標控制旋轉
        var controls = new THREE.OrbitControls(camera, renderer.domElement);
        //設置是否可以縮放,默認值爲true
        // controls.enableZoom = false;
        //設置鼠標交互,設置爲false之後,不能移動位置,不能旋轉物體,默認爲true
        // controls.enableRotate = false;
 
        //設置光源
        var light = new THREE.DirectionalLight(0xffffff, 0.5);
        light.position.setScalar(100);
        scene.add(light);
        scene.add(new THREE.AmbientLight(0xffffff, 0.5));

        //添加灰色網格線
        scene.add(new THREE.GridHelper(20, 20));

        //導入obj模型
        var objLoader = new THREE.OBJLoader();
        objLoader.load('/02-objectLoader/pikaqiu/pikaqiu.obj', function (object) {

            //設置模型縮放比例
            object.scale.set(1, 1, 1);
            //設置模型的座標
            object.position.set(0, 0, 0);

            //PI屬性就是π,還表示了弧度π = 180°,Math.PI = 3.14 = 180°
            //將模型z軸旋轉90度,三種寫法都可以
            // object.rotation.z = -Math.PI * 0.5;
            // object.rotateZ(-Math.PI * 0.5);
            // object.rotation.set(0,0,-Math.PI * 0.5);

            //繪製模型周圍的立方體連線
            // var box = new THREE.Box3().setFromObject(object);
            // var box3Helper = new THREE.Box3Helper(box);
            // scene.add(box3Helper);

            //輔助工具,x,y,z三維座標軸
            // scene.add(new THREE.AxesHelper(20));

            object.traverse(function(child) {
                if (child instanceof THREE.Mesh) {
                    //設置模型皮膚
                    child.material.map = THREE.ImageUtils.loadTexture( '/02-objectLoader/pikaqiu/p.jpg');
                }
            });
            //將模型添加到場景中
            scene.add(object);
        });

        function render() {
            //動畫循環渲染
            requestAnimationFrame(render);
            //渲染到頁面上
            renderer.render(scene, camera);
        }
        render();
    </script>
</html>

參考資料:
https://threejs.org/docs/index.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章