three.js?Mool3D模型類的使用
Model類
之前的引擎介紹文章中有人留言想了解如何通過引擎加載自定義的模型場(chǎng)景,這篇文章將詳細(xì)介紹如何加載場(chǎng)景及場(chǎng)景配置文件的說明~
場(chǎng)景加載
加載場(chǎng)景主要使用引擎中的model類來實(shí)現(xiàn),引擎中model類主要功能有配置文件模型加載、場(chǎng)景切換、單一自定義模型加載、場(chǎng)景下動(dòng)畫的控制等~
//下方為簡單場(chǎng)景的加載
import { Viewer } from "../Threejs/index";
export class Index extends Viewer {
constructor(options) {
super(options);
this.initModel();
}
}
推薦通過繼承主類的方式擴(kuò)展業(yè)務(wù)代碼,上方是一個(gè)最簡單的場(chǎng)景加載示例。細(xì)心的同學(xué)可以發(fā)現(xiàn)上方只是初始化了一個(gè)model類而已如何完成場(chǎng)景的加載的,當(dāng)然完成場(chǎng)景加載還需要一個(gè)觸發(fā)場(chǎng)景的條件,這我們通??梢栽谌萜魑募袑?shí)現(xiàn)。下方就是最簡單的場(chǎng)景加載容器~
//vue文件
//初始化
const init = () => {
const el = refmap.value;
sceneA = new Index({
el: el as HTMLElement,
tween: TWEEN,
path: "../public/scene/", //基礎(chǔ)路徑
});
setScene(1);
};
//切換場(chǎng)景
const setScene = (id) => {
switch (id) {
case 1:
sceneA.setScene(1, () => {
//場(chǎng)景加載成功回調(diào)
});
sceneA.flyTo({ //相機(jī)位置
position: [0, 5, 6],
controls: [0, 0, 0],
duration: 2000,
});
break;
default:
break;
}
};
場(chǎng)景配置文件
上方代碼通過場(chǎng)景id加載場(chǎng)景,那是如何知道需要加載哪些模型呢?引擎通過config.json文件約束不同場(chǎng)景下所依賴的模型文件,配置文件存放路徑為基礎(chǔ)路徑下(../public/scene/) 下方詳細(xì)介紹配置文件~
[
{
"name": "mool", //名稱
"target": false, //是否被鼠標(biāo)拾取
"layeridx": 1, //場(chǎng)景id
"scale": 1, //場(chǎng)景縮放
"positionX": 50, //場(chǎng)景初始位置
"positionY": 120,
"positionZ": 170,
"layers": [ //場(chǎng)景模型配置對(duì)象
{
"name": "./glb/building1.glb"
},
{
"name": "./glb/building2.glb"
}
]
}
......
]
遞歸處理場(chǎng)景模型
照著上方的操作,我們完成了場(chǎng)景的加載。這時(shí)場(chǎng)景已經(jīng)呈現(xiàn)在畫面上,如果我們需要修改場(chǎng)景模型的材質(zhì)等操作怎么做呢? 當(dāng)然模型類中也考慮到這一點(diǎn),提供了一個(gè)回調(diào)處理解碼的模型,具體怎么操作見下方~
constructor(options) {
super(options);
this.initModel();
//這是在加載場(chǎng)景模型之前執(zhí)行的回調(diào),所以建議放在初始化類時(shí)完成回調(diào)的注冊(cè),這樣會(huì)在模型加載過程中遞歸去修改模型
this.model.deepFunction.push(({ e , item }) => {
// e:模型碎片Mesh / item:場(chǎng)景配置文件
e.scale.set(300, 300, 300);
});
}
不推薦什么方法都放在constructor中去調(diào)用,由于模型加載時(shí)才會(huì)去設(shè)置當(dāng)前場(chǎng)景的id,如在constructor中初始化天空和燈光等,會(huì)出現(xiàn)無效的情況,出現(xiàn)這種情況是因?yàn)閳?chǎng)景id默認(rèn)值為1,都加載到場(chǎng)景1中去了。所以模型類提供一個(gè)場(chǎng)景加載成功的回調(diào),在里面初始化場(chǎng)景需要的一些修飾類如燈光、天空、環(huán)境貼圖等~
sceneA.setScene(1, () => {
//場(chǎng)景加載成功回調(diào)
sceneA.initEnvironment({
path: "exr.exr",
type: "exr",
});
});
加載獨(dú)立模型
如何加載獨(dú)立于場(chǎng)景配置文件之外的模型呢?模型類提供GLB和FBX兩種類型模型加載方法,具體見下方說明~
//加載glb/gltf模型
this.model.loadModel(
"../public/scene/glb/walk.glb",
this.sceneidx,
(glb, animations) => {
glb:為模型對(duì)象
animations:模型動(dòng)畫
...模型自定義修改
}
);
//加載fbx模型
this.model.loadFbxModel(
"../public/scene/glb/walk.fbx",
this.sceneidx,
(fbx, animations) => {
fbx:為模型對(duì)象
animations:模型動(dòng)畫
...模型自定義修改
}
);
注意上方只提供加載模型,不會(huì)主動(dòng)添加到場(chǎng)景中,需修改定制化模型參數(shù)之后手動(dòng)將其add到場(chǎng)景中~
動(dòng)畫
模型類中提供兩種執(zhí)行動(dòng)畫的方法,一種是執(zhí)行場(chǎng)景下的所有動(dòng)畫,一種是執(zhí)行某個(gè)名稱的動(dòng)畫。具體使用見下方說明~
//執(zhí)行場(chǎng)景下的所有動(dòng)畫 this.model.playAllClipes(this.sceneidx);//傳入場(chǎng)景的id //執(zhí)行某名稱的動(dòng)畫 this.model.playNameClipes(this.sceneidx,'mool');//傳入場(chǎng)景的id和動(dòng)畫名稱
結(jié)語
本文為Mool3D引擎下的模型類的介紹和使用,主要設(shè)計(jì)思想是通過配置文件完成場(chǎng)景加載,提供自定義模型的加載和場(chǎng)景動(dòng)畫的控制。
更多關(guān)于three.js Mool3D模型類的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JavaScript 參數(shù)中的數(shù)組展開 [譯]
有些時(shí)候,我們需要把一個(gè)數(shù)組展開成多個(gè)元素,然后把這些元素作為函數(shù)調(diào)用的參數(shù).JavaScript中可以使用Function.prototype.apply來實(shí)現(xiàn)這種展開操作,但它不能被應(yīng)用在執(zhí)行構(gòu)造函數(shù)的情況下.本文解釋了什么是展開操作以及如何在使用new運(yùn)算符的同時(shí)進(jìn)行展開操作2012-09-09
JavaScript利用Immerjs實(shí)現(xiàn)不可變數(shù)據(jù)
Immerjs?是一個(gè)用于管理?JavaScript?不可變數(shù)據(jù)結(jié)構(gòu)的庫,它可以幫助我們更輕松地處理狀態(tài)的變化,并減少冗余代碼。本文就來帶大家揭秘如何利用Immerjs實(shí)現(xiàn)不可變數(shù)據(jù),感興趣的可以了解一下2023-04-04
JS實(shí)現(xiàn)無縫循環(huán)marquee滾動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)無縫循環(huán)marquee滾動(dòng)效果,兼容IE, FireFox, Chrome,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
用JavaScript動(dòng)態(tài)建立或增加CSS樣式表的實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄肑avaScript動(dòng)態(tài)建立或增加CSS樣式表的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-05-05
js中g(shù)etBoundingClientRect的作用及兼容方案詳解
這篇文章主要介紹了js中g(shù)etBoundingClientRect的作用及兼容方案詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-02-02
小程序?qū)崿F(xiàn)人臉識(shí)別的項(xiàng)目實(shí)踐
人臉識(shí)別在現(xiàn)在很多地方都可以用的到,例如支付,解鎖等,本文就來介紹一下小程序?qū)崿F(xiàn)人臉識(shí)別,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10

