import * as THREE from 'three' import axios from 'axios' import Decompress from './util/Decompress.js' import Process from './util/Process.js' import Model from './util/Model.js' import Chunks from './util/Chunks.js' import math from './util/math.js' import PanoBoxFrame from './PanoBoxFrame.js' const domain = `https://4dkk.4dage.com`; const getModelBlob = async (url) => { const data = await axios({ url: `${domain}${url}`, responseType: 'arraybuffer', method: 'GET' }); if (data.status !== 200) { throw "无法获取场景数据,请确认场景码是否正确" } else if (!data.data) { throw "场景数据为空,请联系相关人员" } else { return data.data; } } /** * @param sceneNum 场景码 * @param imgBoxsList 全景图shapes平面盒子数据格式: * [{ "id":9703, "version":"4dage_1.0.0", "flag":null, "shapes":[{ score: 0.5, color: [], bbox: [], label: "", category:"cabinet" }] }] @returns 返回三维立方体box */ function addToModel(chunks, player) { if (0 === chunks.length) { logger.warn('No geometry found for model, loading faux geometry, disabling outside mode') var chunk = new Chunk({ geometry: new THREE.PlaneBufferGeometry(5, 5, 1, 1), }) chunk.material.visible = !1 chunk.rotateX(-Math.PI / 2) chunk.geometry.computeBoundingBox() chunks = [chunk] } chunks.forEach(function (mesh) { var floorIndex = Chunks.parseFloor(mesh.name) player.model.addChunk(floorIndex, mesh) }) player.model.floors.sort() } function outputJson(boxCenvert, sceneNum, player){ let json = { sceneNum, boxes:boxCenvert.boxesSolid.map(e=> e.toJson()), boundingBox: { min:math.invertVisionVector(boxCenvert.safeBound.min).toArray(), max:math.invertVisionVector(boxCenvert.safeBound.max).toArray() } } return json } export const planeCover = async ({sceneNum, imgBoxsList}) => { const player = { model : new Model(), } const panoBlob = await getModelBlob(`/scene_view_data/${sceneNum}/images/vision.modeldata`) const damBlob = await getModelBlob(`/scene_view_data/${sceneNum}/images/dacf7dfa24ae47fab8fcebfe4dc41ab9_50k.dam`) var sweepLocations = Decompress.decompressModeldata(panoBlob) var modeldata = Process.visionModeldata(sweepLocations, player.model.panos) const panos = Process.panos(modeldata, player.model) var meshdata = Decompress.decompressMesh(damBlob) var chunks = Process.convertProtobufToSceneObject( meshdata, sceneNum) addToModel(chunks, player) player.model.build() console.log(player.model) console.log(imgBoxsList) let boxCenvert = new PanoBoxFrame(player, true, imgBoxsList) console.log(boxCenvert.boxesSolid) return outputJson(boxCenvert, sceneNum, player); }