|  | @ -21,6 +21,20 @@ var drag = null | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  | var isRotating = true |  |  | var isRotating = true | 
		
	
		
			
				|  |  | var clickParentRotate = false |  |  | var clickParentRotate = false | 
		
	
		
			
				|  |  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |  | var targetAngles = { | 
		
	
		
			
				|  |  |  |  |  |   default: { // 初始视角
 | 
		
	
		
			
				|  |  |  |  |  |     alpha: 0, | 
		
	
		
			
				|  |  |  |  |  |     beta: 0, | 
		
	
		
			
				|  |  |  |  |  |     radius: 125 | 
		
	
		
			
				|  |  |  |  |  |   }, | 
		
	
		
			
				|  |  |  |  |  |   alarm: { // 报警视角(示例)
 | 
		
	
		
			
				|  |  |  |  |  |     alpha: 4.7190, // -π(180度)
 | 
		
	
		
			
				|  |  |  |  |  |     beta: 0.0100, // π/4(45度)
 | 
		
	
		
			
				|  |  |  |  |  |     radius: 136.5303 // 更近的距离
 | 
		
	
		
			
				|  |  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
 | 
		
	
		
			
				|  |  | var camera |  |  | var camera | 
		
	
		
			
				|  |  | BABYLON.DefaultLoadingScreen.prototype.displayLoadingUI = function() { |  |  | BABYLON.DefaultLoadingScreen.prototype.displayLoadingUI = function() { | 
		
	
		
			
				|  |  |   if (document.getElementById('customLoadingScreenDiv')) { |  |  |   if (document.getElementById('customLoadingScreenDiv')) { | 
		
	
	
		
			
				|  | @ -401,6 +415,10 @@ var createScene = function() { | 
		
	
		
			
				|  |  |     }) |  |  |     }) | 
		
	
		
			
				|  |  |     // 将加载的资产添加到场景中
 |  |  |     // 将加载的资产添加到场景中
 | 
		
	
		
			
				|  |  |     container.addAllToScene() |  |  |     container.addAllToScene() | 
		
	
		
			
				|  |  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |  |     setTimeout(() => { | 
		
	
		
			
				|  |  |  |  |  |       moveCameraTo('alarm') | 
		
	
		
			
				|  |  |  |  |  |     }, 3000) | 
		
	
		
			
				|  |  |   }).catch((error) => { |  |  |   }).catch((error) => { | 
		
	
		
			
				|  |  |     console.error('加载模型时出错:', error) |  |  |     console.error('加载模型时出错:', error) | 
		
	
		
			
				|  |  |   }) |  |  |   }) | 
		
	
	
		
			
				|  | @ -522,6 +540,7 @@ window.addEventListener('resize', function() { | 
		
	
		
			
				|  |  | function cameraClick(TheCamera) { |  |  | function cameraClick(TheCamera) { | 
		
	
		
			
				|  |  |   window.parent.postMessage( |  |  |   window.parent.postMessage( | 
		
	
		
			
				|  |  |     { |  |  |     { | 
		
	
		
			
				|  |  |  |  |  |       type: 'cameraClick', | 
		
	
		
			
				|  |  |       data: TheCamera.nameID |  |  |       data: TheCamera.nameID | 
		
	
		
			
				|  |  |     }, |  |  |     }, | 
		
	
		
			
				|  |  |     '*' |  |  |     '*' | 
		
	
	
		
			
				|  | @ -557,6 +576,7 @@ function handleAlarm(deviceId, isAlarm) { | 
		
	
		
			
				|  |  |     console.log(`未找到设备 ID 为 ${deviceId} 的设备`) |  |  |     console.log(`未找到设备 ID 为 ${deviceId} 的设备`) | 
		
	
		
			
				|  |  |   } |  |  |   } | 
		
	
		
			
				|  |  | } |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
 | 
		
	
		
			
				|  |  | window.addEventListener( |  |  | window.addEventListener( | 
		
	
		
			
				|  |  |   'message', |  |  |   'message', | 
		
	
		
			
				|  |  |   function(e) { |  |  |   function(e) { | 
		
	
	
		
			
				|  | @ -592,3 +612,73 @@ function toggleAutoRotation(isAutoRotating) { | 
		
	
		
			
				|  |  |     camera.angularSpeed = 0 // 停止旋转
 |  |  |     camera.angularSpeed = 0 // 停止旋转
 | 
		
	
		
			
				|  |  |   } |  |  |   } | 
		
	
		
			
				|  |  | } |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |  | // 相机运动到指定视角(带动画)
 | 
		
	
		
			
				|  |  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |  | function moveCameraTo(targetPreset) { | 
		
	
		
			
				|  |  |  |  |  |   // 获取目标参数
 | 
		
	
		
			
				|  |  |  |  |  |   var target = targetAngles[targetPreset] | 
		
	
		
			
				|  |  |  |  |  |   if (!target) return console.error('无效的视角预设') | 
		
	
		
			
				|  |  |  |  |  |   var camera = scene.activeCamera | 
		
	
		
			
				|  |  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |  |   // 禁用用户交互(可选)
 | 
		
	
		
			
				|  |  |  |  |  |   camera.panningInertia = 0 // 禁止平移
 | 
		
	
		
			
				|  |  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |  |   // 创建并设置动画
 | 
		
	
		
			
				|  |  |  |  |  |   var animationAlpha = new BABYLON.Animation( | 
		
	
		
			
				|  |  |  |  |  |     'cameraAlphaAnimation', | 
		
	
		
			
				|  |  |  |  |  |     'alpha', | 
		
	
		
			
				|  |  |  |  |  |     60, // 帧率
 | 
		
	
		
			
				|  |  |  |  |  |     BABYLON.Animation.ANIMATIONTYPE_FLOAT, | 
		
	
		
			
				|  |  |  |  |  |     BABYLON.Animation.ANIMATIONLOOPMODE_CONSTANT | 
		
	
		
			
				|  |  |  |  |  |   ) | 
		
	
		
			
				|  |  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |  |   var animationBeta = new BABYLON.Animation( | 
		
	
		
			
				|  |  |  |  |  |     'cameraBetaAnimation', | 
		
	
		
			
				|  |  |  |  |  |     'beta', | 
		
	
		
			
				|  |  |  |  |  |     60, // 帧率
 | 
		
	
		
			
				|  |  |  |  |  |     BABYLON.Animation.ANIMATIONTYPE_FLOAT, | 
		
	
		
			
				|  |  |  |  |  |     BABYLON.Animation.ANIMATIONLOOPMODE_CONSTANT | 
		
	
		
			
				|  |  |  |  |  |   ) | 
		
	
		
			
				|  |  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |  |   var animationRadius = new BABYLON.Animation( | 
		
	
		
			
				|  |  |  |  |  |     'cameraRadiusAnimation', | 
		
	
		
			
				|  |  |  |  |  |     'radius', | 
		
	
		
			
				|  |  |  |  |  |     60, // 帧率
 | 
		
	
		
			
				|  |  |  |  |  |     BABYLON.Animation.ANIMATIONTYPE_FLOAT, | 
		
	
		
			
				|  |  |  |  |  |     BABYLON.Animation.ANIMATIONLOOPMODE_CONSTANT | 
		
	
		
			
				|  |  |  |  |  |   ) | 
		
	
		
			
				|  |  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |  |   // 定义关键帧
 | 
		
	
		
			
				|  |  |  |  |  |   var keysAlpha = [ | 
		
	
		
			
				|  |  |  |  |  |     { frame: 0, value: camera.alpha }, | 
		
	
		
			
				|  |  |  |  |  |     { frame: 120, value: target.alpha } | 
		
	
		
			
				|  |  |  |  |  |   ] | 
		
	
		
			
				|  |  |  |  |  |   var keysBeta = [ | 
		
	
		
			
				|  |  |  |  |  |     { frame: 0, value: camera.beta }, | 
		
	
		
			
				|  |  |  |  |  |     { frame: 120, value: target.beta } | 
		
	
		
			
				|  |  |  |  |  |   ] | 
		
	
		
			
				|  |  |  |  |  |   var keysRadius = [ | 
		
	
		
			
				|  |  |  |  |  |     { frame: 0, value: camera.radius }, | 
		
	
		
			
				|  |  |  |  |  |     { frame: 120, value: target.radius } | 
		
	
		
			
				|  |  |  |  |  |   ] | 
		
	
		
			
				|  |  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |  |   animationAlpha.setKeys(keysAlpha) | 
		
	
		
			
				|  |  |  |  |  |   animationBeta.setKeys(keysBeta) | 
		
	
		
			
				|  |  |  |  |  |   animationRadius.setKeys(keysRadius) | 
		
	
		
			
				|  |  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |  |   // 设置缓动函数
 | 
		
	
		
			
				|  |  |  |  |  |   var easingFunction = new BABYLON.CubicEase() | 
		
	
		
			
				|  |  |  |  |  |   easingFunction.setEasingMode(BABYLON.EasingFunction.EASINGMODE_EASEINOUT) | 
		
	
		
			
				|  |  |  |  |  |   animationAlpha.setEasingFunction(easingFunction) | 
		
	
		
			
				|  |  |  |  |  |   animationBeta.setEasingFunction(easingFunction) | 
		
	
		
			
				|  |  |  |  |  |   animationRadius.setEasingFunction(easingFunction) | 
		
	
		
			
				|  |  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |  |   // 开始动画
 | 
		
	
		
			
				|  |  |  |  |  |   scene.beginDirectAnimation(camera, [animationAlpha, animationBeta, animationRadius], 0, 120, false, 1, function() { | 
		
	
		
			
				|  |  |  |  |  |     // 动画完成后恢复用户交互
 | 
		
	
		
			
				|  |  |  |  |  |     camera.panningInertia = 0.1 | 
		
	
		
			
				|  |  |  |  |  |     toggleAutoRotation(true) | 
		
	
		
			
				|  |  |  |  |  |     window.parent.postMessage({ type: 'autoRotationStatus', value: true }, '*') | 
		
	
		
			
				|  |  |  |  |  |   }) | 
		
	
		
			
				|  |  |  |  |  | } |