vue使用three.js,并加載obj模型mtl貼圖

一,下載相關(guān)插件

npm install three --save?

npm install?three-obj-mtl-loader?

npm install?three-orbit-controls??

二,建立一個(gè)帶有坐標(biāo)系的三維空間

1.引入插件

import * as THREE from "three";? //引入three.js??

import { OBJLoader, MTLLoader } from "three-obj-mtl-loader";???//引入加載外部模型

const OrbitControls = require("three-orbit-controls")(THREE);??//引入控制器

2.定義一個(gè)帶有id的div

? ?<template>

? <div id="container" ref="container"></div>

</template>

3.自定義變量

data() {

? ? return {

? ? ? scene: null, // 場景

? ? ? camera: null, // 相機(jī)

? ? ? renderer: null, // 渲染

? ? ? controls: null, // 控制器

? ? };

? },

4.方法事件

//初始化環(huán)境

? ? initScene() {

? ? ? this.scene = new THREE.Scene();

? ? ? var axesHelper = new THREE.AxesHelper(15); // 建立xyz坐標(biāo)軸,紅色代表 X 軸. 綠色代表 Y 軸. 藍(lán)色代表 Z 軸.長度15

? ? ? this.scene.add(axesHelper);

? ? ? var AmbientLight = new THREE.AmbientLight(0xc0560c); // 環(huán)境光

? ? ? this.scene.add(AmbientLight);

? ? ? let DirectionalLight = new THREE.DirectionalLight(0xdfebff, 0.45); // 平行光

? ? ? this.scene.add(DirectionalLight);

? ? },? ??

// 初始化相機(jī)

? ? initCamera() {

? ? ? this.camera = new THREE.PerspectiveCamera(

? ? ? ? 75,

? ? ? ? window.innerWidth / window.innerHeight,

? ? ? ? 0.1,

? ? ? ? 1000

? ? ? );

? ? ? this.camera.position.set(50, 50, 50); // 調(diào)整相機(jī)方位

? ? ? this.camera.lookAt(new THREE.Vector3(0, 0, 0)); // 讓相機(jī)指向原點(diǎn)

? ? },

? ? // 初始化加載器

? ? initRenderer() {

? ? ? this.renderer = new THREE.WebGLRenderer();

? ? ? let container = document.getElementById("container");

? ? ? this.renderer.setSize(container.offsetWidth, container.offsetHeight);

? ? ? this.renderer.setClearColor(0xffd2ff, 1.0); // 背景光

? ? ? container.appendChild(this.renderer.domElement);

? ? },? ??

// 加載初始化

? ? init() {

? ? ? this.initScene();

? ? ? this.initCamera();

? ? ? this.initRenderer();

? ? },

? ? // 刷新動(dòng)畫

? ? animate() {??

? ? // requestAnimationFrame 應(yīng)運(yùn)而生,它采用的是系統(tǒng)時(shí)間間隔(約16.7ms),保持最佳繪制效果與效率,

? ? ? // 使各種網(wǎng)頁動(dòng)畫有一個(gè)統(tǒng)一的刷新機(jī)制,從而節(jié)省系統(tǒng)資源,提高系統(tǒng)性能。

? ? ? requestAnimationFrame(this.animate);

? ? ? this.renderer.render(this.scene, this.camera);

? ? },

5.加載初始化方法以及刷新動(dòng)畫事件啟動(dòng)??

mounted() {

? ? this.init();

? ? this.animate();

? },

6.效果圖

三,加載mtl貼圖和obj模型,并加入控制

1,加載模型的文件存放位置,vue2是主目錄下的static目錄,vue3是主目錄的public目錄

? ? loadMTL() {

? ? ? let that = this;

? ? ? let mtlLoader = new MTLLoader();

? ? ? let objloader = new OBJLoader();

? ? ? mtlLoader.load(`/static/model/car/file.mtl`, function (materials) {

? ? ? ? materials.preload();

? ? ? ? objloader.load("/static/model/car/file.obj", function (obj) {

? ? ? ? ? obj.position.set(0, -20, 0); // 平移位置

? ? ? ? ? that.scene.add(obj);

? ? ? ? });

? ? ? });

? ? },

2.? ? 初始化控制器

? ? initOrbitControls() {

? ? ? let controls = new OrbitControls(this.camera, this.renderer.domElement);

? ? ? controls.enableDamping = true; // 將其設(shè)置為true以啟用阻尼(慣性),這將給控制器帶來重量感。默認(rèn)值為false。

? ? ? controls.enableZoom = true; // 啟用或禁用攝像機(jī)的縮放。

? ? ? controls.autoRotate = false; // 將其設(shè)為true,以自動(dòng)圍繞目標(biāo)旋轉(zhuǎn)。

? ? ? controls.autoRotateSpeed = 3; // 當(dāng) .autoRotate : Boolean為true時(shí),圍繞目標(biāo)旋轉(zhuǎn)的速度將有多快,默認(rèn)值為2.0,相當(dāng)于在60fps時(shí)每旋轉(zhuǎn)一次需要30秒。

? ? ? controls.enablePan = true; // 啟用或禁用攝像機(jī)平移,默認(rèn)為true。

? ? ? controls.enableKeys = true; // 啟用或禁用鍵盤控制。

? ? ? controls.keyPanSpeed = 7; // 當(dāng)使用鍵盤按鍵的時(shí)候,相機(jī)平移的速度有多快。默認(rèn)值為每次按下按鍵時(shí)平移7像素。

? ? ? controls.keys = {

? ? ? ? // 這一對(duì)象包含了用于控制相機(jī)平移的按鍵代碼的引用。默認(rèn)值為4個(gè)箭頭(方向)鍵。

? ? ? ? LEFT: 37,

? ? ? ? UP: 38,

? ? ? ? RIGHT: 39,

? ? ? ? BOTTOM: 40,

? ? ? };

3.在加入控制器后,動(dòng)畫刷新事件中加入一行代碼

// 刷新動(dòng)畫

? ? animate() {

? ? ? requestAnimationFrame(this.animate);

? ? ? this.controls.update();

? ? ? this.renderer.render(this.scene, this.camera);

? ? },

4.效果圖


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容