Postingan ini belum diterjemahkan ke Bahasa Indonesia. Menampilkan teks asli.
카페에서 어느분이 아이가 스케치한걸 모델링은 했는데 잘 안된다고 도와 달라고 하십니다.
이걸 바이브 모델링으로 시도합니다.
제가 만들어 둔 mcp와 freecad라는 오픈cad툴을 썼습니다.
아래 내용은 전부 AI가 작성한 내용입니다.
---------------------------------------------------
아이 스케치로 만든 Print-in-Place 상어 장난감 — Claude + FreeCAD MCP 작업기
들어가며
아이가 그린 상어 스케치를 컨셉 렌더로 만든 그림 한 장에서 시작해, 하루 만에 조립 없이 한 번에 출력되는(print-in-place) 관절 상어 장난감 모델까지 갔습니다. 코드는 한 줄도 직접 쓰지 않았고, Claude 채팅에 제 프롬프트를 넣으면 Claude가 FreeCAD 안에서 파이썬으로 모델을 만들고 검사하는 방식입니다. 최종 결과물과 출력 설정을 먼저 보여드리고, 단계별 프롬프트와 답변·검사 결과는 그 뒤에 정리합니다.

아이 스케치

부모님이 하신 모델링.
사용한 도구
도구 | 역할 |
Claude (Claude 앱) | 프롬프트 해석, 설계 결정, FreeCAD 파이썬 코드 생성 |
FreeCAD 1.1.3 | 실제 모델링 (Part 워크벤치 솔리드 연산) |
cadxray MCP (직접 만든 FreeCAD 진단용 MCP) | Claude가 FreeCAD를 직접 조작: execute_code로 모델 생성, check_interference(부품 간섭), check_printability(출력 가능성 점수), get_screenshot(3D 뷰 캡처), save_document |
cadxray는 기존 FreeCAD MCP(툴 150개짜리)가 너무 무거워서 진단 기능만 골라 직접 만든 것입니다. 수정은 execute_code 하나로 하고, 나머지는 "지금 상태가 어떤지"를 재는 도구들입니다. 이번 작업에서는 그 진단 도구가 설계 수정의 근거를 숫자로 줬다는 점이 제일 컸습니다.
작업은 네 단계로 진행됐습니다. 1차 핀 조립식 → 2차 print-in-place 전환 → 3차 길이 파라메트릭화 → 4차 아이 피드백 반영(눈·입). 단계별 내용은 결과물 다음에 있습니다.
이 모델의 특징
네 가지로 요약됩니다. 서포트 없이 찍히고, 출력 후 털어내면 바로 움직이고, 길이를 바꿔 다시 뽑을 수 있고, 이 모든 것을 코드 한 줄 안 쓰고 프롬프트만으로 만들었습니다.

서포트 없이 출력됩니다. 배를 바닥에 놓는 한 방향으로 모든 면이 45° 안에 들어오도록 설계했습니다. 아래로 향한 가시는 바닥 지느러미로, 가로핀은 마름모 단면으로, 핀 구멍 위쪽은 눈물방울로, 포켓 천장은 45° 지붕으로 바꾼 결과입니다. 출력 가능성 검사 93점, 서포트 필요 면적 56 mm²(아가미 홈 천장 정도).
출력 후 털어내면 바로 움직입니다. 관절 4개(몸통 3 + 턱 1)의 핀이 모두 부품에 붙은 채 찍히는 print-in-place 구조라 조립이 없습니다. 부품 사이 틈은 0.4~0.5 mm로 전부 같게 잡았고, 간섭 검사에서 겹침 0이 확인됐습니다. 몸통은 관절당 ±15°, 입은 45°까지 열립니다.
스크립트 한 줄로 전체 길이가 바뀝니다. 형상은 길이에 비례하고 공차·벽 두께·핀 최소 지름은 고정되는 파라메트릭 구조입니다. L 값만 바꾸면 그 길이로 FCStd와 STL이 다시 나오고, 최소 길이(137 mm) 아래로 내려가면 어느 벽이 얇아지는지 알려주고 멈춥니다.
바이브 코딩으로 만들었습니다. 프롬프트 8개, 그중 4개는 한 줄이었고 FreeCAD 파이썬 코드는 전부 Claude가 썼습니다. 저는 아이 스케치와 참고 사진, 스크린샷에 보라색 표시를 넘겼고, 치수·관절 구조·공차·제약식은 Claude가 정하고 검사 도구로 스스로 확인했습니다. 작업 시간은 반나절, 모델 한 번 생성에 2~3초입니다.
결과물과 출력 설정

