| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- import * as THREE from 'three';
- import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
- import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js';
- import { genGroupStruct, genAnimations } from './modalParse'
- const gltfLoader = new GLTFLoader();
- const dracoLoader = new DRACOLoader();
- dracoLoader.setDecoderPath('/model/draco/gltf/');
- dracoLoader.setDecoderConfig({ type: 'js' }); //使用兼容性强的draco_decoder.js解码器
- dracoLoader.preload();
- gltfLoader.setDRACOLoader(dracoLoader);
- gltfLoader.setPath('/model/glft/');
- async function loadModel(data) {
- const { modalValue, modalName, message } = data
- if (!modalValue) {
- const db = window['CustomDB'];
- const modalArr = await db.modal.where('modalName').equals(modalName).toArray();
- modalValue = modalArr[0].modalVal;
- }
- gltfLoader.parse(
- modalValue,
- '/model/glft/',
- (gltf) => {
- const object = gltf.scene;
- object.traverse((obj) => {
- if (obj instanceof THREE.Mesh) {
- obj.material.emissiveIntensity = 1;
- // obj.material.emissiveMap = obj.material.map;
- obj.material.blending = THREE.CustomBlending;
- if (obj.material.opacity < 1) {
- obj.material.transparent = true;
- }
- obj.renderOrder = 1;
- // if (obj.name !== 'buxiugangse') {
- // obj.receiveShadow = true;
- // }
- // obj.castShadow = true;
- }
- });
- object.name = modalName;
- dracoLoader.dispose();
- self.postMessage({
- modalName,
- work_type: "parseModel",
- ...genGroupStruct(object),
- sceneAnimations: genAnimations(gltf.animations),
- });
- self.close();
- },
- (err) => {
- console.log(err);
- self.postMessage({ message: 'end', data: null });
- self.close();
- }
- )
- }
- self.addEventListener(
- 'message',
- async function (e) {
- const data = e.data
- await loadModel(data)
- },
- false
- );
|