华农3D项目
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.

586 lines
18 KiB

5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
  1. // 从这里开始
  2. var h1 = null
  3. var h2 = null
  4. var h3 = null
  5. var oldtransformNodex = null
  6. // var oldtransformNodeOther = null
  7. // var oldMesh = null
  8. var oldMeshOther = null
  9. var drag = null
  10. // var notmoveGroup = null
  11. // var movedGroup = null
  12. // var movesingle = false
  13. // var dynamicTexture = null
  14. // var dynamicTexture2 = null
  15. // var show = 50
  16. // var showdd = 50
  17. var isRotating = true
  18. var camera
  19. BABYLON.DefaultLoadingScreen.prototype.displayLoadingUI = function() {
  20. if (document.getElementById('customLoadingScreenDiv')) {
  21. document.getElementById('customLoadingScreenDiv').style.display = 'initial'
  22. return
  23. }
  24. this._loadingDiv = document.createElement('div')
  25. this._loadingDiv.id = 'customLoadingScreenDiv'
  26. thecss = 'lohingifpc'
  27. thecss2 = 'zcpc'
  28. this._loadingDiv.innerHTML = "<div class='oka'><div class='" + thecss + "'><image src='./logok.gif' class='jiazaiimg'/></div></div>"
  29. this._resizeLoadingUI()
  30. window.addEventListener('resize', this._resizeLoadingUI)
  31. document.body.appendChild(this._loadingDiv)
  32. }
  33. function prepareGroupButton2(transformNodex, color, qu) {
  34. var mesheses = null
  35. if (transformNodex.getClassName() === 'TransformNode') {
  36. mesheses = transformNodex.getChildMeshes(false)
  37. } else {
  38. mesheses = []
  39. mesheses.push(transformNodex)
  40. }
  41. for (var i = 0; i < mesheses.length; i++) {
  42. mesheses[i].actionManager = new BABYLON.ActionManager(scene)
  43. // var theScaling = mesheses[i].scaling
  44. /* if (true) {
  45. try {
  46. mesheses[i].actionManager.registerAction(new BABYLON.InterpolateValueAction(BABYLON.ActionManager.OnPointerOutTrigger, mesheses[i], "scaling", new BABYLON.Vector3(theScaling.x, theScaling.y, theScaling.z), 100));
  47. mesheses[i].actionManager.registerAction(new BABYLON.InterpolateValueAction(BABYLON.ActionManager.OnPointerOverTrigger, mesheses[i], "scaling", new BABYLON.Vector3(theScaling.x * 1.01, theScaling.y * 1.01, theScaling.z * 1.01), 100));
  48. } catch (error) {
  49. //alert(error)
  50. }
  51. }*/
  52. // var clickbegin = false
  53. mesheses[i].actionManager.registerAction(
  54. new BABYLON.ExecuteCodeAction({
  55. trigger: BABYLON.ActionManager.OnPointerOverTrigger,
  56. parameter: ''
  57. },
  58. function() {
  59. // clickbegin = true
  60. // if (true) {
  61. // if (oldtransformNodeOther != null) {
  62. // oldtransformNodeOther.removeBehavior(drag)
  63. // var mesheses2 = null
  64. // if (oldtransformNodeOther.getClassName() === 'TransformNode') {
  65. // mesheses2 = oldtransformNodeOther.getChildMeshes(false)
  66. // } else {
  67. // mesheses2 = []
  68. // mesheses2.push(oldtransformNodeOther)
  69. // }
  70. // for (var i = 0; i < mesheses2.length; i++) {
  71. // try {
  72. // h2.removeMesh(mesheses2[i])
  73. // } catch (error) {
  74. // // alert(error)
  75. // }
  76. // }
  77. // }
  78. // oldtransformNodeOther = transformNodex
  79. // // transformNodex.addBehavior(drag);
  80. // var mesheses3 = null
  81. // if (transformNodex.getClassName() === 'TransformNode') {
  82. // mesheses3 = transformNodex.getChildMeshes(false)
  83. // } else {
  84. // mesheses3 = []
  85. // mesheses3.push(transformNodex)
  86. // }
  87. // for (var i = 0; i < mesheses3.length; i++) {
  88. // try {
  89. // h2.addMesh(mesheses3[i], color)
  90. // } catch (error) {
  91. // // alert(error)
  92. // }
  93. // }
  94. isRotating = false
  95. camera.useAutoRotationBehavior = isRotating
  96. // }
  97. }
  98. )
  99. )
  100. // 移出事件
  101. mesheses[i].actionManager.registerAction(
  102. new BABYLON.ExecuteCodeAction({
  103. trigger: BABYLON.ActionManager.OnPointerOutTrigger,
  104. parameter: ''
  105. },
  106. function() {
  107. // clickbegin = true
  108. // if (true) {
  109. // var mesheses4 = null
  110. // if (transformNodex.getClassName() === 'Mesh') {
  111. // mesheses4 = []
  112. // mesheses4.push(transformNodex)
  113. // }
  114. // for (var i = 0; i < mesheses4.length; i++) {
  115. // try {
  116. // h2.removeMesh(mesheses4[i])
  117. // } catch (error) {
  118. // // alert(error)
  119. // }
  120. // }
  121. // clickbegin = false
  122. isRotating = true
  123. camera.useAutoRotationBehavior = isRotating
  124. // }
  125. }
  126. )
  127. )
  128. mesheses[i].actionManager.registerAction(
  129. new BABYLON.ExecuteCodeAction({
  130. trigger: BABYLON.ActionManager.OnPickTrigger,
  131. parameter: ''
  132. },
  133. function() {
  134. clickbegin = true
  135. // if (true) {
  136. try {
  137. cameraClick(transformNodex)
  138. } catch (error) {
  139. // alert(error)
  140. }
  141. // clickbegin = false
  142. // }
  143. })
  144. )
  145. }
  146. }
  147. BABYLON.DefaultLoadingScreen.prototype.hideLoadingUI = function() {
  148. show = 50
  149. document.getElementById('customLoadingScreenDiv').style.display = 'none'
  150. document.getElementById('customLoadingScreenDiv_first').style.display = 'none'
  151. document.title = '5综3楼'
  152. var prepareGroupButton2ByMesh = function(transformNodex, color, qu) {
  153. var mesheses = null
  154. if (transformNodex.getClassName() === 'Mesh') {
  155. mesheses = []
  156. mesheses.push(transformNodex)
  157. }
  158. for (var i = 0; i < mesheses.length; i++) {
  159. mesheses[i].actionManager = new BABYLON.ActionManager(scene)
  160. // var theScaling = mesheses[i].scaling
  161. /* if (true) {
  162. try {
  163. mesheses[i].actionManager.registerAction(new BABYLON.InterpolateValueAction(BABYLON.ActionManager.OnPointerOutTrigger, mesheses[i], "scaling", new BABYLON.Vector3(theScaling.x, theScaling.y, theScaling.z), 100));
  164. mesheses[i].actionManager.registerAction(new BABYLON.InterpolateValueAction(BABYLON.ActionManager.OnPointerOverTrigger, mesheses[i], "scaling", new BABYLON.Vector3(theScaling.x * 1.01, theScaling.y * 1.01, theScaling.z * 1.01), 100));
  165. } catch (error) {
  166. //alert(error)
  167. }
  168. }*/
  169. // let clickbegin = false
  170. mesheses[i].actionManager.registerAction(
  171. new BABYLON.ExecuteCodeAction({
  172. trigger: BABYLON.ActionManager.OnPointerOverTrigger,
  173. parameter: ''
  174. },
  175. function() {
  176. // clickbegin = true
  177. // if (true) {
  178. if (oldMeshOther != null) {
  179. oldMeshOther.removeBehavior(drag)
  180. var mesheses2 = null
  181. if (oldMeshOther.getClassName() === 'Mesh') {
  182. mesheses2 = []
  183. mesheses2.push(oldMeshOther)
  184. }
  185. for (var i = 0; i < mesheses2.length; i++) {
  186. try {
  187. h2.removeMesh(mesheses2[i])
  188. } catch (error) {
  189. // alert(error)
  190. }
  191. }
  192. }
  193. oldMeshOther = transformNodex
  194. // transformNodex.addBehavior(drag);
  195. var mesheses3 = null
  196. if (transformNodex.getClassName() === 'Mesh') {
  197. mesheses3 = []
  198. mesheses3.push(transformNodex)
  199. }
  200. for (let i = 0; i < mesheses3.length; i++) {
  201. try {
  202. h2.addMesh(mesheses3[i], color)
  203. } catch (error) {
  204. // alert(error)
  205. }
  206. }
  207. // clickbegin = false
  208. isRotating = false
  209. camera.useAutoRotationBehavior = isRotating
  210. // }
  211. }
  212. )
  213. )
  214. // 移出事件
  215. mesheses[i].actionManager.registerAction(
  216. new BABYLON.ExecuteCodeAction({
  217. trigger: BABYLON.ActionManager.OnPointerOutTrigger,
  218. parameter: ''
  219. },
  220. function() {
  221. // clickbegin = true
  222. // if (true) {
  223. var mesheses4 = null
  224. if (transformNodex.getClassName() === 'Mesh') {
  225. mesheses4 = []
  226. mesheses4.push(transformNodex)
  227. }
  228. for (var i = 0; i < mesheses4.length; i++) {
  229. try {
  230. h2.removeMesh(mesheses4[i])
  231. } catch (error) {
  232. // alert(error)
  233. }
  234. }
  235. // clickbegin = false
  236. isRotating = true
  237. camera.useAutoRotationBehavior = isRotating
  238. // }
  239. }
  240. )
  241. )
  242. mesheses[i].actionManager.registerAction(
  243. new BABYLON.ExecuteCodeAction({
  244. trigger: BABYLON.ActionManager.OnPickTrigger,
  245. parameter: ''
  246. },
  247. function() {
  248. // clickbegin = true
  249. // if (true) {
  250. try {
  251. // quClick(transformNodex.name)
  252. cameraClick(transformNodex)
  253. } catch (error) {
  254. // alert(error)
  255. }
  256. // clickbegin = false
  257. // }
  258. }
  259. )
  260. )
  261. }
  262. }
  263. // 绑功能点
  264. var cl = new BABYLON.Color3(0, 0, 1)
  265. // var c2 = new BABYLON.Color3(1, 0, 0)
  266. var smokeAlarms = []
  267. scene.transformNodes.forEach(function(node) {
  268. if (node.name.startsWith('smokealarm')) {
  269. smokeAlarms.push(node)
  270. }
  271. })
  272. var length = smokeAlarms.length
  273. console.log('以 smokealarm 开头的对象数量:', length)
  274. smokeAlarms.forEach(function(jk01) {
  275. var parts = jk01.name.split('.')
  276. if (parts.length > 1) {
  277. jk01.nameID = 'S' + parts[1]
  278. } else {
  279. jk01.nameID = 'S000'
  280. }
  281. jk01.baojing = false // 假设初始不报警,可根据实际情况修改
  282. // var mesheses = null
  283. // if (jk01.getClassName() === 'TransformNode') {
  284. // mesheses = jk01.getChildMeshes(false)
  285. // } else {
  286. // mesheses = []
  287. // mesheses.push(jk01)
  288. // }
  289. // for (var i = 0; i < mesheses.length; i++) {
  290. // h2.addMesh(mesheses[i], colorToUse)
  291. // }
  292. prepareGroupButton2(jk01, cl)
  293. })
  294. // 存储所有 camera 相关的 Mesh
  295. const cameraMeshes = []
  296. scene.meshes.forEach(mesh => {
  297. if (mesh.name.startsWith('camera')) {
  298. cameraMeshes.push(mesh)
  299. }
  300. })
  301. const cameraCount = cameraMeshes.length
  302. console.log('以 camera 开头的 Mesh 数量:', cameraCount)
  303. // 定义颜色
  304. // const colorRed = new BABYLON.Color3(1, 0, 0) // 红
  305. const colorBlue = new BABYLON.Color3(0, 0, 1)
  306. cameraMeshes.forEach((cam, index) => {
  307. const paddedIndex = String(index + 1).padStart(3, '0')
  308. cam.nameID = `C${paddedIndex}`
  309. prepareGroupButton2ByMesh(cam, colorBlue, '摄像头1')
  310. })
  311. var light = new BABYLON.HemisphericLight('HemiLight', new BABYLON.Vector3(0, 1, 0), scene)
  312. light.intensity = 2
  313. light.diffuse = new BABYLON.Color3(0.92, 0.92, 0.92)
  314. // 给vue页面传值,加载完成之后
  315. parent.getIframeLoading('false')
  316. }
  317. BABYLON.DracoCompression.Configuration.decoder.wasmUrl = './js/draco_wasm_wrapper_gltf.js'
  318. BABYLON.DracoCompression.Configuration.decoder.wasmBinaryUrl = './js/draco_decoder_gltf.wasm'
  319. BABYLON.DracoCompression.Configuration.decoder.fallbackUrl = './js/draco_decoder_gltf.js'
  320. var createScene = function() {
  321. engine.displayLoadingUI()
  322. var scene = new BABYLON.Scene(engine)
  323. camera = new BABYLON.ArcRotateCamera(
  324. 'Camera', 0, 0, 120, // alpha=0(水平角度),beta=90°(垂直俯视),radius=200(距离)
  325. new BABYLON.Vector3(0, 0, 0), // 相机位置会根据 alpha/beta/radius 自动计算,无需手动设置
  326. scene
  327. )
  328. camera.setTarget(new BABYLON.Vector3(0, 0, 0)) // 瞄准原点
  329. camera.attachControl(canvas, true)
  330. // 其他参数(保持不变或按需调整)
  331. camera.lowerRadiusLimit = 10 // 最小距离(可近看)
  332. camera.upperRadiusLimit = 1000 // 最大距离(可远观)
  333. camera.inertia = 0.1 // 操作惯性
  334. camera.useAutoRotationBehavior = true // 开启自动旋转(可选)
  335. scene.clearColor = new BABYLON.Color4(0, 0, 0, 0)
  336. scene.activeCamera = camera
  337. scene.activeCamera.useInputToRestoreState = true
  338. // var camera1_status = scene.activeCamera.storeState()
  339. var assetsManager = new BABYLON.AssetsManager(scene)
  340. // var meshTask = assetsManager.addMeshTask('skull task', '', 'asset/', 'F5.glb')
  341. // meshTask.onSuccess = function(task) {
  342. // task.loadedMeshes[0].scaling = new BABYLON.Vector3(0.4, 0.4, 0.4)
  343. // task.loadedMeshes[0].position = new BABYLON.Vector3(0, 0.35, 0)
  344. // }
  345. // meshTask.onError = function(task, message, exception) {
  346. // console.log(message, exception)
  347. // }
  348. // 加载GLB模型并处理材质
  349. BABYLON.SceneLoader.LoadAssetContainerAsync('asset/', 'F5.glb', scene).then((container) => {
  350. // 遍历所有材质
  351. container.materials.forEach(material => {
  352. // 处理标准材质
  353. if (material instanceof BABYLON.StandardMaterial) {
  354. material.backFaceCulling = true // 启用背面剔除
  355. }
  356. // 处理PBR材质
  357. // if (material instanceof BABYLON.PBRMaterial) {
  358. // material.backFaceCulling = true // 启用背面剔除
  359. // }
  360. })
  361. // 将加载的资产添加到场景中
  362. container.addAllToScene()
  363. }).catch((error) => {
  364. console.error('加载模型时出错:', error)
  365. })
  366. var hdrTexture = new BABYLON.CubeTexture.CreateFromPrefilteredData('textures/environmentSpecular.env', scene)
  367. scene.environmentTexture = hdrTexture
  368. var spriteManagerPlayer = new BABYLON.SpriteManager('playerManager', './img/bl9.png', 10, {
  369. width: 100,
  370. height: 100
  371. }, scene)
  372. spriteManagerPlayer.renderingGroupId = 2
  373. spriteManagerPlayer.isPickable = true
  374. scene.onPointerDown = function(evt) {
  375. var pickResult = scene.pickSprite(this.pointerX, this.pointerY)
  376. var pick = scene.pick(scene.pointerX, scene.pointerY)
  377. console.log('pick', pick.pickedPoint)
  378. if (pickResult.pickedSprite != null) {
  379. if (pickResult.hit) {
  380. alert(pickResult.pickedSprite.name)
  381. }
  382. }
  383. }
  384. // renderCanvas.style.backgroundImage = 'url("./textures/' + '4' + '.jpg")'
  385. assetsManager.load()
  386. drag = new BABYLON.PointerDragBehavior({
  387. dragPlaneNormal: new BABYLON.Vector3(0, 0, 1)
  388. })
  389. // drag.useObjectOrienationForDragging = false;
  390. drag.validateDrag = (targetPosition) => {
  391. if (targetPosition.x > 10.5 || targetPosition.x < -10.5) {
  392. return false
  393. }
  394. if (targetPosition.z > 10.5 || targetPosition.z < -10.5) {
  395. return false
  396. }
  397. if (oldtransformNodex != null) {
  398. return true
  399. }
  400. }
  401. drag.onDragEndObservable.add((event) => {
  402. // console.log("dragEnd");
  403. // console.log(event);
  404. // console.log(line03_position)
  405. })
  406. // GUI
  407. h1 = new BABYLON.HighlightLayer('hl1', scene)
  408. h2 = new BABYLON.HighlightLayer('hl2', scene)
  409. h3 = new BABYLON.HighlightLayer('hl2', scene)
  410. var step = 0.1
  411. var currentx = 1
  412. // var step2 = 0.1
  413. // var currentx2 = 0.1
  414. h1.blurHorizontalSize = 0.1
  415. // var showx = 0
  416. // var showx2 = 2
  417. // console.log("x4");
  418. scene.registerAfterRender(() => {
  419. h1.blurHorizontalSize = h1.blurVerticalSize + currentx
  420. var nodealert = scene.getTransformNodeByName('yan')
  421. if (nodealert != null) {
  422. var mesheses3 = null
  423. if (nodealert.getClassName() === 'TransformNode') {
  424. mesheses3 = nodealert.getChildMeshes(false)
  425. } else {
  426. mesheses3 = []
  427. mesheses3.push(nodealert)
  428. }
  429. for (var i = 0; i < mesheses3.length; i++) {
  430. try {
  431. if (nodealert.baojing === true) {
  432. h3.addMesh(mesheses3[i], new BABYLON.Color3(1, 0, 0))
  433. } else {
  434. h3.removeMesh(mesheses3[i])
  435. }
  436. } catch (error) {
  437. console.log('error')
  438. }
  439. }
  440. }
  441. })
  442. if (currentx > 0.5) {
  443. step *= -1
  444. }
  445. if (currentx < 0) {
  446. step *= -1
  447. }
  448. currentx += step
  449. return scene
  450. }
  451. var canvas = document.getElementById('renderCanvas')
  452. // load the 3D engine
  453. var engine = new BABYLON.Engine(canvas, true, {
  454. stencil: true
  455. })
  456. // call the createScene function
  457. var scene = createScene()
  458. scene.autoClear = true
  459. scene.imageProcessingConfiguration.exposure = 1
  460. scene.imageProcessingConfiguration.contrast = 1
  461. scene.environmentIntensity = 0.8
  462. engine.runRenderLoop(function() {
  463. scene.render()
  464. })
  465. window.addEventListener('resize', function() {
  466. engine.resize()
  467. })
  468. function cameraClick(TheCamera) {
  469. window.parent.postMessage(
  470. {
  471. data: TheCamera.nameID
  472. },
  473. '*'
  474. )
  475. }
  476. function handleAlarm(deviceId, isAlarm) {
  477. var cl = new BABYLON.Color3(0, 0, 1)
  478. var c2 = new BABYLON.Color3(1, 0, 0)
  479. const targetDevice = scene.transformNodes.find(node => node.nameID === deviceId)
  480. if (targetDevice) {
  481. targetDevice.baojing = isAlarm
  482. var mesheses = null
  483. if (targetDevice.getClassName() === 'TransformNode') {
  484. mesheses = targetDevice.getChildMeshes(false)
  485. } else {
  486. mesheses = []
  487. mesheses.push(targetDevice)
  488. }
  489. if (isAlarm) {
  490. console.log('111')
  491. for (var i = 0; i < mesheses.length; i++) {
  492. h2.addMesh(mesheses[i], c2)
  493. }
  494. } else {
  495. console.log('222')
  496. for (var j = 0; j < mesheses.length; j++) {
  497. h2.removeMesh(mesheses[j])
  498. h2.addMesh(mesheses[j], cl)
  499. }
  500. }
  501. } else {
  502. console.log(`未找到设备 ID 为 ${deviceId} 的设备`)
  503. }
  504. }
  505. window.addEventListener(
  506. 'message',
  507. function(e) {
  508. if (e.data.type === 'deviceState') {
  509. console.log('ddd', e.data.data)
  510. const deviceData = e.data.data
  511. if (Array.isArray(deviceData)) {
  512. deviceData.forEach((device) => {
  513. handleAlarm(device.deviceId, device.isAlarm)
  514. })
  515. } else {
  516. handleAlarm(deviceData.deviceId, deviceData.isAlarm)
  517. }
  518. } else if (e.data.type === 'isGetRotate') {
  519. const isGetRotate = e.data.value
  520. console.log('isGetRotate:', isGetRotate)
  521. // 这里可以添加处理 isGetRotate 的逻辑
  522. toggleAutoRotation(isGetRotate)
  523. }
  524. },
  525. false
  526. )
  527. function toggleAutoRotation(isAutoRotating) {
  528. var camera = scene.activeCamera
  529. if (!isAutoRotating) {
  530. // 启用自动旋转
  531. camera.useAutoRotationBehavior = true
  532. } else {
  533. // 禁用自动旋转
  534. camera.useAutoRotationBehavior = false
  535. camera.angularSpeed = 0 // 停止旋转
  536. }
  537. }