최종 모델은 전체 183 × 66 × 62 mm, 부품 5개가 한 STL에 들어 있는 print-in-place 파일입니다. 슬라이서에 올리고 서포트만 끄면 됩니다.
파일
파일 | 내용 |
SharkToy_PrintInPlace_L184.5.stl | 통짜 출력용. 이것 하나만 올리면 됩니다 |
Head / LowerJaw / BodyMid / BodyRear / Tail_L184.5.stl | 부품별 STL (색을 나눠 찍거나 수정용) |
SharkToy_L184.5.FCStd | FreeCAD 문서 |
shark_toy_param.py | 파라메트릭 스크립트. FreeCAD 파이썬 콘솔에서 실행하면 위 파일을 모두 다시 만듭니다 (글 맨 끝에 전문) |
부품 구성 (최종)
부품 | 치수 (mm) | 관절 |
Head | 52 × 26 × 30 | 뒤: 오목 컵 + 혀 (→ 몸통1) / 턱 포켓 + 마름모 가로핀 |
LowerJaw | 48 × 26 × 14.5 | 머리 핀에 걸려 45°까지 열림 |
BodyMid | 51.5 × 32 × 34 | 앞: 볼록 + 홈 + 세로핀 / 뒤: 오목 컵 + 혀 |
BodyRear | 51 × 28 × 28 | 앞·뒤 모두 볼록 + 홈 + 세로핀 |
Tail | 자루 14 × 18 + 지느러미 5 mm | 앞: 오목 컵 + 혀 |
출력 설정
방향: 배가 바닥. STL이 이미 그 방향입니다.
서포트: 끄기. 브릿지가 12곳 있는데 전부 혀 위 0.4 mm 틈이라 그대로 찍힙니다.
레이어 0.2 mm, 노즐 0.4 mm. 틈 값이 이 기준으로 잡혀 있습니다.
브릿지 구간 냉각 최대, 첫 층 과압출(elephant foot) 보정은 켜 두면 부품 사이 바닥 틈이 덜 붙습니다.
재료: PLA 기준. PETG는 수축이 달라서 관절이 뻑뻑하면 스크립트의 GR을 0.6으로 올려 다시 뽑으면 됩니다.
출력 후
관절마다 좌우로 몇 번 흔들어 풀어 주고, 입은 아래턱을 한 번 당겨서 떼어냅니다. 이빨 사이 0.8 mm 틈이 처음에는 살짝 붙어 있을 수 있습니다. 눈알은 검정, 등지느러미 Ø10 홈에는 태극 스티커를 붙이면 아이 그림대로 됩니다.
다른 크기로 뽑기
shark_toy_param.py 맨 아래 L = 184.5를 원하는 길이로 바꾸고 실행하면 됩니다. 137 mm 아래는 어느 벽이 얇아지는지 알려주고 멈추고(계산 근거는 아래 3차 참고), 220 베드면 215 mm까지 들어갑니다. 저장 경로는 스크립트 안 outdir 한 줄입니다.
1차: 핀 조립식 9부품 모델
첫 프롬프트 하나로 부품 5개 + 핀 4개, 전체 길이 178 mm짜리 조립식 모델이 나왔습니다. 모델링 자체는 2초였고, 바로 뒤에 MCP가 4분간 멈추는 사고가 있었습니다.
제 프롬프트 (컨셉 렌더 이미지 첨부)
이거 아이가 스케치한거 컨셉 모델링한건데 freecad로 3d프린터로 출력 가능하도록 모델링 해줘. 몸통과 입이 움직일 수 있도록 해줘. 몸통은 핀을 세로로 만들어서 연결하면 좌우로 움직일수 있을거 같아. 입은 열린 상태에서 아래 턱을 손으로 위아래 움직이도록 좌우로 핀을 넣을 수 있을거 같아.
Claude의 답변 요약
Claude는 먼저 FreeCAD 연결을 확인(ping → 1.1.3, GUI 모드)한 뒤 Part 워크벤치 파이썬으로 한 번에 모델을 만들었습니다. 치수는 제가 주지 않아서 Claude가 정했습니다.

