Browse Source

修复 限制镜头平移y 带来的bug

兼容关联复制模型
修改加载策略,放弃1+n模式,因为indexDB问题已经另外解决
dev
刘向辉 3 years ago
parent
commit
8f5f2345c5
  1. 4
      README.md
  2. 3
      src/app/babylon/controller/scene-manager.ts
  3. 27
      src/app/babylon/model/info/model/model-info-building.ts
  4. 4
      src/app/babylon/tool/babylon-tool.ts
  5. 89
      src/app/babylon/view/building-window/building-window.ts

4
README.md

@ -5,6 +5,7 @@
### 🌻 简介
> 时间:2022、1、22 周六
> 优化加载
> 增加镜头限制、增加吸附功能
### 🌻 详情
@ -17,7 +18,8 @@
> 三维部分
- [🚩 重大变更]
- [🚩 重大变更] 增加对关联复制模型的支持,可以大幅减少 bin 文件的大小,增加解析速度与渲染速度
- [🚩 重大变更] 暂时停止 1+n 的模型加载模式(indexDB 问题以在另外的地方进行解决),充分利用并发加载
- [🌱 新增] 摄像头旋转时设置限制,避免看到场景的底部
- [🌱 新增] 增加建筑吸附、对齐到场景中的功能,确定对齐规则,使用“WAI”节点作为插槽
- [🍀 完善]

3
src/app/babylon/controller/scene-manager.ts

