x
This commit is contained in:
+23
-15
@@ -537,6 +537,19 @@ class HTMLGenerator:
|
||||
// 统一按场景包围盒调整相机,避免模型错位/尺度不一致导致观感混乱
|
||||
fitCameraToScene();
|
||||
|
||||
// 保存各组件原始位置(分模动画合模时复原用)
|
||||
const cavityHomePos = {{
|
||||
x: cavityMesh ? cavityMesh.position.x : 0,
|
||||
y: cavityMesh ? cavityMesh.position.y : 0,
|
||||
z: cavityMesh ? cavityMesh.position.z : 0,
|
||||
}};
|
||||
const coreHomePos = {{
|
||||
x: coreMesh ? coreMesh.position.x : 0,
|
||||
y: coreMesh ? coreMesh.position.y : 0,
|
||||
z: coreMesh ? coreMesh.position.z : 0,
|
||||
}};
|
||||
const partingHomeOpacity = partingMesh ? partingMesh.material.opacity : 0.3;
|
||||
|
||||
// 动画循环
|
||||
function animate() {{
|
||||
requestAnimationFrame(animate);
|
||||
@@ -610,7 +623,7 @@ class HTMLGenerator:
|
||||
}}
|
||||
|
||||
function splitMold() {{
|
||||
if (!cavityMesh && !coreMesh) return;
|
||||
if (!cavityMesh || !coreMesh) return;
|
||||
isSplit = !isSplit;
|
||||
const btn = document.getElementById('splitBtn');
|
||||
btn.textContent = isSplit ? '合模' : '分模拆分';
|
||||
@@ -618,33 +631,28 @@ class HTMLGenerator:
|
||||
const bboxDims = geometryData.bounding_box?.dimensions || [100, 100, 100];
|
||||
const dir = getPartingDirection();
|
||||
|
||||
// 根据分模方向确定拆分轴和距离
|
||||
let splitDist, axis;
|
||||
if (dir === 'Z') {{
|
||||
// Z轴上下开模:拆分距离取 Z 方向高度的 40%
|
||||
splitDist = bboxDims[2] * 0.4;
|
||||
axis = 'z';
|
||||
}} else if (dir === 'Y') {{
|
||||
// Y轴前后开模
|
||||
splitDist = bboxDims[1] * 0.4;
|
||||
axis = 'y';
|
||||
}} else {{
|
||||
// X轴左右开模
|
||||
splitDist = bboxDims[0] * 0.4;
|
||||
axis = 'x';
|
||||
}}
|
||||
|
||||
// 分型面动画目标透明度
|
||||
const partingTargetOpacity = isSplit ? 0 : 0.3;
|
||||
const partingTargetOpacity = isSplit ? 0 : partingHomeOpacity;
|
||||
|
||||
// 记录起始位置
|
||||
const cavityStart = cavityMesh ? cavityMesh.position[axis] : 0;
|
||||
const coreStart = coreMesh ? coreMesh.position[axis] : 0;
|
||||
const cavityStart = cavityMesh.position[axis];
|
||||
const coreStart = coreMesh.position[axis];
|
||||
const cavityHome = cavityHomePos[axis];
|
||||
const coreHome = coreHomePos[axis];
|
||||
const partingStartOpacity = partingMesh ? partingMesh.material.opacity : 0.3;
|
||||
|
||||
// 目标位置:型腔正向移动,型芯负向移动
|
||||
const cavityTarget = isSplit ? splitDist : 0;
|
||||
const coreTarget = isSplit ? -splitDist : 0;
|
||||
const cavityTarget = isSplit ? (cavityHome + splitDist) : cavityHome;
|
||||
const coreTarget = isSplit ? (coreHome - splitDist) : coreHome;
|
||||
|
||||
const duration = 800; // ms
|
||||
const startTime = performance.now();
|
||||
@@ -665,17 +673,17 @@ class HTMLGenerator:
|
||||
}}
|
||||
if (partingMesh) {{
|
||||
partingMesh.material.opacity = partingStartOpacity + (partingTargetOpacity - partingStartOpacity) * ease;
|
||||
if (isSplit && t >= 1) partingMesh.visible = false;
|
||||
else partingMesh.visible = true;
|
||||
}}
|
||||
|
||||
if (t < 1) {{
|
||||
splitAnimId = requestAnimationFrame(animateSplit);
|
||||
}} else {{
|
||||
splitAnimId = null;
|
||||
if (partingMesh) partingMesh.visible = !isSplit;
|
||||
}}
|
||||
}}
|
||||
|
||||
if (partingMesh) partingMesh.visible = true;
|
||||
splitAnimId = requestAnimationFrame(animateSplit);
|
||||
}}
|
||||
</script>
|
||||
|
||||
Reference in New Issue
Block a user