vue2.x引入threejs的實(shí)例代碼
vue2.x引入threejs
npm安裝
npm install three
使用指定版本:
npm install three@<版本號(hào)>
其他插件
因?yàn)楸敬伍_發(fā)需要引入3D模型,所以需要使用 MTLLoader, OBJLoader兩種加載器,因?yàn)殚_發(fā)需求和
版本問(wèn)題, 最新版本自帶的加載器不能實(shí)現(xiàn)需求,所以需要額外引入three-obj-mtl-loader插件,并且threejs版本需要退到122版本;
npm安裝three-obj-mtl-loader
npm install three-obj-mtl-loader --save
實(shí)例
//-- html部分 -- 開始 --
<div class="three_box" id="container">
</div>
//-- html部分 -- 結(jié)束 --
import * as THREE from 'three';
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls"; // 控制器-控制相機(jī)運(yùn)行軌道
import { MTLLoader, OBJLoader } from 'three-obj-mtl-loader' //項(xiàng)目中使用到.obj文件和.mtl文件,故引入
mounted() {
let width = 1053 // dom寬度
let height = 473 // dom高度
this.scene = new THREE.Scene()// 運(yùn)行創(chuàng)建場(chǎng)景函數(shù)
let mtlLoader = new MTLLoader() //創(chuàng)建MTLLoader實(shí)例
let objLoader = new OBJLoader() //創(chuàng)建OBJLoader實(shí)例
let k = width / height // 寬高比
let camera = new THREE.PerspectiveCamera( 60, k, 1, 2000) //創(chuàng)建相機(jī),這個(gè)相機(jī)模擬人眼所看到的景象,近大遠(yuǎn)小沒(méi)參數(shù)分別為:
//fov — 攝像機(jī)視錐體垂直視野角度
//aspect — 攝像機(jī)視錐體長(zhǎng)寬比
//near — 攝像機(jī)視錐體近端面
//far — 攝像機(jī)視錐體遠(yuǎn)端面
camera.position.set( -500, 300, 300 )//設(shè)置相機(jī)位置
this.initDoor()//調(diào)用引入3D模型方法
this.initcao() //調(diào)用幾何圖形方法
//點(diǎn)光源
let point = new THREE.PointLight(0xffffff)
point.position.set(800, 800, 2000); //光源位置
this.scene.add(point); //光源添加進(jìn)場(chǎng)景
//環(huán)境光
let ambient = new THREE.AmbientLight(0xffffff); //設(shè)置環(huán)境光
this.scene.add(ambient) //講環(huán)境光加入場(chǎng)景
this.renderer = new THREE.WebGL1Renderer(); // 實(shí)例渲染器
this.renderer.setSize( width, height) //渲染器寬高
this.renderer.setClearColor(new THREE.Color('#07224e'), 1) //設(shè)置背景顏色
setTimeout(() => {
document.getElementById('container').appendChild(this.renderer.domElement)//將渲染器添加進(jìn)dom
}, 500)
this.animate()//調(diào)用動(dòng)畫效果
this.controls = new OrbitControls(this.camera, this.renderer.domElement) //添加相機(jī)和渲染器到控制器,實(shí)現(xiàn)滑動(dòng)
},
methods: {
initcao() {
let geometry = new THREE.BoxGeometry(3200, 1600, 8); //矩形平面
let material = new THREE.MeshLambertMaterial({ // 配置樣式,包括顏色 透明度等
color: new THREE.Color('#bcbfc6'),
transparent: true,
opacity: 0.3,
side: THREE.DoubleSide
});
let mesh = new THREE.Mesh(geometry, material); //網(wǎng)格模型對(duì)象Mesh
mesh.rotateX(-Math.PI / 2);
this.scene.add(mesh); //網(wǎng)格模型添加到場(chǎng)景中
},
initDoor() {
let that = this //后面回調(diào)會(huì)影響this指向
let mtlLoader = new MTLLoader()
let objLoader = new OBJLoader();
mtlLoader.load('static/door.mtl', function( material) { //引入模型.mtl文件,是3D模型的貼圖,如果不需要貼圖可以不使用,模型會(huì)只有一個(gè)框架
material.preload();
objLoader.setMaterials(material)
objLoader.load('static/door.obj', //引入模型.obj文件
function( obj) {
obj.position.z = -188 //調(diào)整模型位置
obj.position.x = -265 //調(diào)整模型位置
obj.position.y = 10 //調(diào)整模型位置
obj.rotateY(Math.PI / 2) //調(diào)整模型角度
obj.scale.set( 20, 20, 20 ) //調(diào)整模型放大縮小倍數(shù)
that.scene.add(obj) //模型添加進(jìn)場(chǎng)景
},
)
})
},
animate() {
//這里自己寫點(diǎn)要對(duì)模型進(jìn)行的操作
this.renderer.render(this.scene, this.camera);
requestAnimationFrame(this.animate) //這里按幀更新畫面,大概一秒60次左右
},
}
強(qiáng)調(diào)
如果在開發(fā)中需要引入3D模型,模型文件應(yīng)放在與src文件同級(jí)的static下,引入方式應(yīng)該是 'static/door.mtl'
如果在開發(fā)過(guò)程中出現(xiàn)threejs生成的canvas出現(xiàn)外邊框,只需要用css樣式修改,代碼如下:
.three_box {
width: 1053px;
height: 473px;
>>> canvas:focus-visible {
outline: 0px
}
}到此這篇關(guān)于vue2.x引入threejs的文章就介紹到這了,更多相關(guān)vue2.x引入threejs內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue項(xiàng)目中最新用到的一些實(shí)用小技巧
這篇文章主要給大家介紹了關(guān)于Vue項(xiàng)目中最新用到的一些實(shí)用小技巧,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用vue具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11
Electron?store及shareObject進(jìn)程間數(shù)據(jù)交互存儲(chǔ)功能封裝
這篇文章主要為大家介紹了Electron?store及shareObject進(jìn)程間數(shù)據(jù)交互存儲(chǔ)功能封裝示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
使用vue cli4.x搭建vue項(xiàng)目的過(guò)程詳解
這篇文章主要介紹了使用vue cli4.x搭建vue項(xiàng)目的過(guò)程,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
vue3響應(yīng)式Object代理對(duì)象的讀取示例詳解
這篇文章主要為大家介紹了vue3響應(yīng)式Object代理對(duì)象的讀取示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
vue-cli 自定義指令directive 添加驗(yàn)證滑塊示例
本篇文章主要介紹了vue-cli 自定義指令directive 添加驗(yàn)證滑塊示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
一文讀懂vue動(dòng)態(tài)屬性數(shù)據(jù)綁定(v-bind指令)
這篇文章主要介紹了vue動(dòng)態(tài)屬性數(shù)據(jù)綁定(v-bind指令)的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
前端實(shí)現(xiàn)pdf預(yù)覽功能的全過(guò)程(基于vue)
這篇文章主要給大家介紹了關(guān)于前端實(shí)現(xiàn)pdf預(yù)覽功能的相關(guān)資料,前端實(shí)現(xiàn)預(yù)覽最好的效果還是PDF,不會(huì)出現(xiàn)一些文字錯(cuò)亂和亂碼的問(wèn)題,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-09-09

