Process.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. /*
  2. * @Author: Rindy
  3. * @Date: 2021-05-13 17:27:29
  4. * @LastEditors: Rindy
  5. * @LastEditTime: 2021-05-27 16:30:31
  6. * @Description: Process
  7. */
  8. import * as THREE from 'three'
  9. import logger from './logger.js'
  10. import settings from './settings.js'
  11. import Chunk from './Chunk.js'
  12. import Panorama from './Panorama.js'
  13. export default {
  14. convertProtobufToSceneObject: function ( loaddata , sceneNum ) {
  15. function getMesh(chunk) {
  16. var geometry = new THREE.BufferGeometry()
  17. geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(chunk.vertices.xyz, 0, 3), 3))
  18. chunk.vertices.uv.length > 0 && geometry.setAttribute('uv', new THREE.BufferAttribute(new Float32Array(chunk.vertices.uv, 0, 2), 2))
  19. geometry.setIndex(new THREE.BufferAttribute(new Uint32Array(chunk.faces.faces, 0, 1), 1))
  20. geometry.applyMatrix4(matrix)
  21. geometry.computeBoundingBox()
  22. var meshUrl = settings.job + settings.format
  23. return new Chunk({
  24. geometry: geometry,
  25. textureName: chunk.material_name,
  26. name: chunk.chunk_name,
  27. //meshUrl: app.resource.getViewImagesURL(meshUrl),
  28. meshUrl: `https://4dkk.4dage.com/scene_view_data/${sceneNum}/images/${meshUrl}?_=1`
  29. })
  30. }
  31. if (0 == loaddata.chunk.length) {
  32. logger.warn('No chunks in damfile...')
  33. return null
  34. }
  35. var matrix = new THREE.Matrix4()
  36. matrix.set(1, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 1)
  37. //var materails = {};
  38. return loaddata.chunk.map(getMesh)
  39. },
  40. //vision.modeldata的数据不能直接用,需要转换,方法如下:
  41. visionModeldata: function (loaddata) {
  42. var modeldata = loaddata.sweepLocations
  43. .map(
  44. function (n, i) {
  45. return {
  46. uuid: n.uuid.toUTF8().replace(/-/g, ''),
  47. position: {
  48. x: n.pose.translation.x,
  49. y: n.pose.translation.y,
  50. z: n.pose.translation.z,
  51. },
  52. quaternion: {
  53. x: n.pose.rotation.x,
  54. y: n.pose.rotation.y,
  55. z: n.pose.rotation.z,
  56. w: n.pose.rotation.w,
  57. },
  58. puck: {
  59. x: n.puck.x,
  60. y: n.puck.y,
  61. z: n.puck.z,
  62. },
  63. alignmentType: n.alignment_type,
  64. group: n.group,
  65. subgroup: n.subgroup,
  66. index: i, //add
  67. }
  68. }.bind(this)
  69. )
  70. .map(
  71. function (n) {
  72. n.position = this.convertVisionVector(n.position)
  73. n.quaternion = this.convertVisionQuaternion(n.quaternion)
  74. n.puck = this.convertVisionVector(n.puck)
  75. return n
  76. }.bind(this)
  77. )
  78. return modeldata
  79. },
  80. panos: function (modeldata, model ) {
  81. model.panos.extend(
  82. modeldata.map(
  83. function (modeldataitem) {
  84. return new Panorama(model, modeldataitem.uuid, modeldataitem )
  85. }.bind(this)
  86. ),
  87. 'id'
  88. )
  89. if (0 === model.panos.length) {
  90. logger.warn('Model has no panos, turning off inside mode')
  91. }
  92. return model.panos
  93. },
  94. //变换vision.modeldata里拍摄点的坐标
  95. convertVisionVector: function (position) {
  96. return new THREE.Vector3(position.x, position.z, -position.y)
  97. },
  98. //变换vision.modeldata里拍摄点的旋转角度quaternion
  99. convertVisionQuaternion: function (quaternion) {
  100. return new THREE.Quaternion(quaternion.x, quaternion.z, -quaternion.y, quaternion.w).multiply(new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), THREE.MathUtils.degToRad(90)))
  101. },
  102. //变换初始点的坐标
  103. convertWorkshopVector: function (position) {
  104. return new THREE.Vector3(-position.x, position.y, position.z)
  105. },
  106. //变换初始点的quaternion
  107. convertWorkshopQuaternion: function (quaternion) {
  108. return new THREE.Quaternion(-quaternion.x, quaternion.y, quaternion.z, -quaternion.w).multiply(new THREE.Quaternion(Math.sqrt(2) / 2, Math.sqrt(2) / 2, 0, 0))
  109. },
  110. }