planeCoverService.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. import * as THREE from 'three'
  2. import { Base64 } from 'js-base64'
  3. import dcodeIO from 'protobufjs'
  4. import axios from 'axios'
  5. import Decompress from './util/Decompress.js'
  6. import Process from './util/Process.js'
  7. import Model from './util/Model.js'
  8. import Chunks from './util/Chunks.js'
  9. import PanoBoxFrame from './PanoBoxFrame.js'
  10. const domain = `https://4dkk.4dage.com`;
  11. const getModelBlob = async (url) => {
  12. const data = await axios({
  13. url: `${domain}${url}`,
  14. responseType: 'arraybuffer',
  15. method: 'GET'
  16. });
  17. if (data.status !== 200) {
  18. throw "无法获取场景数据,请确认场景码是否正确"
  19. } else if (!data.data) {
  20. throw "场景数据为空,请联系相关人员"
  21. } else {
  22. return data.data;
  23. }
  24. }
  25. /**
  26. * @param sceneNum 场景码
  27. * @param imgBoxsList 全景图shapes平面盒子数据格式:
  28. * [{
  29. "id":9703,
  30. "version":"4dage_1.0.0",
  31. "flag":null,
  32. "shapes":[{
  33. score: 0.5,
  34. color: [],
  35. bbox: [],
  36. label: "",
  37. category:"cabinet"
  38. }]
  39. }]
  40. @returns 返回三维立方体box
  41. */
  42. function addToModel(chunks, player) {
  43. if (0 === chunks.length) {
  44. logger.warn('No geometry found for model, loading faux geometry, disabling outside mode')
  45. var chunk = new Chunk({
  46. geometry: new THREE.PlaneBufferGeometry(5, 5, 1, 1),
  47. })
  48. chunk.material.visible = !1
  49. chunk.rotateX(-Math.PI / 2)
  50. chunk.geometry.computeBoundingBox()
  51. chunks = [chunk]
  52. }
  53. chunks.forEach(function (mesh) {
  54. var floorIndex = Chunks.parseFloor(mesh.name)
  55. player.model.addChunk(floorIndex, mesh)
  56. })
  57. player.model.floors.sort()
  58. }
  59. function outputJson(boxCenvert, sceneNum, player){
  60. let json = {
  61. sceneNum,
  62. boxes:boxCenvert.boxes.map(e=> e.toJson()),
  63. boundingBox: {min:player.model.boundingBox.min.toArray(),max:player.model.boundingBox.max.toArray()}
  64. }
  65. return json
  66. }
  67. export const planeCover = async ({sceneNum, imgBoxsList}) => {
  68. const player = {
  69. model : new Model(),
  70. }
  71. const panoBlob = await getModelBlob(`/scene_view_data/${sceneNum}/images/vision.modeldata`)
  72. const damBlob = await getModelBlob(`/scene_view_data/${sceneNum}/images/dacf7dfa24ae47fab8fcebfe4dc41ab9_50k.dam`)
  73. var sweepLocations = Decompress.decompressModeldata(panoBlob)
  74. var modeldata = Process.visionModeldata(sweepLocations, player.model.panos)
  75. const panos = Process.panos(modeldata, player.model)
  76. var meshdata = Decompress.decompressMesh(damBlob)
  77. var chunks = Process.convertProtobufToSceneObject( meshdata, sceneNum)
  78. addToModel(chunks, player)
  79. player.model.build()
  80. console.log(player.model)
  81. console.log(imgBoxsList)
  82. let boxCenvert = new PanoBoxFrame(player, true, imgBoxsList)
  83. console.log(boxCenvert.boxes)
  84. return outputJson(boxCenvert, sceneNum, player);
  85. }