부품 | 치수 (mm) | 특징 |
Head (윗턱) | 42 × 26 × 30 | 윗니 톱니, 양쪽 눈 홈, 뒤쪽에 세로핀용 혀 |
LowerJaw | 36.5 × 26 × 9.5 | 아랫니 톱니, 뒤끝 혀가 머리 포켓에 들어가 가로핀으로 회전, 최대 35° |
BodyMid | 47 × 32 × 34 | 등지느러미(태극 스티커 자리 Ø10 홈), 아가미 3줄, 가슴 가시 2개 |
BodyRear | 40 × 28 × 28 | 배 가시 2개 |
Tail | 자루 + 꼬리지느러미 5 mm | |
Pin × 4 | Ø4 | 턱 1개(가로), 몸통 관절 3개(세로) |
몸통 관절은 제가 말한 대로 세로핀 방식입니다. 앞 부품의 혀(10 mm 두께)가 뒤 부품 앞면 슬롯에 들어가고, 핀 구멍은 바닥에서 뚫되 위 3 mm를 막아 위에서 핀이 안 보이게 했습니다. 관절당 좌우 약 ±20°. 핀 끼워맞춤은 핀 4.0, 고정측 구멍 4.2(압입), 회전측 4.6(자유 회전)으로 FDM 기준으로 잡았습니다. 닫힌 상태에서 윗니·아랫니가 0.5 mm 간격으로 맞물리도록 톱니를 반 피치 어긋나게 배치한 것도 Claude가 알아서 한 부분입니다.

MCP가 멈춘 에피소드
모델 생성 직후 스크린샷을 요청하자 4분 타임아웃이 나고, ping까지 응답이 없었습니다. Claude는 "FreeCAD에 문서가 살아 있어도 저장이 안 된 상태"라고 판단하고, 같은 모델을 다시 만드는 독립 실행 스크립트를 파일로 내줬습니다. 다음 턴에 연결이 돌아와서 그 스크립트를 쓸 일은 없었지만, MCP 작업에서는 이런 백업이 있어야 마음이 놓입니다.
2차: 아래턱 키우기 + 라운드 관절 + print-in-place
핀을 따로 끼우는 대신 핀까지 한 덩어리로 찍히는 구조로 바꿨고, 출력 가능성 점수가 65점에서 93점으로 올라갔습니다. 아래턱은 7 → 12 mm로 키웠습니다.
제 프롬프트 (시판 플렉시 상어 사진 첨부)
아래턱이 더 커야할거 같은데
몸통 연결부도 이 상어 모델처럼 접합부를 좌우 라운드를 줘서 더 밀착할 수 있겠고 어차피 조립할게 아니니 핀을 끼워넣는게 아니고 첨부터 한번에 출력이 되도록 넣을수 있겠어

