|
|
@ -21,6 +21,20 @@ var drag = null |
|
|
|
|
|
|
|
var isRotating = true |
|
|
|
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 |
|
|
|
BABYLON.DefaultLoadingScreen.prototype.displayLoadingUI = function() { |
|
|
|
if (document.getElementById('customLoadingScreenDiv')) { |
|
|
@ -401,6 +415,10 @@ var createScene = function() { |
|
|
|
}) |
|
|
|
// 将加载的资产添加到场景中
|
|
|
|
container.addAllToScene() |
|
|
|
|
|
|
|
setTimeout(() => { |
|
|
|
moveCameraTo('alarm') |
|
|
|
}, 3000) |
|
|
|
}).catch((error) => { |
|
|
|
console.error('加载模型时出错:', error) |
|
|
|
}) |
|
|
@ -522,6 +540,7 @@ window.addEventListener('resize', function() { |
|
|
|
function cameraClick(TheCamera) { |
|
|
|
window.parent.postMessage( |
|
|
|
{ |
|
|
|
type: 'cameraClick', |
|
|
|
data: TheCamera.nameID |
|
|
|
}, |
|
|
|
'*' |
|
|
@ -557,6 +576,7 @@ function handleAlarm(deviceId, isAlarm) { |
|
|
|
console.log(`未找到设备 ID 为 ${deviceId} 的设备`) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
window.addEventListener( |
|
|
|
'message', |
|
|
|
function(e) { |
|
|
@ -592,3 +612,73 @@ function toggleAutoRotation(isAutoRotating) { |
|
|
|
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 }, '*') |
|
|
|
}) |
|
|
|
} |