From b099d5695d5605c7f36cd895b403a28d347e8aab Mon Sep 17 00:00:00 2001 From: hyper Date: Tue, 17 Mar 2026 12:49:49 +0800 Subject: [PATCH] refactor: move centering to 3mf gen --- src/components/md-token-viewer.tsx | 8 -------- src/components/utils/3mf-generator.ts | 12 +++++++++++- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/components/md-token-viewer.tsx b/src/components/md-token-viewer.tsx index c4be243..ab99ce3 100644 --- a/src/components/md-token-viewer.tsx +++ b/src/components/md-token-viewer.tsx @@ -51,14 +51,6 @@ export default function MdTokenViewer(props: TokenViewerProps) { // 3MF 文件可能返回一个 Group,包含多个 Mesh group = object instanceof THREE.Group ? object : new THREE.Group().add(object); - - // 计算边界框并居中 - const box = new THREE.Box3().setFromObject(group); - const center = box.getCenter(new THREE.Vector3()); - group.position.x = -center.x; - group.position.y = -center.y; - group.position.z = -center.z; - group.rotateX(Math.PI); // 为每个 mesh 启用原始颜色 diff --git a/src/components/utils/3mf-generator.ts b/src/components/utils/3mf-generator.ts index 47a3da2..0052601 100644 --- a/src/components/utils/3mf-generator.ts +++ b/src/components/utils/3mf-generator.ts @@ -1,6 +1,7 @@ import * as THREE from "three"; import { exportTo3MF } from "three-3mf-exporter"; import type { TraceResult } from "./image-tracer"; +import {Vector3} from "three"; export interface ExtrusionSettings { size: number; // 模型整体尺寸 (mm) @@ -53,6 +54,7 @@ export async function generate3MF( const meshes: LayerMesh[] = []; let layerIndex = 0; + let boundingBox = new THREE.Box3(); for (const layerSetting of settings.layers) { const layer = traceResult.layers.find((l) => l.id === layerSetting.id); if (!layer) continue; @@ -61,9 +63,11 @@ export async function generate3MF( const extrudeSettings: THREE.ExtrudeGeometryOptions = { depth: layerSetting.thickness, curveSegments: 36, - bevelEnabled: false, + bevelEnabled: true, + bevelSize: 0.4 }; const geometry: THREE.ExtrudeGeometry = new THREE.ExtrudeGeometry(layer.paths, extrudeSettings); + geometry.computeBoundingBox(); // 为该图层生成颜色 const color = generateLayerColor(layerIndex); @@ -74,6 +78,7 @@ export async function generate3MF( }); const mesh = new THREE.Mesh(geometry, material); + boundingBox.expandByObject(mesh); // 设置图层高度(堆叠) mesh.position.y = currentHeight; @@ -90,6 +95,11 @@ export async function generate3MF( layerIndex++; } + const center = boundingBox.getCenter(new Vector3()); + for(const mesh of meshes){ + mesh.mesh.position.sub(center); + } + if (meshes.length === 0) { throw new Error("没有可生成的图层"); }