Codex로 Blender 깊게 쓰기
멘토용 심화 · 3D 트랙 전체에서 참고
✅ 2026-09-14 멘토 맥에서 직접 돌려본 결과 기준 — macOS 26 · Blender 5.0.1 · blender-mcp 1.30.0 · Codex CLI 0.144.6
한 줄 요약
Codex가 Blender를 다루는 방법은 세 가지다. 보면서 고칠 땐 MCP, 많이·빨리·똑같이 반복할 땐 스크립트, 버튼으로만 되는 기능은 화면 조작. 어느 방법으로 하든 결과는 전부 파일로 남는다.
1. 세 가지 방법
┌─ ① MCP ─────────────────▶ 열려 있는 Blender 장면을 실시간으로 조작
나 ── Codex ────┼─ ② 백그라운드 스크립트 ──▶ .py 작성 → 화면 없이 Blender 실행 → .blend · .png · .glb
└─ ③ 화면 조작 ────────────▶ 보이는 Blender 창을 직접 클릭·입력
| ① MCP | ② 백그라운드 스크립트 | ③ 화면 조작 | |
|---|---|---|---|
| 속도 | 한 번에 한 동작 | 가장 빠름 — 부품 3개 모델 + 렌더 + 저장 + GLB까지 1.5초 (검증) | 가장 느림 |
| 눈으로 보임 | ✅ 열린 창에서 바로 | ❌ 끝난 뒤 파일로 확인 | ✅ |
| 똑같이 다시 만들기 | 어려움 (과정이 대화에 흩어짐) | 스크립트만 다시 실행하면 똑같이 | 어려움 |
| 여러 개 한 번에 | 느림 | 변형 20개도 반복문 하나 | 사실상 불가 |
| 망했을 때 | ⌘Z | 스크립트 고쳐서 다시 실행 (원본은 멀쩡) | 되돌리기 어려움 |
| Codex 샌드박스 | 영향 없음 — 읽기 전용 모드에서도 됨 (검증) | Blender 실행은 샌드박스 밖에서 — 안에서는 GPU 초기화 중 종료 (검증) | 별도 권한 필요 |
| 딱 맞는 일 | 형태 잡기, 보고 고치기, 수업 실습 | 일괄 생성·렌더·내보내기, 턴테이블 | API 없는 애드온 버튼, 메뉴 위치 보여주기 |
| 수업에서 | 01~04주차 기본 | 03주차 "잘 된 코드 저장", 05주차 렌더 | 멘토 시연 (선택) |
2. ① MCP 깊게
연결 구조
Codex ──▶ uvx blender-mcp (MCP 서버, Codex가 켬) ──▶ 포트 9876 ──▶ Blender 안 애드온 ──▶ 장면
- 애드온이 켜져 있으면 Blender를 열 때 9876 포트 서버가 자동으로 켜진다. 사이드바(N) BlenderMCP 탭에
Running on port 9876. - MCP 서버는 Codex 샌드박스 밖에서 돈다. 그래서 Codex를 읽기 전용(
-s read-only)으로 켜도 장면을 읽을 수 있었다.
도구 28개를 여섯 묶음으로
실제 연결해서 받은 도구 목록 기준이다.
| 묶음 | 도구 | 하는 일 | 주의 |
|---|---|---|---|
| 읽기 | get_scene_info get_object_info |
오브젝트 목록·위치·크기·재질 | 안전 |
| 눈 | get_viewport_screenshot |
뷰포트를 캡처해서 AI가 직접 봄 | 안전 |
| 손 | execute_blender_code |
Blender 안에서 파이썬 실행. 만들고 고치는 건 전부 이걸로 한다 | ⚠️ 뭐든 할 수 있음 |
| 에셋 | Poly Haven: get_polyhaven_categories search_polyhaven_assets download_polyhaven_asset set_texture · Sketchfab: search_sketchfab_models get_sketchfab_model_preview download_sketchfab_model · Poly Pizza: search_polypizza_models download_polypizza_model |
모델·HDRI·텍스처 검색하고 받기 | 인터넷 필요 |
| AI 생성 | Hyper3D Rodin: generate_hyper3d_model_via_text generate_hyper3d_model_via_images poll_rodin_job_status import_generated_asset · Hunyuan3D: generate_hunyuan3d_model poll_hunyuan_job_status import_generated_asset_hunyuan |
Blender 안에서 바로 3D 생성 | 키·크레딧 |
| 상태 | get_addon_status get_polyhaven_status get_hyper3d_status get_sketchfab_status get_polypizza_status get_hunyuan3d_status disable_telemetry record_trajectory_feedback |
연결·기능 켜짐 확인, 사용 통계 끄기 | 안전 |
에셋·AI 생성은 기본으로 꺼져 있다. 처음 연결했을 때 get_polyhaven_status 가 "disabled"라고 답했다. BlenderMCP 탭에서 켠다.
| 켜는 것 | 체크박스 | 추가로 필요한 것 |
|---|---|---|
| Poly Haven | Use assets from Poly Haven |
없음 (무료 CC0) |
| Hyper3D Rodin | Use Hyper3D Rodin 3D model generation |
API 키 또는 Set Free Trial API Key 버튼 |
| Sketchfab | Use assets from Sketchfab |
Sketchfab API 키 |
| Hunyuan3D | Use Tencent Hunyuan 3D model generation |
Tencent SecretId · SecretKey |
blender-mcp 1.30.0 에서는
get_scene_info가user_prompt값을 요구한다. Codex는 알아서 채우니까, 직접 MCP를 부를 때만 신경 쓰면 된다.
승인은 이렇게 동작한다
| 상황 | 동작 |
|---|---|
| 대화형 Codex (앱·CLI) | 도구를 쓰기 전에 허용할지 물어봄 → 허용 |
자동 실행 codex exec |
물어볼 수가 없어서 자동 취소 → user cancelled MCP tool call (검증) |
읽기 전용 도구만 안 묻게 하기 — ~/.codex/config.toml 에 추가:
[mcp_servers.blender.tools.get_scene_info] approval_mode = "approve" [mcp_servers.blender.tools.get_object_info] approval_mode = "approve" [mcp_servers.blender.tools.get_viewport_screenshot] approval_mode = "approve"
한 번만 시험할 땐 설정 파일을 안 고치고 명령에 붙여도 된다 (이 방법으로 codex exec 가 장면 읽기에 성공함):
codex exec -c 'mcp_servers.blender.tools.get_scene_info.approval_mode="approve"' "블렌더 장면에 뭐가 있어?"
⚠️
execute_blender_code는 자동 승인하지 않는다. 파이썬이라 파일 삭제, 인터넷 요청까지 할 수 있다. 매번 코드를 보고 허용한다.
MCP로 잘 시키는 대화 패턴
① 읽기 → 계획 → 실행 → 눈으로 확인
② 코드 먼저 보기 — execute_blender_code 승인 전에
③ 캡처로 스스로 검사
④ 잘 된 걸 스크립트로 저장 — ②로 넘어가는 다리
⑤ 긴 작업은 쪼개기 — 한 번에 1~2분 넘게 걸리는 요청은 중간에 끊긴다.
3. ② 백그라운드 스크립트 깊게
실제로 돌려본 것 (2026-09-14)
Codex(workspace-write 모드)에게 이렇게 시켰다:
| 단계 | 결과 |
|---|---|
| Codex가 스크립트 작성 | ✅ 132줄. 치수 계산 주석, 부품 이름, 재질 함수, 카메라 조준까지 |
| Codex 샌드박스 안에서 Blender 실행 | ❌ 파이썬 실행 전 GPU(Metal) 초기화 단계에서 종료 |
| 같은 스크립트를 샌드박스 밖 터미널에서 실행 | ✅ 1.5초 만에 lamp.blend · lamp.png · lamp.glb 생성 |

