diff --git a/src/app/babylon/controller/scene-manager.ts b/src/app/babylon/controller/scene-manager.ts index db13a7b..bc1f4c2 100644 --- a/src/app/babylon/controller/scene-manager.ts +++ b/src/app/babylon/controller/scene-manager.ts @@ -61,6 +61,8 @@ import { LoadTool } from '../tool/load-tool'; //场景管理器 export class SceneManager { + + //----------------Camera-----------------\\ public engine: Engine; @@ -875,11 +877,20 @@ export class SceneManager { ModeManager.log("吸附模型" + target); - let targetRoot = SceneManager.getRootTransformNode(target); + let targetRoot = SceneManager.getRootTransformNode(target) as AbstractMesh; if (mover == targetRoot) { return; } + + //先通过吸附点吸附 + let byAdsorbPoint = BabylonTool.adsorb2MeshByPoint(mover, targetRoot, "WAI") + + //完成吸附了 + if (byAdsorbPoint) { + return; + } + let aimPos_y: number = 0; let direction = 0.5; diff --git a/src/app/babylon/tool/babylon-tool.ts b/src/app/babylon/tool/babylon-tool.ts index a3a6cde..ee8e9d0 100644 --- a/src/app/babylon/tool/babylon-tool.ts +++ b/src/app/babylon/tool/babylon-tool.ts @@ -10,6 +10,7 @@ import { ISceneLoaderPluginAsync, ISceneLoaderProgressEvent, Mesh, + Node, NodeMaterial, PBRMaterial, QuadraticEase, @@ -537,6 +538,56 @@ export class BabylonTool { } + /** + * 根据特殊节点名匹配,吸附两个mesh + * 现在移动者身上找到包含key的节点,然后以此节点名去目标者身上找对齐的节点 + * @param mover 移动者 + * @param targetRoot 目标者 + * @param key 特殊字符串 + */ + public static adsorb2MeshByPoint(mover: AbstractMesh, targetRoot: AbstractMesh, key: string) { + //吸附成功 + let isSuccess = false; + //找到移动者的对齐点 + + let moverAdsorbNode = BabylonTool.getNodeContainKey(mover, key); + + if (moverAdsorbNode != null && moverAdsorbNode.length > 0 && targetRoot instanceof Mesh) { + let moverAdsorbPoint = moverAdsorbNode[0] as AbstractMesh; + let aimNode = BabylonTool.getNodeContainKey(targetRoot, moverAdsorbPoint.name); + if (aimNode != null && aimNode.length > 0) { + let aimAdsorbPoint = aimNode[0] as AbstractMesh; + let aimPos = aimAdsorbPoint.getAbsolutePosition(); + + //世界坐标下,移动者的吸附点相对于根节点的偏移 + let moverLocalPos = moverAdsorbPoint.getAbsolutePosition().subtract(mover.getAbsolutePosition()); + let moverNewPos = aimPos.subtract(moverLocalPos); + mover.setAbsolutePosition(moverNewPos); + + isSuccess = true; + } + } + return isSuccess; + } + + /** + * 获取包含某关键字的子节点 + * 特殊字符:Adsorb_ + * @param mesh + */ + public static getNodeContainKey(mesh: AbstractMesh, key: string) { + let moverAdsorbNode = mesh.getChildren((node: Node) => { + if (TsTool.stringContain(node.name, key)) { + return true; + } + else { + return false; + } + }, false) + return moverAdsorbNode; + } + + } //输入提示界面