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;