Claude의 답변 요약
설계가 거의 새로 짜였습니다. 핵심은 네 가지입니다.
몸통 관절 3곳: 앞 부품 뒤끝은 볼록 원통면, 뒤 부품 앞면은 오목 컵. 두 면이 같은 축(핀)을 중심으로 하니 어느 각도로 꺾어도 틈 0.5 mm로 밀착된 채 움직입니다. 앞 부품의 혀(두께 8 mm)가 뒤 부품 홈에 들어가고, 뒤 부품에 붙어 있는 세로핀(Ø4.5)이 혀 구멍(Ø5.5)을 관통합니다. 관절당 ±15°, 그 이상은 혀가 홈 벽에 닿아 멈춥니다.
턱 힌지도 print-in-place: 가로핀은 서포트 없이 찍히도록 45° 돌린 마름모 단면(한 변 3.4 mm), 턱 쪽 구멍은 위가 뾰족한 눈물방울. 입은 닫힌 상태로 출력됩니다. 배를 바닥에 놓으면 열린 턱이 바닥 아래로 내려가서 열린 채로는 못 찍습니다.
배를 바닥에 놓고 찍으므로 아래로 향한 가시 4개는 사진처럼 바닥에 붙은 옆지느러미(3 mm)로 바꿨습니다. 아래로 향한 가시는 서포트 없이 안 됩니다.
턱 뒤쪽 아래 모서리는 입이 최대로 열릴 때 볼(cheek)에 닿지 않도록 그 각도만큼 돌린 평면으로 잘라냈습니다.

print-in-place 틈 값 (0.4 노즐, 0.2 레이어 기준)
위치 | 틈 (mm) | 이유 |
핀-구멍 반지름 방향 | 0.5 | 수직 벽끼리는 0.5면 깨끗이 분리 |
혀 위·아래 | 0.4 | 브릿지로 찍히는 수평 틈, 2레이어 |
혀 옆-홈 벽 | 0.5 | |
볼록면-오목 컵 | 0.5 | |
윗니-아랫니 수직 | 0.8 | 45° 경사면이라 수직 0.57 mm에 해당 |
턱 혀 위-포켓 천장 | 1.5 | 폭 14.8 mm 브릿지 |
검사 결과
check_interference(5부품, 허용 틈 0.3): 간섭 0, 최소 거리 0.4 mm. 10쌍 모두 ok.
check_printability 1차: 65점. 0.8 mm 미만 얇은 벽 8곳(가장 얇은 0.36 mm), 서포트 필요 면적 417 mm².
원인은 두 가지였습니다. 블록 아랫모서리 필렛이 오버행으로 잡혔고(바닥에 놓고 찍으니 필요 없는 필렛), 몸통1 뒤 컵 가장자리가 박스 끝과 겹쳐 칼날처럼 얇게 남았습니다. 눈 반구 홈도 위쪽이 처지는 오버행이었습니다.
수정: 필렛을 윗모서리에만(r 2), 몸통1 박스 끝을 94 → 90.5 mm로 당겨 컵 가장자리 살 1.1 mm 확보, 눈은 얕은 홈으로.
check_printability 2차: 93점. 얇은 벽 0, 서포트 면적 56 mm²(아가미 홈 천장 1.5 mm짜리와 윗턱 앞끝 2 mm 폭). 브릿지 12곳은 전부 혀 위 0.4 mm 틈이라 의도된 것.
3차: 전체 길이를 입력하는 파라메트릭 설계
스크립트 맨 아래 L 한 줄만 바꾸면 그 길이로 모델이 나오고, 최소 길이(현재 설정 137 mm)보다 작게 넣으면 어느 벽이 얇아지는지 알려주고 멈춥니다.
제 프롬프트
이거 전체 길이를 입력하면 반영이 되도록 파라메트릭 설계가 가능할까? 미니멈 길이가 있을거 같은데 (최소 형상 크기때문에)..
Claude의 답변 요약
단순 스케일로는 안 되는 이유가 분명합니다. 관절 틈 0.5 mm를 절반 크기에서 0.25로 줄이면 붙어 나오고, 벽 1.6 mm가 0.8이 되면 부러집니다. 그래서 치수를 두 부류로 나눴습니다.
길이에 비례하는 것 | 길이와 무관하게 고정하는 것 |
블록 크기, 관절 위치, 지느러미 윤곽, 이빨 피치, 눈 위치 | 관절 틈 0.5 / 0.4, 이빨 사이 0.8 |
핀 지름 (단, 바닥값 이하로 안 내려감: 몸통 3.0, 꼬리 2.5, 턱 마름모 2.4) | 최소 벽 두께 1.6 (0.4 노즐 4겹) |
혀 폭·두께 (바닥값: 구멍 + 벽 1.6, 두께 2.4) | 지느러미 최소 두께 1.6, 바닥 지느러미 1.2 |
지느러미 두께, 아가미 홈 폭·깊이 (바닥값 있음) | 아가미 최소 폭 0.8 |
길이를 줄이면 고정량의 비중이 커져서 어느 순간 어딘가의 벽이 1.6 mm 아래로 떨어집니다. 그 조건을 스크립트가 16개로 적어 두고(몸통 코 옆벽, 꼬리자루 폭, 홈 천장과 바닥, 볼 두께, 턱 혀 둘레살, 턱 구멍 위 살, 포켓 뒷벽, 이빨 높이, 눈-입 간격, 윗턱 두께 등), 60 mm부터 0.5 mm씩 올리며 전부 통과하는 첫 길이를 최소 길이로 돌려줍니다.
결과
처음 계산된 최소 길이는 130.5 mm, 걸리는 조건은 "턱 포켓 뒷벽과 머리 뒤 컵 사이 살 1.6 mm"였습니다. 4차에서 입을 키우며 힌지가 뒤로 가서 137 mm로 올라갔습니다.
최소 길이 모델을 실제로 만들어 확인: 5부품 모두 유효, 부품 간 거리 0.4 mm, 겹침 0. 그 크기에서 몸통 핀 3.3, 꼬리 핀 2.6, 이빨 높이 1.9 mm.
더 작게 가려면 WALL을 1.2(퍼리미터 3겹)로 낮추거나 턱 힌지를 앞으로 당기면 되지만, 아이 장난감이면 137 아래는 핀이 너무 가늘어 권하지 않는다고 했습니다. 위쪽은 베드만 허용하면 되고 220 베드면 L 215까지 들어갑니다.
제가 중간에 멈춘 상태가 아니라 Claude가 제약식을 직접 세우고 스캔까지 해준 게 인상적이었습니다. "미니멈이 있을 것 같다"는 감만 던졌는데 그 미니멈이 왜 그 값인지까지 돌아왔습니다.
4차: 아이 피드백 반영 — 눈, 입, 눈알
아이가 모델을 보고 세 가지를 지적했고, 셋 다 스크린샷에 표시만 해서 넘기는 걸로 해결됐습니다.
제 프롬프트 (FreeCAD 스크린샷에 보라색으로 표시해서 첨부)
눈 위치를 이정도로 이동해줘