@ -11,6 +11,7 @@ import {
EventState,
HemisphericLight,
HighlightLayer,
InstancedMesh,
IParticleSystem,
ISceneLoaderProgressEvent,
Mesh,
@ -665,7 +666,7 @@ export class SceneManager {
canPick = true;
//}
if (SceneManager.s_openShadow) {
if (SceneManager.s_openShadow && !(newMeshes[i] instanceof InstancedMesh)) {
newMeshes[i].receiveShadows = true;
// let mat = newMeshes[i].material;

27
src/app/babylon/model/info/model/model-info-building.ts

@ -28,7 +28,7 @@ export class ModelInfo_building extends ModelInfo {
facilityInfos: FacilityInfoByType[] = [];
buildingType: BuildingType = BuildingType.Normal;
neiRoot: TransformNode; //facilityRoot参照的节点
anchorRoot: TransformNode; //facilityRoot参照的节点
updateObserver: Observer<Scene>;
onSetModelBox() {
@ -39,30 +39,29 @@ export class ModelInfo_building extends ModelInfo {
initFacilityRoot() {
let allTransformNode = this.modelBox.getChildTransformNodes();
this.neiRoot = null;
this.anchorRoot = null;
for (let i = 0; i < allTransformNode.length; i++) {
if (TsTool.stringContain(allTransformNode[i].name, "nei")) {
this.neiRoot = allTransformNode[i];
this.anchorRoot = allTransformNode[i];
break;
}
}
if (this.neiRoot == null) {
if (this.anchorRoot == null) {
for (let i = 0; i < allTransformNode.length; i++) {
if (TsTool.stringContain(allTransformNode[i].name, "WAI")) {
this.neiRoot = allTransformNode[i];
BuildingWindow.instance.setLimitCameraY_min(this.neiRoot.absolutePosition.y);
this.anchorRoot = allTransformNode[i];
break;
}
}
}
if (this.neiRoot == null) {
if (this.anchorRoot == null) {
if (!TsTool.stringContain(this.modelBox.name, "Box")) {
console.error("没有关键节点", this.modelBox.name);
}
this.neiRoot = this.modelBox;
this.anchorRoot = this.modelBox;
}
if (this.facilityRoot != null) {
@ -208,13 +207,17 @@ export class ModelInfo_building extends ModelInfo {
onBeforeRender() {
// console.log(this.modelBox.absolutePosition);
this.facilityRoot.position = this.neiRoot.absolutePosition.clone();
this.facilityRoot.rotation = this.neiRoot.rotation.clone();
this.facilityRoot.position = this.anchorRoot.absolutePosition.clone();
this.facilityRoot.rotation = this.anchorRoot.rotation.clone();
//if (this.modelBox.rotationQuaternion != null) {
this.facilityRoot.rotationQuaternion = this.neiRoot.absoluteRotationQuaternion.clone();
if (this.neiRoot.parent != null && (this.neiRoot.parent as TransformNode).scaling.y < 0) {
this.facilityRoot.rotationQuaternion = this.anchorRoot.absoluteRotationQuaternion.clone();
if (this.anchorRoot.parent != null && (this.anchorRoot.parent as TransformNode).scaling.y < 0) {
this.facilityRoot.scaling.y = -1;
}
if (TsTool.stringContain(this.anchorRoot.name, "WAI") && BuildingWindow.instance != null) {
BuildingWindow.instance.setLimitCameraY_min(this.anchorRoot.absolutePosition.y);
}
//}
}

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

@ -275,14 +275,14 @@ export class BabylonTool {
}
else {
let alpha = BabylonTool.alpha_N;
camera.target = BabylonTool.getWorldPosition(mesh).clone();
camera.target = BabylonTool.getWorldPosition(mesh);
camera.radius = maxScaleAxis + 50;
camera.alpha = alpha;
camera.beta = 1;
BabylonTool.AnimMoveCameraTarget(
camera,
60,
BabylonTool.getWorldPosition(mesh).clone(),
BabylonTool.getWorldPosition(mesh),
maxScaleAxis + 5
);
}

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

@ -554,47 +554,58 @@ export class BuildingWindow extends UIBase {
}
}
if (allModelNumber > 1) {
if (firstType == BuildingType.Environment) {
instance.createOneBuildingItem(firstItem, 0, (uiItem, index) => {
instance.onChangeCurrentBuildingItem(uiItem, false);
// uiItem.lookAt(false);
if (buildingDatas_Environment.length > 1) {
instance.addBuildings(BuildingType.Environment, 1);
}
instance.addBuildings(BuildingType.Normal, 0);
});
}
else {
instance.createOneBuildingItem(firstItem, 0, (uiItem, index) => {
instance.onChangeCurrentBuildingItem(uiItem, false);
// uiItem.lookAt(false);
if (buildingDatas_mormal.length > 1) {
instance.addBuildings(BuildingType.Normal, 1);
}
instance.addBuildings(BuildingType.Environment, 0);
});
//暂时关闭 1+ n的加载模式
// if (allModelNumber > 1) {
// if (firstType == BuildingType.Environment) {
// instance.createOneBuildingItem(firstItem, 0, (uiItem, index) => {
// instance.onChangeCurrentBuildingItem(uiItem, false);
// // uiItem.lookAt(false);
// if (buildingDatas_Environment.length > 1) {
// instance.addBuildings(BuildingType.Environment, 1);
// }
// instance.addBuildings(BuildingType.Normal, 0);
// });
// }
// else {
// instance.createOneBuildingItem(firstItem, 0, (uiItem, index) => {
// instance.onChangeCurrentBuildingItem(uiItem, false);
// // uiItem.lookAt(false);
// if (buildingDatas_mormal.length > 1) {
// instance.addBuildings(BuildingType.Normal, 1);
// }
// instance.addBuildings(BuildingType.Environment, 0);
// });
// }
// }
// else {
// instance.addBuildings(BuildingType.Normal, 0, (uiItem, index) => {
// if (index == 0 && uiItem.buildingInfo.isEnable) {
// instance.onChangeCurrentBuildingItem(uiItem, false);
// //uiItem.lookAt(false);
// // console.log("默认选中" + uiItem.buildingInfo.buildingData.normalData.key);
// }
// });
// instance.addBuildings(BuildingType.Environment, 0);
// }
instance.addBuildings(BuildingType.Normal, 0, (uiItem, index) => {
if (index == 0 && uiItem.buildingInfo.isEnable) {
instance.onChangeCurrentBuildingItem(uiItem, false);
//uiItem.lookAt(false);
// console.log("默认选中" + uiItem.buildingInfo.buildingData.normalData.key);
}
});
}
else {
instance.addBuildings(BuildingType.Normal, 0, (uiItem, index) => {
if (index == 0 && uiItem.buildingInfo.isEnable) {
instance.onChangeCurrentBuildingItem(uiItem, false);
//uiItem.lookAt(false);
// console.log("默认选中" + uiItem.buildingInfo.buildingData.normalData.key);
}
});
instance.addBuildings(BuildingType.Environment, 0);
}
instance.addBuildings(BuildingType.Environment, 0);
}

Loading…
Cancel
Save