华农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.

544 lines
17 KiB

2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 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 = '整体'
  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. prepareGroupButton2(jk01, cl)
  283. })
  284. // 存储所有 camera 相关的 Mesh
  285. const cameraMeshes = []
  286. scene.meshes.forEach(mesh => {
  287. if (mesh.name.startsWith('camera')) {
  288. cameraMeshes.push(mesh)
  289. }
  290. })
  291. const cameraCount = cameraMeshes.length
  292. console.log('以 camera 开头的 Mesh 数量:', cameraCount)
  293. // 定义颜色
  294. // const colorRed = new BABYLON.Color3(1, 0, 0) // 红
  295. const colorBlue = new BABYLON.Color3(0, 0, 1)
  296. cameraMeshes.forEach((cam, index) => {
  297. const paddedIndex = String(index + 1).padStart(3, '0')
  298. cam.nameID = `C${paddedIndex}`
  299. prepareGroupButton2ByMesh(cam, colorBlue, '摄像头1')
  300. })
  301. var light = new BABYLON.HemisphericLight('HemiLight', new BABYLON.Vector3(0, 1, 0), scene)
  302. light.intensity = 2
  303. light.diffuse = new BABYLON.Color3(0.92, 0.92, 0.92)
  304. // 给vue页面传值,加载完成之后
  305. parent.getIframeLoading('false')
  306. }
  307. BABYLON.DracoCompression.Configuration.decoder.wasmUrl = './js/draco_wasm_wrapper_gltf.js'
  308. BABYLON.DracoCompression.Configuration.decoder.wasmBinaryUrl = './js/draco_decoder_gltf.wasm'
  309. BABYLON.DracoCompression.Configuration.decoder.fallbackUrl = './js/draco_decoder_gltf.js'
  310. var createScene = function() {
  311. engine.displayLoadingUI()
  312. var scene = new BABYLON.Scene(engine)
  313. camera = new BABYLON.ArcRotateCamera(
  314. 'Camera', 0, 0, 60, // alpha=0(水平角度),beta=90°(垂直俯视),radius=200(距离)
  315. new BABYLON.Vector3(0, 0, 0), // 相机位置会根据 alpha/beta/radius 自动计算,无需手动设置
  316. scene
  317. )
  318. camera.setTarget(new BABYLON.Vector3(0, 0, 0)) // 瞄准原点
  319. camera.attachControl(canvas, true)
  320. // 其他参数(保持不变或按需调整)
  321. camera.lowerRadiusLimit = 50 // 最小距离(可近看)
  322. camera.upperRadiusLimit = 500 // 最大距离(可远观)
  323. camera.inertia = 0.1 // 操作惯性
  324. camera.useAutoRotationBehavior = true // 开启自动旋转(可选)
  325. scene.clearColor = new BABYLON.Color4(0, 0, 0, 0)
  326. scene.activeCamera = camera
  327. scene.activeCamera.useInputToRestoreState = true
  328. // var camera1_status = scene.activeCamera.storeState()
  329. var assetsManager = new BABYLON.AssetsManager(scene)
  330. var meshTask = assetsManager.addMeshTask('skull task', '', 'asset/', 'F5.glb')
  331. meshTask.onSuccess = function(task) {
  332. task.loadedMeshes[0].scaling = new BABYLON.Vector3(0.4, 0.4, 0.4)
  333. task.loadedMeshes[0].position = new BABYLON.Vector3(0, 0.35, 0)
  334. }
  335. meshTask.onError = function(task, message, exception) {
  336. console.log(message, exception)
  337. }
  338. var hdrTexture = new BABYLON.CubeTexture.CreateFromPrefilteredData('textures/environmentSpecular.env', scene)
  339. scene.environmentTexture = hdrTexture
  340. var spriteManagerPlayer = new BABYLON.SpriteManager('playerManager', './img/bl9.png', 10, {
  341. width: 100,
  342. height: 100
  343. }, scene)
  344. spriteManagerPlayer.renderingGroupId = 2
  345. spriteManagerPlayer.isPickable = true
  346. scene.onPointerDown = function(evt) {
  347. var pickResult = scene.pickSprite(this.pointerX, this.pointerY)
  348. var pick = scene.pick(scene.pointerX, scene.pointerY)
  349. console.log('pick', pick.pickedPoint)
  350. if (pickResult.pickedSprite != null) {
  351. if (pickResult.hit) {
  352. alert(pickResult.pickedSprite.name)
  353. }
  354. }
  355. }
  356. // renderCanvas.style.backgroundImage = 'url("./textures/' + '4' + '.jpg")'
  357. assetsManager.load()
  358. drag = new BABYLON.PointerDragBehavior({
  359. dragPlaneNormal: new BABYLON.Vector3(0, 0, 1)
  360. })
  361. // drag.useObjectOrienationForDragging = false;
  362. drag.validateDrag = (targetPosition) => {
  363. // console.log(targetPosition)
  364. if (targetPosition.x > 10.5 || targetPosition.x < -10.5) {
  365. return false
  366. }
  367. if (targetPosition.z > 10.5 || targetPosition.z < -10.5) {
  368. return false
  369. }
  370. if (oldtransformNodex != null) {
  371. return true
  372. }
  373. }
  374. drag.onDragEndObservable.add((event) => {
  375. // console.log("dragEnd");
  376. // console.log(event);
  377. // console.log(line03_position)
  378. })
  379. // console.log("x3");
  380. // GUI
  381. h1 = new BABYLON.HighlightLayer('hl1', scene)
  382. h2 = new BABYLON.HighlightLayer('hl2', scene)
  383. h3 = new BABYLON.HighlightLayer('hl2', scene)
  384. var step = 0.1
  385. var currentx = 1
  386. // var step2 = 0.1
  387. // var currentx2 = 0.1
  388. h1.blurHorizontalSize = 0.1
  389. // var showx = 0
  390. // var showx2 = 2
  391. // console.log("x4");
  392. scene.registerAfterRender(() => {
  393. h1.blurHorizontalSize = h1.blurVerticalSize + currentx
  394. var nodealert = scene.getTransformNodeByName('yan')
  395. if (nodealert != null) {
  396. var mesheses3 = null
  397. if (nodealert.getClassName() === 'TransformNode') {
  398. mesheses3 = nodealert.getChildMeshes(false)
  399. } else {
  400. mesheses3 = []
  401. mesheses3.push(nodealert)
  402. }
  403. for (var i = 0; i < mesheses3.length; i++) {
  404. try {
  405. if (nodealert.baojing === true) {
  406. h3.addMesh(mesheses3[i], new BABYLON.Color3(1, 0, 0))
  407. } else {
  408. h3.removeMesh(mesheses3[i])
  409. }
  410. } catch (error) {
  411. console.log('error')
  412. }
  413. }
  414. }
  415. })
  416. if (currentx > 0.5) {
  417. step *= -1
  418. }
  419. if (currentx < 0) {
  420. step *= -1
  421. }
  422. currentx += step
  423. return scene
  424. }
  425. var canvas = document.getElementById('renderCanvas')
  426. // load the 3D engine
  427. var engine = new BABYLON.Engine(canvas, true, {
  428. stencil: true
  429. })
  430. // call the createScene function
  431. var scene = createScene()
  432. scene.autoClear = true
  433. scene.imageProcessingConfiguration.exposure = 1
  434. scene.imageProcessingConfiguration.contrast = 1
  435. scene.environmentIntensity = 0.8
  436. engine.runRenderLoop(function() {
  437. scene.render()
  438. })
  439. window.addEventListener('resize', function() {
  440. engine.resize()
  441. })
  442. function cameraClick(TheCamera) {
  443. window.parent.postMessage(
  444. {
  445. data: TheCamera.nameID
  446. },
  447. '*'
  448. )
  449. }
  450. function handleAlarm(deviceId, isAlarm) {
  451. var cl = new BABYLON.Color3(0, 0, 1)
  452. var c2 = new BABYLON.Color3(1, 0, 0)
  453. const targetDevice = scene.transformNodes.find(node => node.nameID === deviceId)
  454. if (targetDevice) {
  455. targetDevice.baojing = isAlarm
  456. var mesheses = null
  457. if (targetDevice.getClassName() === 'TransformNode') {
  458. mesheses = targetDevice.getChildMeshes(false)
  459. } else {
  460. mesheses = []
  461. mesheses.push(targetDevice)
  462. }
  463. if (isAlarm) {
  464. console.log('111')
  465. for (var i = 0; i < mesheses.length; i++) {
  466. h2.addMesh(mesheses[i], c2)
  467. }
  468. } else {
  469. console.log('222')
  470. for (var j = 0; j < mesheses.length; j++) {
  471. h2.removeMesh(mesheses[j])
  472. h2.addMesh(mesheses[j], cl)
  473. }
  474. }
  475. } else {
  476. console.log(`未找到设备 ID 为 ${deviceId} 的设备`)
  477. }
  478. }
  479. // 监测父页面传来得初始化得温度湿度值
  480. window.addEventListener(
  481. 'message',
  482. function(e) {
  483. console.log('ddd', e.data.data)
  484. const deviceData = e.data.data
  485. if (Array.isArray(deviceData)) {
  486. deviceData.forEach(device => {
  487. handleAlarm(device.deviceId, device.isAlarm)
  488. })
  489. } else {
  490. handleAlarm(deviceData.deviceId, deviceData.isAlarm)
  491. }
  492. },
  493. false
  494. )
  495. window.handleAlarm = handleAlarm