fix: 슬라이서 툴패스가 빌드플레이트 중심에서 벗어나던 문제 수정

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 <noreply@anthropic.com>
This commit is contained in:
kim
2026-09-20 21:19:31 +09:00
co-authored by Claude Code
parent 9a0026b225
commit d93e6bcdf9
+9 -5
View File
@@ -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;