웁스.. 입도 더 벌어지게 해달라고 하네.

눈알이 없는데?
Claude의 답변 요약
요청 | 변경 | 수치 |
눈 위치 | 스크린샷의 표시 위치를 픽셀로 환산해 뒤로 이동 | x 16 → 25 mm, 높이 23 mm 그대로 |
입 더 벌어지게 | 입꼬리를 뒤로 늘리고(이빨 한 쌍 추가) 벌어짐 각도 상향. 힌지가 뒤로 간 만큼 머리를 늘리고 뒷부품은 통째로 뒤로 | 입꼬리 25 → 34 mm, 35° → 45°, 머리 43.5 → 52 mm, 기준 길이 176 → 184.5 mm. 앞끝 벌어짐 14 → 24 mm |
눈알 | 얕은 홈 대신 눈구멍(소켓)을 파고 돔을 붙임 | 소켓 Ø8.4 × 0.6 깊이, 돔 반지름 3.2, 옆면에서 2.6 mm 돌출 |
벌어짐 각도를 45°에서 멈춘 이유가 있습니다. 아래턱 뒤쪽 아래 모서리는 입이 열릴 때 볼에 닿지 않도록 그 각도만큼 기울인 평면으로 잘려 있는데, 이 면은 배를 바닥에 놓고 찍을 때 오버행이 됩니다. 45°를 넘기면 서포트가 필요해집니다. 눈알 돔도 아래쪽 1 mm 정도는 45°를 넘는 오버행이지만, 크기가 작아 서포트 없이 그냥 찍힙니다.
입을 키우면서 최소 길이가 130.5 → 137 mm로 올라간 것은 3차에 적은 대로입니다. 걸리는 조건(턱 포켓 뒷벽 살)은 같습니다.

