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

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