From d93e6bcdf95b7a9d179264ce1d3f6a644686880b Mon Sep 17 00:00:00 2001 From: kim Date: Sun, 20 Sep 2026 21:19:31 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EC=8A=AC=EB=9D=BC=EC=9D=B4=EC=84=9C=20?= =?UTF-8?q?=ED=88=B4=ED=8C=A8=EC=8A=A4=EA=B0=80=20=EB=B9=8C=EB=93=9C?= =?UTF-8?q?=ED=94=8C=EB=A0=88=EC=9D=B4=ED=8A=B8=20=EC=A4=91=EC=8B=AC?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EB=B2=97=EC=96=B4=EB=82=98=EB=8D=98=20?= =?UTF-8?q?=EB=AC=B8=EC=A0=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PrusaSlicer가 모델을 베드 중심(130,130)에 두고 gcode 좌표를 베드 좌표계 (0~260) 그대로 내보내는데, 렌더링에서 거기에 +BED/2(+130)를 또 더해서 모델이 (260,260) 모서리 쪽으로 밀려 보였음("중심에서 벗어나 있네"). 수정: gcode X → three X 오프셋 없이 그대로, gcode Z(높이) → three Y, gcode Y → three Z = BED - gcodeY. Z를 뒤집는 건 STL 미리보기(rotateX -90)가 STL +Y를 three -Z로 보내는 것과 정렬하기 위함. 실측: 모델 three X/Z 둘 다 130.00 중심, 0~260 베드 안. STL 미리보기와 동일 위치로 겹침. Co-Authored-By: Claude Code --- web-ui/js/k2/slicer-view.js | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/web-ui/js/k2/slicer-view.js b/web-ui/js/k2/slicer-view.js index f94fa02..4e179df 100644 --- a/web-ui/js/k2/slicer-view.js +++ b/web-ui/js/k2/slicer-view.js @@ -314,8 +314,9 @@ } if (px !== nx || py !== ny || pz !== nz) { const color = extruding ? (TYPE_COLORS[curType] ?? DEFAULT_COLOR) : TRAVEL_COLOR; + // gcode 좌표계: X/Y가 베드 평면(0~260), Z가 높이. 세그먼트엔 {x=gcodeX, y=gcodeZ(높이), z=gcodeY}. + // STL(rotateX -90)과 정렬하기 위해 렌더단에서 Z를 BED-gcodeY 로 뒤집음(아래 renderToolpath). layers[curLayer].segs.push({ x1: px, y1: pz, z1: py, x2: nx, y2: nz, z2: ny, color }); - // 주의: gcode 좌표계는 X/Y 평면, Z가 높이. three는 Y가 높이. y1=pz(높이), z1=py(평면Y). } x = nx; y = ny; z = nz; e = ne; } @@ -338,10 +339,13 @@ for (let s = 0; s < segs.length; s++) { const sg = segs[s]; const o = s * 6; - // gcode (X,Y,Z) → three (X, Z, Y) 매핑으로 STL과 정렬(위 parseGcode에서 이미 적용). - // 여기선 이미 y1=높이, z1=평면Y 로 넣어둠. 플레이트 중앙 오프셋 더함. - pos[o] = sg.x1 + BED / 2; pos[o + 1] = sg.y1; pos[o + 2] = sg.z1 + BED / 2; - pos[o + 3] = sg.x2 + BED / 2; pos[o + 4] = sg.y2; pos[o + 5] = sg.z2 + BED / 2; + // gcode (X,Y,Z) → three (X, 높이Y, Z) 매핑. PrusaSlicer가 모델을 베드 중심(130,130)에 + // 두고 gcode 좌표를 베드 좌표계(0~260) 그대로 내보내므로 X는 오프셋 없이 그대로. + // Z는 BED-gcodeY 로 뒤집어 STL 미리보기(rotateX -90 → STL +Y가 three -Z)와 정렬 — + // 옛 코드의 +BED/2 오프셋은 gcode가 이미 베드좌표인 걸 몰라 두 번 더해서 (260,260) 모서리로 + // 밀어버렸음(2026-09-20 "중심에서 벗어남" 수정). + pos[o] = sg.x1; pos[o + 1] = sg.y1; pos[o + 2] = BED - sg.z1; + pos[o + 3] = sg.x2; pos[o + 4] = sg.y2; pos[o + 5] = BED - sg.z2; const c = new THREE.Color(sg.color); col[o] = c.r; col[o + 1] = c.g; col[o + 2] = c.b; col[o + 3] = c.r; col[o + 4] = c.g; col[o + 5] = c.b;