planeCoverService.js 2.7 KB

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