黄陂项目
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

626 lines
18 KiB

2 months ago
  1. // 从这里开始
  2. var h1 = null
  3. var h2 = null
  4. var h3 = null
  5. var oldtransformNodex = null
  6. var oldMeshOther = null
  7. var drag = null
  8. var isRotating = true
  9. var clickParentRotate = false
  10. var targetAngles = {
  11. default: { // 初始视角
  12. alpha: 2.5809,
  13. beta: 0.9804,
  14. radius: 3
  15. },
  16. alarm: { // 报警视角(示例)
  17. alpha: 3.1213, // -π(180度)
  18. beta: 0.5855, // π/4(45度)
  19. radius: 3 // 更近的距离
  20. }
  21. }
  22. var camera
  23. BABYLON.DefaultLoadingScreen.prototype.displayLoadingUI = function() {
  24. if (document.getElementById('customLoadingScreenDiv')) {
  25. document.getElementById('customLoadingScreenDiv').style.display = 'initial'
  26. return
  27. }
  28. this._loadingDiv = document.createElement('div')
  29. this._loadingDiv.id = 'customLoadingScreenDiv'
  30. thecss = 'lohingifpc'
  31. thecss2 = 'zcpc'
  32. this._loadingDiv.innerHTML = "<div class='oka'><div class='" + thecss + "'><image src='./logok.gif' class='jiazaiimg'/></div></div>"
  33. this._resizeLoadingUI()
  34. window.addEventListener('resize', this._resizeLoadingUI)
  35. document.body.appendChild(this._loadingDiv)
  36. }
  37. function prepareGroupButton2(transformNodex, color, qu) {
  38. var mesheses = null
  39. if (transformNodex.getClassName() === 'TransformNode') {
  40. mesheses = transformNodex.getChildMeshes(false)
  41. } else {
  42. mesheses = []
  43. mesheses.push(transformNodex)
  44. }
  45. for (var i = 0; i < mesheses.length; i++) {
  46. mesheses[i].actionManager = new BABYLON.ActionManager(scene)
  47. mesheses[i].actionManager.registerAction(
  48. new BABYLON.ExecuteCodeAction({
  49. trigger: BABYLON.ActionManager.OnPointerOverTrigger,
  50. parameter: ''
  51. },
  52. function() {
  53. isRotating = false
  54. camera.useAutoRotationBehavior = isRotating
  55. }
  56. )
  57. )
  58. // 移出事件
  59. mesheses[i].actionManager.registerAction(
  60. new BABYLON.ExecuteCodeAction({
  61. trigger: BABYLON.ActionManager.OnPointerOutTrigger,
  62. parameter: ''
  63. },
  64. function() {
  65. if (clickParentRotate) {
  66. isRotating = true
  67. camera.useAutoRotationBehavior = isRotating
  68. }
  69. }
  70. )
  71. )
  72. mesheses[i].actionManager.registerAction(
  73. new BABYLON.ExecuteCodeAction({
  74. trigger: BABYLON.ActionManager.OnPickTrigger,
  75. parameter: ''
  76. },
  77. function() {
  78. clickbegin = true
  79. try {
  80. cameraClick(transformNodex)
  81. } catch (error) {
  82. }
  83. })
  84. )
  85. }
  86. }
  87. function prepareGroupButton3(transformNodex, color, qu) {
  88. var mesheses = null
  89. if (transformNodex.getClassName() === 'TransformNode') {
  90. mesheses = transformNodex.getChildMeshes(false)
  91. } else {
  92. mesheses = []
  93. mesheses.push(transformNodex)
  94. }
  95. for (var i = 0; i < mesheses.length; i++) {
  96. mesheses[i].actionManager = new BABYLON.ActionManager(scene)
  97. mesheses[i].actionManager.registerAction(
  98. new BABYLON.ExecuteCodeAction({
  99. trigger: BABYLON.ActionManager.OnPointerOverTrigger,
  100. parameter: ''
  101. },
  102. function() {
  103. isRotating = false
  104. camera.useAutoRotationBehavior = isRotating
  105. }
  106. )
  107. )
  108. // 移出事件
  109. mesheses[i].actionManager.registerAction(
  110. new BABYLON.ExecuteCodeAction({
  111. trigger: BABYLON.ActionManager.OnPointerOutTrigger,
  112. parameter: ''
  113. },
  114. function() {
  115. if (clickParentRotate) {
  116. isRotating = true
  117. camera.useAutoRotationBehavior = isRotating
  118. }
  119. }
  120. )
  121. )
  122. mesheses[i].actionManager.registerAction(
  123. new BABYLON.ExecuteCodeAction({
  124. trigger: BABYLON.ActionManager.OnPickTrigger,
  125. parameter: ''
  126. },
  127. function() {
  128. clickbegin = true
  129. try {
  130. archCabinetsClick(transformNodex)
  131. } catch (error) {
  132. }
  133. })
  134. )
  135. }
  136. }
  137. BABYLON.DefaultLoadingScreen.prototype.hideLoadingUI = function() {
  138. show = 50
  139. document.getElementById('customLoadingScreenDiv').style.display = 'none'
  140. document.getElementById('customLoadingScreenDiv_first').style.display = 'none'
  141. document.title = '档案室'
  142. var prepareGroupButton2ByMesh = function(transformNodex, color, qu) {
  143. var mesheses = null
  144. if (transformNodex.getClassName() === 'Mesh') {
  145. mesheses = []
  146. mesheses.push(transformNodex)
  147. }
  148. for (var i = 0; i < mesheses.length; i++) {
  149. mesheses[i].actionManager = new BABYLON.ActionManager(scene)
  150. mesheses[i].actionManager.registerAction(
  151. new BABYLON.ExecuteCodeAction({
  152. trigger: BABYLON.ActionManager.OnPointerOverTrigger,
  153. parameter: ''
  154. },
  155. function() {
  156. if (oldMeshOther != null) {
  157. oldMeshOther.removeBehavior(drag)
  158. var mesheses2 = null
  159. if (oldMeshOther.getClassName() === 'Mesh') {
  160. mesheses2 = []
  161. mesheses2.push(oldMeshOther)
  162. }
  163. for (var i = 0; i < mesheses2.length; i++) {
  164. try {
  165. h2.removeMesh(mesheses2[i])
  166. } catch (error) {
  167. }
  168. }
  169. }
  170. oldMeshOther = transformNodex
  171. var mesheses3 = null
  172. if (transformNodex.getClassName() === 'Mesh') {
  173. mesheses3 = []
  174. mesheses3.push(transformNodex)
  175. }
  176. for (let i = 0; i < mesheses3.length; i++) {
  177. try {
  178. h2.addMesh(mesheses3[i], color)
  179. } catch (error) {
  180. }
  181. }
  182. isRotating = false
  183. camera.useAutoRotationBehavior = isRotating
  184. }
  185. )
  186. )
  187. // 移出事件
  188. mesheses[i].actionManager.registerAction(
  189. new BABYLON.ExecuteCodeAction({
  190. trigger: BABYLON.ActionManager.OnPointerOutTrigger,
  191. parameter: ''
  192. },
  193. function() {
  194. var mesheses4 = null
  195. if (transformNodex.getClassName() === 'Mesh') {
  196. mesheses4 = []
  197. mesheses4.push(transformNodex)
  198. }
  199. for (var i = 0; i < mesheses4.length; i++) {
  200. try {
  201. h2.removeMesh(mesheses4[i])
  202. } catch (error) {
  203. }
  204. }
  205. if (clickParentRotate) {
  206. isRotating = true
  207. camera.useAutoRotationBehavior = isRotating
  208. }
  209. }
  210. )
  211. )
  212. mesheses[i].actionManager.registerAction(
  213. new BABYLON.ExecuteCodeAction({
  214. trigger: BABYLON.ActionManager.OnPickTrigger,
  215. parameter: ''
  216. },
  217. function() {
  218. try {
  219. cameraClick(transformNodex)
  220. } catch (error) {
  221. }
  222. }
  223. )
  224. )
  225. }
  226. }
  227. // 绑功能点
  228. var smokeAlarms = [] // 烟感
  229. scene.transformNodes.forEach(function(node) {
  230. if (node.name.startsWith('smokealarm')) {
  231. smokeAlarms.push(node)
  232. }
  233. })
  234. var length = smokeAlarms.length
  235. console.log('以 smokealarm 开头的对象数量:', length)
  236. smokeAlarms.forEach(function(jk01, index) {
  237. console.log('smokeAlarms', jk01)
  238. var parts = jk01.name.split('smokealarm')
  239. if (parts.length > 1) {
  240. const paddedIndex = String(index + 1).padStart(3, '0')
  241. jk01.nameID = `S${paddedIndex}`
  242. } else {
  243. jk01.nameID = 'S000'
  244. }
  245. jk01.baojing = false
  246. prepareGroupButton2(jk01)
  247. })
  248. // 存储所有 camera 相关的 Mesh 监控
  249. const cameraMeshes = []
  250. scene.transformNodes.forEach(function(node) {
  251. if (node.name.startsWith('有害生物去除器')) {
  252. cameraMeshes.push(node)
  253. }
  254. })
  255. const cameraCount = cameraMeshes.length
  256. console.log('以 camera 开头的 Mesh 数量:', cameraCount)
  257. const colorBlue = new BABYLON.Color3(0, 0, 1)
  258. cameraMeshes.forEach((cam, index) => {
  259. const paddedIndex = String(index + 1).padStart(3, '0')
  260. // DAK_MO_CAM_001
  261. // cam.nameID = `DAK_MO_CAM_${paddedIndex}`
  262. cam.nameID = `cam_${paddedIndex}`
  263. prepareGroupButton2(cam)
  264. })
  265. // 档案柜
  266. const archivesCabinets = [];
  267. scene.transformNodes.forEach(function(node) {
  268. if (node.name.startsWith('档案柜')) {
  269. archivesCabinets.push(node);
  270. }
  271. });
  272. const archivesCabinetsCount = archivesCabinets.length;
  273. console.log('以 档案柜 数量:', archivesCabinetsCount);
  274. if (archivesCabinets.length > 0) { // 增加安全判断,避免数组为空时报错
  275. const children = archivesCabinets[0]._children;
  276. const filteredChildren = children.filter(cam => cam.name !== "克隆_1");
  277. for (let i = filteredChildren.length - 1; i >= 0; i--) {
  278. const cam = filteredChildren[i];
  279. const paddedIndex = String(filteredChildren.length - i);
  280. cam.nameID = `cabinet-${paddedIndex}`;
  281. prepareGroupButton3(cam);
  282. }
  283. }
  284. var light = new BABYLON.HemisphericLight('HemiLight', new BABYLON.Vector3(0, 1, 0), scene)
  285. light.intensity = 2
  286. light.diffuse = new BABYLON.Color3(0.92, 0.92, 0.92)
  287. // 给vue页面传值,加载完成之后
  288. parent.getIframeLoading('false')
  289. }
  290. BABYLON.DracoCompression.Configuration.decoder.wasmUrl = './js/draco_wasm_wrapper_gltf.js'
  291. BABYLON.DracoCompression.Configuration.decoder.wasmBinaryUrl = './js/draco_decoder_gltf.wasm'
  292. BABYLON.DracoCompression.Configuration.decoder.fallbackUrl = './js/draco_decoder_gltf.js'
  293. // createScene function that creates and return the scene
  294. var createScene = function() {
  295. engine.displayLoadingUI()
  296. var scene = new BABYLON.Scene(engine)
  297. camera = new BABYLON.ArcRotateCamera(
  298. 'Camera', 4.02, 0.98, 2.6,
  299. new BABYLON.Vector3(1.2, 0.08, 0.03),
  300. scene
  301. )
  302. camera.setTarget(new BABYLON.Vector3(0, 0, 0)) // 瞄准原点
  303. camera.attachControl(canvas, true)
  304. // ========== 关键修改:解决裁剪问题 ==========
  305. camera.lowerRadiusLimit = 0.1 // 减小最小距离限制,允许相机更靠近物体
  306. camera.upperRadiusLimit = 500 // 增大最大距离限制
  307. camera.inertia = 0.1
  308. // 设置裁剪平面(核心解决裁剪问题)
  309. camera.minZ = 0.01 // 近裁剪平面:设置为较小值,避免近距离裁剪
  310. camera.maxZ = 1000 // 远裁剪平面:设置为较大值,避免远距离裁剪
  311. // 优化相机视场角(可选,根据需求调整)
  312. camera.fov = 0.8 // 增大视场角,看到更多内容(默认约0.87弧度=50度)
  313. camera.useAutoRotationBehavior = isRotating // 自动旋转
  314. // 改变场景背景颜色 - 背景颜色opacity值设为0,达到透明背景的效果
  315. scene.clearColor = new BABYLON.Color4(0, 0, 0, 0)
  316. scene.activeCamera = camera
  317. scene.activeCamera.useInputToRestoreState = true
  318. var assetsManager = new BABYLON.AssetsManager(scene)
  319. // 加载GLB模型并处理材质
  320. BABYLON.SceneLoader.LoadAssetContainerAsync('asset/', 'F5.glb', scene).then((container) => {
  321. // 遍历所有材质
  322. container.materials.forEach(material => {
  323. // 可以保留材质处理逻辑
  324. })
  325. // 将加载的资产添加到场景中
  326. container.addAllToScene()
  327. // setTimeout(() => {
  328. // moveCameraTo('alarm')
  329. // }, 3000)
  330. }).catch((error) => {
  331. console.error('加载模型时出错:', error)
  332. })
  333. var hdrTexture = new BABYLON.CubeTexture.CreateFromPrefilteredData('textures/environmentSpecular.env', scene)
  334. scene.environmentTexture = hdrTexture
  335. var spriteManagerPlayer = new BABYLON.SpriteManager('playerManager', './img/bl9.png', 10, {
  336. width: 100,
  337. height: 100
  338. }, scene)
  339. spriteManagerPlayer.isPickable = true
  340. scene.onPointerDown = function(evt) {
  341. var pickResult = scene.pickSprite(this.pointerX, this.pointerY)
  342. var pick = scene.pick(scene.pointerX, scene.pointerY)
  343. console.log('pick', pick.pickedPoint)
  344. if (pickResult.pickedSprite != null) {
  345. if (pickResult.hit) {
  346. alert(pickResult.pickedSprite.name)
  347. }
  348. }
  349. }
  350. assetsManager.load()
  351. drag = new BABYLON.PointerDragBehavior({
  352. dragPlaneNormal: new BABYLON.Vector3(0, 0, 1)
  353. })
  354. drag.validateDrag = (targetPosition) => {
  355. if (targetPosition.x > 10.5 || targetPosition.x < -10.5) {
  356. return false
  357. }
  358. if (targetPosition.z > 10.5 || targetPosition.z < -10.5) {
  359. return false
  360. }
  361. if (oldtransformNodex != null) {
  362. return true
  363. }
  364. }
  365. drag.onDragEndObservable.add((event) => {
  366. // console.log("dragEnd");
  367. })
  368. // GUI
  369. h1 = new BABYLON.HighlightLayer('hl1', scene)
  370. h2 = new BABYLON.HighlightLayer('hl2', scene)
  371. h3 = new BABYLON.HighlightLayer('hl3', scene) // 修复重复的ID问题
  372. var step = 0.1
  373. var currentx = 1
  374. h1.blurHorizontalSize = 0.1
  375. scene.registerAfterRender(() => {
  376. h1.blurHorizontalSize = h1.blurVerticalSize + currentx
  377. var nodealert = scene.getTransformNodeByName('yan')
  378. if (nodealert != null) {
  379. var mesheses3 = null
  380. if (nodealert.getClassName() === 'TransformNode') {
  381. mesheses3 = nodealert.getChildMeshes(false)
  382. } else {
  383. mesheses3 = []
  384. mesheses3.push(nodealert)
  385. }
  386. for (var i = 0; i < mesheses3.length; i++) {
  387. try {
  388. if (nodealert.baojing === true) {
  389. h3.addMesh(mesheses3[i], new BABYLON.Color3(1, 0, 0))
  390. } else {
  391. h3.removeMesh(mesheses3[i])
  392. }
  393. } catch (error) {
  394. }
  395. }
  396. }
  397. })
  398. if (currentx > 0.5) {
  399. step *= -1
  400. }
  401. if (currentx < 0) {
  402. step *= -1
  403. }
  404. currentx += step
  405. return scene
  406. }
  407. var canvas = document.getElementById('renderCanvas')
  408. // load the 3D engine
  409. var engine = new BABYLON.Engine(canvas, true, {
  410. stencil: true
  411. })
  412. // call the createScene function
  413. var scene = createScene()
  414. scene.autoClear = true
  415. scene.imageProcessingConfiguration.exposure = 1
  416. scene.imageProcessingConfiguration.contrast = 1
  417. scene.environmentIntensity = 0.4
  418. engine.runRenderLoop(function() {
  419. scene.render()
  420. })
  421. window.addEventListener('resize', function() {
  422. engine.resize()
  423. })
  424. // 报警 true:表示报警, false :表示不报警
  425. function cameraClick(TheCamera) {
  426. window.parent.postMessage(
  427. {
  428. type: 'cameraClick',
  429. data: TheCamera.nameID
  430. },
  431. '*'
  432. )
  433. }
  434. // 报警 true:表示报警, false :表示不报警
  435. function archCabinetsClick(TheCamera) {
  436. window.parent.postMessage(
  437. {
  438. type: 'archCabinetsClick',
  439. data: TheCamera.nameID
  440. },
  441. '*'
  442. )
  443. }
  444. function handleAlarm(deviceId, isAlarm) {
  445. var cl = new BABYLON.Color3(0, 0, 1)
  446. var c2 = new BABYLON.Color3(1, 0, 0)
  447. const targetDevice = scene.transformNodes.find(node => node.nameID === deviceId)
  448. if (targetDevice) {
  449. targetDevice.baojing = isAlarm
  450. var mesheses = null
  451. if (targetDevice.getClassName() === 'TransformNode') {
  452. mesheses = targetDevice.getChildMeshes(false)
  453. } else {
  454. mesheses = []
  455. mesheses.push(targetDevice)
  456. }
  457. if (isAlarm) {
  458. console.log('111')
  459. for (var i = 0; i < mesheses.length; i++) {
  460. h2.addMesh(mesheses[i], c2)
  461. }
  462. } else {
  463. console.log('222')
  464. for (var j = 0; j < mesheses.length; j++) {
  465. h2.removeMesh(mesheses[j])
  466. h2.addMesh(mesheses[j], cl)
  467. }
  468. }
  469. } else {
  470. console.log(`未找到设备 ID 为 ${deviceId} 的设备`)
  471. }
  472. }
  473. window.addEventListener(
  474. 'message',
  475. function(e) {
  476. if (e.data.type === 'deviceState') {
  477. console.log('ddd', e.data.data)
  478. const deviceData = e.data.data
  479. if (Array.isArray(deviceData)) {
  480. deviceData.forEach((device) => {
  481. handleAlarm(device.deviceId, device.isAlarm)
  482. })
  483. } else {
  484. handleAlarm(deviceData.deviceId, deviceData.isAlarm)
  485. }
  486. } else if (e.data.type === 'isGetRotate') {
  487. const isGetRotate = e.data.value
  488. console.log('isGetRotate:', isGetRotate)
  489. toggleAutoRotation(isGetRotate)
  490. }
  491. },
  492. false
  493. )
  494. function toggleAutoRotation(isAutoRotating) {
  495. var camera = scene.activeCamera
  496. clickParentRotate = !isAutoRotating
  497. if (!isAutoRotating) {
  498. // 启用自动旋转
  499. camera.useAutoRotationBehavior = true
  500. } else {
  501. // 禁用自动旋转
  502. camera.useAutoRotationBehavior = false
  503. camera.angularSpeed = 0 // 停止旋转
  504. }
  505. }
  506. // 相机运动到指定视角(带动画)
  507. function moveCameraTo(targetPreset) {
  508. // 获取目标参数
  509. var target = targetAngles[targetPreset]
  510. if (!target) return console.error('无效的视角预设')
  511. var camera = scene.activeCamera
  512. // 禁用用户交互(可选)
  513. camera.panningInertia = 0 // 禁止平移
  514. // 创建并设置动画
  515. var animationAlpha = new BABYLON.Animation(
  516. 'cameraAlphaAnimation',
  517. 'alpha',
  518. 60, // 帧率
  519. BABYLON.Animation.ANIMATIONTYPE_FLOAT,
  520. BABYLON.Animation.ANIMATIONLOOPMODE_CONSTANT
  521. )
  522. var animationBeta = new BABYLON.Animation(
  523. 'cameraBetaAnimation',
  524. 'beta',
  525. 60, // 帧率
  526. BABYLON.Animation.ANIMATIONTYPE_FLOAT,
  527. BABYLON.Animation.ANIMATIONLOOPMODE_CONSTANT
  528. )
  529. var animationRadius = new BABYLON.Animation(
  530. 'cameraRadiusAnimation',
  531. 'radius',
  532. 60, // 帧率
  533. BABYLON.Animation.ANIMATIONTYPE_FLOAT,
  534. BABYLON.Animation.ANIMATIONLOOPMODE_CONSTANT
  535. )
  536. // 定义关键帧
  537. var keysAlpha = [
  538. { frame: 0, value: camera.alpha },
  539. { frame: 120, value: target.alpha }
  540. ]
  541. var keysBeta = [
  542. { frame: 0, value: camera.beta },
  543. { frame: 120, value: target.beta }
  544. ]
  545. var keysRadius = [
  546. { frame: 0, value: camera.radius },
  547. { frame: 120, value: target.radius }
  548. ]
  549. animationAlpha.setKeys(keysAlpha)
  550. animationBeta.setKeys(keysBeta)
  551. animationRadius.setKeys(keysRadius)
  552. // 设置缓动函数
  553. var easingFunction = new BABYLON.CubicEase()
  554. easingFunction.setEasingMode(BABYLON.EasingFunction.EASINGMODE_EASEINOUT)
  555. animationAlpha.setEasingFunction(easingFunction)
  556. animationBeta.setEasingFunction(easingFunction)
  557. animationRadius.setEasingFunction(easingFunction)
  558. // 开始动画
  559. scene.beginDirectAnimation(camera, [animationAlpha, animationBeta, animationRadius], 0, 120, false, 1, function() {
  560. // 动画完成后恢复用户交互
  561. camera.panningInertia = 0.1
  562. toggleAutoRotation(true)
  563. window.parent.postMessage({ type: 'autoRotationStatus', value: true }, '*')
  564. })
  565. }