실행 명령
Mac
/Applications/Blender.app/Contents/MacOS/Blender -b --factory-startup -P scripts/make_lamp.py
Windows (설치 위치에 따라 경로가 다름)
& "C:\Program Files\Blender Foundation\Blender 5.0\blender.exe" -b --factory-startup -P scripts\make_lamp.py
| 옵션 | 뜻 |
|---|---|
-b |
화면 없이 백그라운드로 |
--factory-startup |
내 설정·애드온을 무시하고 깨끗한 상태로 → 누가 돌려도 같은 결과 |
-P 파일.py |
파이썬 스크립트 실행 |
-- 값… |
맨 뒤에 붙이면 스크립트가 sys.argv 로 받음 (높이·색 바꿔 넣기) |
파일.blend -a |
그 파일의 애니메이션 전체 렌더 (턴테이블) |
샌드박스 문제, 이렇게 푼다
Codex 기본 샌드박스는 파일 쓰기는 되지만 Blender를 켜면 GPU 초기화에서 꺼진다.
| 방법 | 어떻게 | 추천 |
|---|---|---|
| A. 작성은 Codex, 실행은 나 | "스크립트만 만들고 실행 명령을 알려줘" → 내가 터미널에서 실행 | ⭐ 수업 추천. 가장 안전하고 무슨 일이 일어나는지 보임 |
| B. 그 명령만 샌드박스 밖 허용 | 대화형 Codex가 샌드박스 밖 실행을 요청하면 그 명령만 허용 | 편함. 명령을 읽고 허용할 것 |
| C. 샌드박스 끄기 | 전체 권한 모드 | 수업용 노트북에선 쓰지 않기 |
Codex가 만든 스크립트에서 배울 점
좋은 Blender 스크립트의 조건이 다 들어 있었다.
- 경로를 스크립트 위치 기준으로 — 어디서 실행해도 같은 폴더에 저장
- 시작할 때 장면 비우기 — 다시 돌려도 중복 안 생김
- 치수를 미터로 계산하고 주석 —
0.03 + 0.29 + 0.13 = 0.45 m - 부품 이름 + 빈 오브젝트(Empty)로 묶기 —
Lamp_45cm_Assembly아래Base_Disc,Stand_Pole,Cone_Shade - 재질을 함수로 — 색·금속감·거칠기를 숫자로
- 카메라가 대상을 바라보게 계산 — 손으로 각도 안 맞춤
- 저장 → 렌더 → 내보내기 순서, GLB엔 모델만 골라서 — 카메라·조명이 딸려 가지 않게
- 마지막에 결과 경로 출력 — 제대로 됐는지 바로 확인
뼈대만 추리면:
from pathlib import Path
import bpy
PROJECT = Path(__file__).resolve().parent.parent
BLEND, RENDER, GLB = PROJECT / "blend/lamp.blend", PROJECT / "renders/lamp.png", PROJECT / "exports/lamp.glb"
for p in (BLEND, RENDER, GLB):
p.parent.mkdir(parents=True, exist_ok=True)
bpy.ops.object.select_all(action="SELECT")
bpy.ops.object.delete() # 1. 장면 비우기
# 2. 부품 (단위 m): 받침 0.03 + 기둥 0.29 + 갓 0.13 = 0.45
bpy.ops.mesh.primitive_cylinder_add(radius=0.11, depth=0.03, location=(0, 0, 0.015))
base = bpy.context.object; base.name = "Base_Disc"
# … 기둥, 갓, 재질, 카메라, 조명 …
scene = bpy.context.scene # 3. 렌더 설정
scene.render.engine = "BLENDER_WORKBENCH"
scene.render.resolution_x = scene.render.resolution_y = 512
scene.render.filepath = str(RENDER)
bpy.ops.wm.save_as_mainfile(filepath=str(BLEND)) # 4. 저장 → 렌더 → 내보내기
bpy.ops.render.render(write_still=True)
bpy.ops.export_scene.gltf(filepath=str(GLB), export_format="GLB", use_selection=True)
print("Saved:", BLEND, RENDER, GLB)스크립트라서 가능한 것
| 하고 싶은 것 | Codex한테 이렇게 |
|---|---|
| 크기·색 바꿔서 여러 버전 | 스크립트 맨 위에 HEIGHT, SHADE_COLOR 변수를 만들고 명령줄에서 값을 받게 바꿔줘. 높이 30·45·60cm 세 버전을 renders/lamp_30.png 식으로 뽑는 run_variants.sh 도 만들어줘. 실행은 내가 할게. |
| 변형 비교 시트 | renders/ 의 PNG를 한 장에 격자로 모아 compare.png 만드는 스크립트 만들어줘. |
| 턴테이블 | blend/lamp.blend 에 5초 선형 회전 카메라를 넣고 MP4로 뽑는 스크립트 만들어줘. 렌더는 해상도 50%. |
| 폴더 통째 정리 | exports/ 안의 GLB를 전부 불러와서 폴리곤을 50%로 줄이고 exports/low/ 에 다시 저장하는 스크립트 만들어줘. |
4. ③ 화면 조작
Codex에게 물어보면 스스로 제안하는 방법이다. 컴퓨터 사용 기능으로 화면에 보이는 Blender 창을 직접 클릭하고 입력한다.
이번에는 검증하지 않았다. 실제로 마우스를 움직이는 방식이라 멘토 화면에서 따로 시험해볼 것.
| 좋은 곳 | 나쁜 곳 |
|---|---|
| API가 없는 애드온 버튼 누르기 | 느림 |
| "이 메뉴가 어디 있는지" 화면으로 보여주기 | 창 크기·위치가 바뀌면 실패 |
| 사람이 따라 하는 데모 | 같은 결과를 다시 만들기 어려움 |
쓸 때 규칙
- Blender 창 하나만 띄우고 다른 앱은 닫기
- 진행 중에 마우스·키보드 건드리지 않기
- 시작 전에 저장
5. 섞어 쓰는 흐름 (추천)
① MCP로 형태 잡기 ─────── 보면서 대화로
│ "잘 됐으면 처음부터 다시 만드는 스크립트로 저장해줘"
▼
② 스크립트로 변형·렌더·내보내기 ─── 실행은 내가 터미널에서
│ renders/ 보고 고르기
▼
① MCP로 고른 것 열어서 세부 수정
결과물은 전부 파일로 남는다
lamp-project/ ├── AGENTS.md ← Codex한테 주는 이 프로젝트 규칙 ├── scripts/ ← .py 레시피 — 이것만 있으면 언제든 다시 만든다 ├── blend/ ← .blend 작업 파일 ├── renders/ ← .png · .mp4 └── exports/ ← .glb · .stl
스크립트는 레시피, .blend는 완성된 요리, 렌더는 사진. 레시피를 남겨두면 사진이 날아가도 다시 만든다.
6. AGENTS.md — Codex한테 Blender 규칙을 한 번에 주기
Codex는 작업 폴더의 AGENTS.md 를 읽고 시작한다. 매번 "단위는 미터, 이름 붙여, 저장은 blend/에"를 말할 필요가 없어진다.
# Blender 작업 규칙 ## 환경 - Blender: /Applications/Blender.app/Contents/MacOS/Blender (5.0) - 열린 Blender 연결: MCP 서버 이름 blender (포트 9876) ## 작업 방식 - 보면서 고치는 작업은 MCP로, 여러 개·렌더·내보내기는 scripts/ 의 파이썬 스크립트로 - Blender 실행 명령은 내가 직접 실행한다. 스크립트를 만들면 실행 명령만 알려줘 - execute_blender_code 를 쓰기 전에 코드를 먼저 보여줘 ## 3D 규칙 - 단위 미터, Z가 위, 바닥은 Z=0 - 오브젝트 이름은 영어로: 물건_부품 (Lamp_Base) - 대칭은 Mirror, 반복은 Array, 모서리는 Bevel 0.5cm - 기존 모델을 고칠 땐 원본을 숨기고 복사본(_edit)에서 ## 저장 - 작업 파일 blend/, 렌더 renders/, 내보내기 exports/ — 경로는 스크립트 위치 기준 - 파일 이름 끝에 버전: _v01, _v02 - 테스트 렌더는 해상도 50%, Workbench 또는 EEVEE
7. Codex 권한 모드와 Blender
| 모드 | 파일 쓰기 | Blender MCP | Blender 직접 실행 |
|---|---|---|---|
읽기 전용 (-s read-only) |
❌ | ✅ 장면 읽기 됨 (검증) | ❌ |
작업 폴더 쓰기 (-s workspace-write) |
작업 폴더만 | ✅ | ❌ GPU 초기화에서 종료 (검증) |
| 전체 권한 | 어디든 | ✅ | 샌드박스가 없어서 될 것으로 보임 (미검증) · ⚠️ 수업용 비추천 |
8. 막힐 때
| 증상 | 원인 | 해결 |
|---|---|---|
user cancelled MCP tool call |
자동 실행(codex exec)은 승인을 못 받음 |
대화형 Codex에서 하거나, 읽기 도구만 approval_mode = "approve" |
| Codex가 Blender를 켜자마자 꺼짐 (Metal·GPU 오류) | 샌드박스가 GPU 접근을 막음 | 스크립트만 받고 실행은 터미널에서 직접 |
| 연결 거부, 9876 포트 | Blender가 안 켜졌거나 애드온이 꺼짐 | Blender 켜기 → BlenderMCP 탭 Connect to MCP server |
| 도구가 "disabled"라고 답함 | 에셋·AI 생성 체크박스가 기본으로 꺼져 있음 | BlenderMCP 탭에서 체크 |
| MCP가 자꾸 끊김 | 다른 AI 앱에도 blender MCP가 연결돼 있음 | 한 번에 한 프로그램만 연결 |
| 스크립트는 돌았는데 파일이 없음 | 경로가 "실행한 위치" 기준 | Path(__file__) 로 스크립트 위치 기준 |
| GLB에 카메라·조명까지 들어감 | 전부 선택된 채 내보냄 | 모델만 선택하고 use_selection=True |
| 백그라운드 렌더가 새까맣게 나옴 | 장면에 카메라(scene.camera)나 조명이 없음 |
스크립트에서 카메라 지정, 조명 추가 |
| 내 컴퓨터에서만 결과가 다름 | 개인 설정·애드온이 섞임 | --factory-startup |
| 경로 오류 | 한글·띄어쓰기 경로 | 프로젝트 폴더·파일 이름은 영어로 |
9. 수업 주차별로 어디에 쓰나
| 주차 | 방법 | 이유 |
|---|---|---|
| 01 말로 움직이기 | ① MCP | 결과가 바로 보여서 대화 흐름을 익히기 좋음 |
| 02 생성하기 | ① MCP + 웹 생성기 | 조립은 MCP, 유기적 형태는 Tripo |
| 03 프롬프팅 | ① MCP → 마지막 5분에 "잘 된 코드 저장" 시연 | ②로 넘어가는 다리 |
| 04 고치기 | ① MCP, 여러 모델 한 번에 정리는 ② 시연 | 반복 작업은 스크립트가 압도적으로 빠름 |
| 05 렌더 | ① MCP로 연출 → 턴테이블은 ② | 렌더하는 동안 Blender 화면이 안 멈춤 |
| 멘토 시연 | ③ 화면 조작 (선택) | 메뉴 위치를 보여줄 때 |
출처
- blender-mcp (설치·도구·주의사항): https://github.com/ahujasid/blender-mcp
- Codex MCP 설정 (config.toml,
codex mcp add): https://learn.chatgpt.com/docs/extend/mcp?surface=cli - AGENTS.md 형식: https://agents.md
- Blender 명령줄 옵션: https://docs.blender.org/manual/en/latest/advanced/command_line/arguments.html
- 검증: 2026-09-14 멘토 맥 — MCP 도구 목록·장면 읽기,
codex exec승인 동작, 샌드박스 안/밖 스크립트 실행 비교