정리와 팁
프롬프트 여덟 개, 그중 넷은 한 줄짜리였습니다. 설계 결정의 대부분은 Claude가 했고, 제가 한 일은 방향 제시와 아이 피드백 전달이었습니다.
효과가 있었던 것
진단 도구가 수정의 근거를 숫자로 줬습니다. "얇은 벽 8곳, 가장 얇은 0.36 mm, Face135 (92.19, 15.24, 33.16)"처럼 좌표까지 나오니 Claude가 원인(컵 가장자리와 박스 끝이 겹침)을 바로 짚고 고쳤습니다. 간섭 검사도 "최소 거리 0.4, 겹침 0"으로 끝나니 제가 눈으로 확인할 일이 없었습니다.
사진 한 장이 설계 사양이 됐습니다. 시판 플렉시 상어 사진을 보내자 볼록/오목 관절, 바닥 지느러미, 핀 일체형까지 알아서 가져왔습니다. 아이 피드백도 스크린샷에 보라색 칠만 해서 넘겼습니다.
파라메트릭을 "비례량 / 고정량" 분리로 풀었습니다. 3D 프린터 모델을 축소할 때 늘 문제가 되는 공차·벽 두께를 고정하고 최소 길이를 계산해 주는 구조라, 다른 print-in-place 모델에도 그대로 쓸 수 있는 접근입니다.
설계 제한의 이유가 함께 왔습니다. 입을 45°까지만 벌린 이유(턱 뒤 경사면 오버행), 입을 닫은 채 찍는 이유(열린 턱이 바닥 아래로), 가시를 지느러미로 바꾼 이유(서포트) 같은 것들입니다.
주의할 점
MCP가 멈출 수 있습니다. 이번에도 한 번 4분 타임아웃이 났고, 그때 받아 둔 재생성 스크립트가 보험이었습니다. 모델이 완성되면 바로 저장·STL 내보내기까지 시키는 게 안전합니다.
틈 값은 프린터마다 다릅니다. 0.5 / 0.4 / 0.8은 0.4 노즐 PLA 기준이고, 관절이 붙어 나오면 스크립트 상단 GR·GV를 0.1씩 올려서 다시 뽑으면 됩니다.
최소 길이는 "출력이 되는" 하한이지 "튼튼한" 하한이 아닙니다. 137 mm에서 꼬리 핀이 Ø2.6이라 아이가 험하게 다루면 부러질 수 있습니다. 아이 장난감은 160 mm 이상을 권합니다.
눈알 돔 아래쪽과 윗턱 앞끝은 작은 오버행이라 표면이 살짝 거칠 수 있습니다. 검정 페인트로 가려집니다.
아이가 다음 주문으로 "꼬리도 위아래로 움직이게"를 내놓을 것 같은데, 그건 가로핀이 하나 더 들어가야 해서 다음 글이 될 듯합니다.
부록: 파라메트릭 스크립트 전문
FreeCAD 1.0 이상 파이썬 콘솔에서 exec(open(r"경로\shark_toy_param.py", encoding="utf-8").read()) 한 줄로 실행됩니다. 외부 라이브러리는 없습니다. 길이(L)·틈(GR, GV)·벽 두께(WALL)·벌어짐 각(OPEN)이 모두 상단 상수라 바꿔 가며 실험해 보시기 좋습니다. 저장 경로(outdir)는 각자 환경에 맞게 고치세요.