Browse Source

应急中,加载会暂停镜头动画(避免卡顿中移动镜头),加载完会恢复, 镜头动画完才会开始播语音。

dev
刘向辉 3 years ago
parent
commit
cc2d749ce0
  1. 6
      src/app/babylon/model/data/mark/mark-plan-data.ts
  2. 6
      src/app/babylon/tool/babylon-tool.ts
  3. 36
      src/app/babylon/view/building-window/building-window.ts
  4. 27
      src/app/babylon/view/mark-window/mark-window.ts

6
src/app/babylon/model/data/mark/mark-plan-data.ts

@ -196,10 +196,6 @@ export class MarkPlanData {
*/
export class MarkNodeData {
/**
*
*/
static readonly speakWaitTime = 1.5;
/**
* id
@ -375,7 +371,7 @@ export class MarkNodeData {
let minTime = 4; //最短停留时间
let result = textNum * timeScale + MarkNodeData.speakWaitTime + 1;
let result = textNum * timeScale + 1;
if (result < minTime) {
result = minTime;
}

6
src/app/babylon/tool/babylon-tool.ts

@ -1,3 +1,4 @@
import { NumberValueAccessor } from '@angular/forms';
import {
AbstractMesh,
Animation,
@ -130,7 +131,7 @@ export class BabylonTool {
path = ObjectsService.getFullPath(path); //根据环境,动态改变桶名
}
console.log("异步加载模型" + path + sceneFilename);
// console.log("异步加载模型" + path + sceneFilename);
let modelPath = path + sceneFilename;
LoadTool.add(modelPath, tag);
@ -345,6 +346,7 @@ export class BabylonTool {
radius: number,
alpha: number,
beta: number,
onAnimationEnd?: () => void
) {
//缓动动画
let easingFunction = new QuadraticEase();
@ -416,7 +418,7 @@ export class BabylonTool {
camera.animations.push(anim_a);
camera.animations.push(anim_b);
camera._scene.beginAnimation(camera, 0, allFrame, false);
return camera._scene.beginAnimation(camera, 0, allFrame, false, undefined, onAnimationEnd);
}

36
src/app/babylon/view/building-window/building-window.ts

@ -1,8 +1,10 @@
import { AbstractMesh, Material, Mesh, PBRMaterial, Texture } from "@babylonjs/core";
import { AbstractMesh, Material, Mesh, PBRMaterial, Texture, Animatable } from "@babylonjs/core";
import { PlanComponent } from "src/app/pages/plan/plan.component";
import { ConfigManager } from "../../controller/config-manager";
import { DataManager } from "../../controller/data-manager";
import { EventManager } from "../../controller/event-manager/event-manager";
import { Event_LoadingChange } from "../../controller/event-manager/events/event-loading-change";
import { InfoManager } from "../../controller/info-manager";
import { ModeManager, ModeType } from "../../controller/mode-manager";
import { SceneManager } from "../../controller/scene-manager";
@ -23,6 +25,7 @@ import { ModelInfo_building } from "../../model/info/model/model-info-building";
import { FacilityInfoByType, ModelInfo_facility } from "../../model/info/model/model-info-facility";
import { BabylonTool } from "../../tool/babylon-tool";
import { GizmoTool } from "../../tool/gizmo-tool";
import { LoadTool } from "../../tool/load-tool";
import { TsTool } from "../../tool/ts-tool";
import { FacilityInfoInSceneWindow } from "../facilityinfoinscene-window/facilityinfoinscene-window";
import { MarkWindow } from "../mark-window/mark-window";
@ -49,6 +52,7 @@ export class BuildingWindow extends UIBase {
three: PlanComponent;//前端组件
cameraAnim: Animatable;//相机动画
//#region 与前端对接部分
@ -283,12 +287,15 @@ export class BuildingWindow extends UIBase {
* @param cameraData
* @param showZP
*/
revoverCamera(cameraData: ArcRotateCameraData, showZP: boolean) {
revoverCamera(cameraData: ArcRotateCameraData, showZP: boolean, onAnimationEnd?: () => void) {
this.showZP(showZP);
PlanComponent.instance.isOpenAwning = showZP;
let camera = SceneManager.Instance.defaultCamera;
if (cameraData != null) {
BabylonTool.AnimMoveCameraTargetAB(camera, 60, cameraData.target, cameraData.radius, cameraData.alpha, cameraData.beta);
this.cameraAnim = BabylonTool.AnimMoveCameraTargetAB(camera, 60, cameraData.target, cameraData.radius, cameraData.alpha, cameraData.beta, onAnimationEnd);
if (Event_LoadingChange.isLoading) {
this.cameraAnim.pause();
}
}
}
@ -314,6 +321,10 @@ export class BuildingWindow extends UIBase {
SceneManager.Instance.scene.onBeforeRenderObservable.add(() => {
instance.onUpdate();
})
EventManager.addListener<Event_LoadingChange>(Event_LoadingChange, (eventInfo) => {
instance.onChangeLoading(eventInfo);
});
}
onShow() {
@ -331,6 +342,25 @@ export class BuildingWindow extends UIBase {
}
/**
* loading状态改变时
* @param eventInfo
*/
onChangeLoading(eventInfo: Event_LoadingChange) {
if (eventInfo.showLoading) {
if (this.cameraAnim != null) {
this.cameraAnim.pause();
}
}
else {
if (this.cameraAnim != null) {
this.cameraAnim.restart();
}
}
}
//#endregion

27
src/app/babylon/view/mark-window/mark-window.ts

@ -369,14 +369,14 @@ export class MarkWindow extends UIBase {
this.currentMarkNodeDataCopy = nodeCopy;//更新备份数据
this.currentMarkNodeInfo = new MarkNodeInfo(markPlanData, this.currentMarkNodeDataCopy);
//this.currentMarkNodeDataCopy = classToClass(this.currentMarkNodeInfo.nodeData); //更新备份数据
this.updateNodeInfo();
let instance = this;
if (readDescribe) { //镜头移动完,开始说话
setTimeout(() => {
instance.readDescribe(nodeCopy.describe);
}, MarkNodeData.speakWaitTime * 1000);
this.updateNodeInfo(readDescribe);
// let instance = this;
// if (readDescribe) { //镜头移动完,开始说话
// setTimeout(() => {
// instance.readDescribe(nodeCopy.describe);
// }, MarkNodeData.speakWaitTime * 1000);
}
// }
}
@ -947,6 +947,8 @@ export class MarkWindow extends UIBase {
//#endregion
//#region 查询类
@ -1178,8 +1180,9 @@ export class MarkWindow extends UIBase {
*
*
*
* @param readDescribe: 是否阅读介绍
*/
updateNodeInfo() {
updateNodeInfo(readDescribe = false) {
let environmentData = this.currentMarkNodeInfo.nodeData.getCurrentEnvironmentData();
let cameraData = this.currentMarkNodeInfo.nodeData.cameraData;
let showZP = this.currentMarkNodeInfo.nodeData.showZP;
@ -1209,7 +1212,13 @@ export class MarkWindow extends UIBase {
// }
//仅此分支生效
BuildingWindow.instance.revoverCamera(cameraData, showZP);
//动画还原相机,结束后开始阅读
BuildingWindow.instance.revoverCamera(cameraData, showZP, (() => {
if (readDescribe) {
instance.readDescribe(instance.currentMarkNodeInfo.nodeData.describe);
}
}));
instance.clearEnterObserver(true);

Loading…
Cancel
Save