planeCoverService.js 2.8 KB

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