스킨 편집기 조작 설명서
스킨 팩토리의 스킨 편집기를 ChatGPT·Codex·Claude 같은 AI 비서가 브라우저로 조작할 때 알아야 할 것: 화면, 좌표계, 보기, 사이트 도구(WebMCP) 목록, 텍스처 규칙, 저장 규칙. 사람이 읽어도 같은 내용입니다.
같은 내용을 텍스트로: /llms.txt. 편집기 안에서는 사이트 도구 editor_manual이 같은 글을 돌려줍니다. AI를 연결하는 방법은 AI로 편집기 조작하기에, 긴 머리를 투명 종이카드로 만드는 방법은 긴 머리 종이 헤어카드 가이드에 있습니다.
1. 편집기가 하는 일
- 게임의 기본 파츠로 만든 캐릭터(작업)의 머리(head)·몸(body) 점을 옮기고, 세 부위(head·body·face)의 텍스처를 칠하거나 그림으로 바꿉니다. 얼굴 판(face)은 게임 공용 모양이라 옮길 수 없고 색과 그림만 바꿉니다.
- 작업은
/studio/editor/<id>에서 열립니다.?mode=ai를 붙이면 AI 편집 배치(원본·현재 3면 띠 + 상태 텍스트)가 되고, 두 배치는 같은 상태를 보여 줍니다. - 편집은 로그인한 계정의 작업만 열립니다. AI가 쓰는 브라우저에 그 사람의 계정으로 로그인돼 있어야 하고, 주소만으로는 남의 작업이 열리지 않습니다.
- 조작 경로는 둘입니다. ① 화면의 패널·버튼(모두 이름이 붙어 있습니다) ② WebMCP 사이트 도구
editor_*(브라우저가 지원하면 페이지가 자동 등록). 둘 다 같은 엔진을 움직이므로 섞어 써도 됩니다. - 캐릭터가 어떤 파츠로 만들어졌는지는 나중에도 바꿀 수 있습니다(「파츠」 패널 ·
editor_parts·editor_change_parts). 바꾸는 파츠는 원래 모습으로 들어오므로 그 파츠에 한 편집은 사라지고, 나머지 파츠의 편집은 남습니다. - 게임이 받지 않는 파츠가 몇 가지 있어 목록에서 빼 두었습니다. 그 파츠로 만들어진 예전 캐릭터는 그대로 열리지만, 「파츠」 패널과
editor_parts가 그 사실을 알려 주고, 바꾸지 않으면 게임에서 열리지 않습니다. - 결과 파일은 사람이 [스킨 파일 받기]로 받습니다(게시판에 올릴지는 그때 고릅니다). AI는 저장까지만 합니다.
2. 좌표계와 이름
- 단위는 모델 좌표입니다. 캐릭터 키가 약 0.58이고, 모든 좌표는 |값| ≤ 4 안에 있어야 합니다(저장할 때 검사).
- 축: 위가 +y, 얼굴이 향하는 쪽이 −z, 정면에서 봤을 때 화면 오른쪽이 +x (캐릭터 자신의 왼손 쪽).
- 점은 「용접점」입니다: 같은 자리에 겹친 정점들을 한 점으로 묶은 것. id는 0부터 N−1이고
editor_status·editor_points·editor_select·editor_set_points가 모두 이 id를 씁니다. 분리(editor_separate)로 나뉜 뒤에는 한 자리에 id가 둘 이상 있을 수 있습니다. - 이름 붙은 대상:
head:piece:N(이어진 머리 조각, N은 큰 조각부터 0),body:slot:<이름>(몸 부위, 예body:slot:body_part_3),face(얼굴 판 전체). 목록은editor_targets또는 「선택」 패널에 있습니다. - 몸 부위 가운데
body_part_0·body_part_7과left_hand_1·right_hand_1·left_hand_2·right_hand_2는 손 모양(handPose 0·1·2)에 따라 하나씩만 보입니다.
3. 보기(카메라)
| 프리셋 | 이름 | 단축키 | yaw | pitch | 카메라 |
|---|---|---|---|---|---|
front | 정면 | 1 | 0° | 0° | 얼굴 쪽(−z)에서 |
side | 측면 | 2 | 90° | 0° | 정면 기준 화면 오른쪽(+x)에서 |
back | 후면 | 3 | 180° | 0° | 뒤(+z)에서 |
quarter | 대각 | 4 | 45° | 0° | 앞 오른쪽 45°에서 |
otherSide | 반대 측면 | 5 | -90° | 0° | 정면 기준 화면 왼쪽(−x)에서 |
backQuarter | 뒤 대각 | 6 | 135° | 0° | 뒤 오른쪽 45°에서 |
top | 위 | 7 | 0° | -90° | 머리 위에서. 화면 아래쪽이 얼굴 쪽 |
bottom | 아래 | 8 | 0° | 90° | 발 아래에서 |
- yaw는 캐릭터를 세로축으로 돌린 각(도)입니다. 양수면 카메라가 정면에서 화면 오른쪽으로 돕니다. pitch는 음수면 위에서 내려다보고 양수면 아래에서 올려다봅니다(±90°까지).
- zoom은 확대 배율입니다: 1 = 화면에 맞춤, 2 = 두 배 크게, 0.25~4. pan은 화면 평면에서 모델을 미는 양(모델 단위, 오른쪽·위가 양수)입니다.
editor_view로 프리셋·각도·확대·이동·표정(faceFrame 0~6: 기본·공격·피격 1·2·3·다운·승리)·손 모양(handPose 0~2)·원본 보기(showOriginal)를 바꿉니다. 화면에서는 「보기」 패널의 버튼과 숫자 필드, 마우스(오른쪽 버튼 드래그 회전, 휠 확대, Shift 드래그 이동)입니다.- 「보기 → 얼굴 표시」 또는
editor_face_visibility {visible: true|false}로 얼굴을 켜고 끕니다. 동물형 헤어는 기본 꺼짐이며, 선택은 저장·버전 복원·다운로드에 반영됩니다. 꺼도 얼굴 그림은 지워지지 않습니다. 켜도 헤어의 불투명한 면에 가려진 부분은 그대로 가려집니다. 일부 동물형 헤어는 얼굴을 켜서 내보낼 때 선택한 게임 서버에서만 제대로 보입니다. - 자세(pose): 기본은
rest, 곧 파일이 담고 있는 T포즈이고 편집은 여기에서만 합니다.idle(대기)·walk(걷기)·run(달리기)은 게임이 그 몸통에 실제로 쓰는 동작으로 캐릭터를 움직여 보는 **보기 전용** 자세입니다: 옷자락이 팔에 박히는지, 머리카락이 달릴 때 어떻게 보이는지 확인할 때 씁니다. - 동작은 몸통이 정합니다. 대부분은 사람의 걸음이지만 동물 룩(고릴라·개·돼지·쥐·닭)은 게임에서 전용 동작을 써서 네발로 걷거나 날개를 펴고 걷습니다. 그 몸통을 골랐으면 여기에서도 그 동작이 나오고,
editor_status의view.poseMotion이 어느 룩의 동작인지 알려 줍니다. editor_view {pose}로 고르면 게임 속도로 재생됩니다.poseFrame을 주면 그 프레임에서 멈추고,posePlay로 다시 재생·정지합니다. 프레임 번호는 게임 모션 파일의 번호라 몸통마다 다릅니다(사람은 대기 0~2·걷기 5~9·달리기 10~14). 지금 자세의 범위는editor_status의view.poseRange에 있습니다. 움직이는 자세에서는 화면을 끌어도 회전만 되고, 도구를 고르면 T포즈로 돌아옵니다. 좌표를 다루는 도구(editor_set_points·editor_transform)는 자세와 상관없이 언제나 T포즈 좌표로 움직입니다.- AI 편집 배치의 3면 띠는 원본(열었을 때)과 현재를 나란히 그립니다. 세트는 둘입니다:
basic= 정면·측면·후면,angles= 대각·반대 측면·위 (editor_view {strip}또는 띠 위의 버튼). - 어느 각도든 그림으로 보려면
editor_capture입니다. 결과는 「보기」 패널의 「마지막 캡처」에 표시되고,returnData: true면 PNG data URL도 돌려줍니다.parts로 부위만 골라 그릴 수 있습니다.
4. 편집 흐름
editor_status로 저장 상태·선택·보기를,editor_targets로 조각·부위 목록을 읽습니다. 무엇을 고칠지는 사람이 적은 요청이 정합니다.editor_select로 대상을 고릅니다:"all"·"none"·이름·좌표 범위·점 id. mode는 replace·add·remove.- 옮깁니다:
editor_transform(이동·회전·크기, pivot 기본은 선택 중심, falloff로 주변 점을 부드럽게) 또는editor_set_points(점마다 절대 좌표). 얼굴 판은 옮길 수 없습니다. - 붙어 있던 면이 따라오면
editor_separate: 떼어낼 부분의 점을 모두 선택한 뒤 부르면 그 부분만 움직입니다.editor_join은 나뉜 점을 선택한 점 자리로 다시 붙입니다. - 색은
editor_recolor(선택한 부위의 텍스처만), 그림 전체는editor_texture(data:image URL 또는 https 주소), 지금 그림을 읽으려면editor_texture_read. - 확인합니다: 3면 띠,
editor_capture,editor_status의 selection(범위·중심). 잘못됐으면editor_undo/editor_redo. editor_save {note}로 저장합니다. note는 이 버전의 한 줄 설명(약 150자)입니다. 게시는 하지 않습니다.
5. 사이트 도구(WebMCP) 목록
지원되는 브라우저에서 편집기 페이지가 등록합니다. 입력은 JSON 객체이고 결과도 JSON입니다. 모든 도구는 화면의 버튼과 같은 엔진 메서드를 부르므로 되돌리기·저장에 그대로 잡힙니다.
| 도구 | 입력 | 결과·비고 |
|---|---|---|
editor_manual | — | 이 설명서 텍스트 |
editor_status | — | work(id·name·serverRevision·unsaved·saveState), view(yaw·pitch·zoom·pan·preset·faceFrame·handPose·showOriginal·strip·pose·poseMotion·poseFrame·poseRange·posePlaying), tool, selection(part·points·ids 최대 200개·min·max·center·size), separatedPlaces, textures(크기·fileTier), history, lastAction, capture |
editor_targets | — | head: [{id: "head:piece:N", points, center, size, placement}], body: [{id: "body:slot:이름", label, hidden, center, size}], face |
editor_select | target: "all"·"none"·"head:piece:N"·"body:slot:이름", 또는 part + range {x: [min, max], y, z}(null = 제한 없음), 또는 part + points [id…]; mode | 선택 요약. "all" 에는 part가 필요합니다 |
editor_points | part; 그리고 ids / target / range / selection: true 가운데 하나(없으면 전체); original: true 면 열었을 때 좌표 | {part, count, points: [[id, x, y, z], …]} |
editor_set_points | part(head·body), points: [[id, x, y, z], …] | {moved}. 한 번의 되돌리기 단계. |좌표| ≤ 4 |
editor_transform | translate [dx, dy, dz], rotate [도x, 도y, 도z], scale [sx, sy, sz], pivot [x, y, z], falloff | {moved}. 선택이 있어야 합니다 |
editor_separate | — | {separatedPoints, selection} |
editor_join | — | {joinedPlaces} |
editor_recolor | hue(도), saturation·lightness(배율) 또는 fill [r, g, b] + keepShading; allFrames(얼굴) | {changedTexels} |
editor_texture | part, url(data:image/… 또는 https://…) | {applied, textures} 또는 {error} |
editor_texture_read | part | {dataUrl, width, height, frames, frameSize} — 저장 전의 지금 그림 |
editor_view | preset, yaw, pitch, zoom, pan [x, y], faceFrame, handPose, showOriginal, strip, pose(rest·idle·walk·run), poseFrame, posePlay | view |
editor_capture | preset 또는 yaw·pitch(둘 다 없으면 지금 보기 그대로), zoom, pan, parts [head|body|face…], showOriginal, outline, selection, width, height(기본 480×540, 최대 1024), returnData | {label, width, height, dataUrl?}. 「보기」 패널의 「마지막 캡처」에도 표시 |
editor_undo / editor_redo | — | {undone} / {redone}, lastAction |
editor_save | note | {saved, revision, message} |
editor_parts | — 또는 find {kind: hair|body|eye|nose|mouth, query, length, limit} | {parts, names, unusable[], found?} — 지금의 파츠와 게임이 받지 않는 파츠, 그리고 목록 검색 |
editor_change_parts | headId, bodyId, face {eye, nose, mouth} 중 바꿀 것만 | {changed, parts, revision}. 바꾼 파츠의 편집은 사라지고 나머지는 남습니다. 저장하지 않은 변경은 먼저 저장되고, 바꾸기 전 상태는 버전으로 남습니다. 형태가 통째로 바뀌므로 선택과 되돌리기 기록은 초기화됩니다 |
6. 텍스처(그림) 규칙
- 텍스처는 셋입니다: 머리·몸은 정사각형 한 장, 얼굴은 표정 7칸(기본·공격·피격 1·2·3·다운·승리)을 가로로 이어 붙인 7:1 아틀라스. 표정 칸 안의 눈·코·입 위치는 게임이 정한 것이라 그 자리에 맞춰 그립니다.
- 허용 크기: 머리 64·128·256, 몸 128·256, 표정 한 칸 64·128·256 (최대 256). 그림을 넣으면 그림이 담기는 가장 작은 허용 크기가 되고, 그보다 크면 256으로 줄입니다. 크기가 파일 종류를 정합니다: 머리·얼굴이 128을 넘으면 .hhskin, 64를 넘거나 몸이 128을 넘으면 .hskin, 아니면 .skin.
- 비율: 머리·몸 1:1, 얼굴은 7:1(아틀라스 전체) 또는 1:1(보고 있는 표정 한 칸만 교체). 둘레에 단색 여백이 붙은 그림은 여백을 잘라 쓰고, 그 밖의 비율은 거절합니다(늘리면 UV가 어긋납니다).
- https 주소의 그림은 서버가 대신 받습니다(사설 주소·localhost 불가, 12MB, PNG/JPG/WEBP/GIF).
data:imageURL은 브라우저가 바로 읽습니다. - 그릴 때: 알파 10% 미만 텍셀은 그려지지 않지만 외곽선 껍질은 알파를 무시하므로, 투명한 부분이 넓은 삼각형은 뒤에서 보면 어두운 테두리로 남습니다. 불투명한 그림은 삼각형 안에 맞춥니다. UV에서 맞닿은 영역은 경계 1텍셀이 서로 번지니 한 텍셀 여유를 둡니다. 「아틀라스」 패널의 UV 선(주황 = 선택한 부위)으로 어느 텍셀이 어느 면인지 봅니다.
7. 저장·버전
- 저장은 바뀐 것이 있을 때만 서버에 갑니다. 서버 버전은 r1, r2…로 오르고 최근 20개를 보관합니다. 「저장한 버전」 패널의 [복원]은 새 버전으로 되돌립니다(되돌리기 단계가 아닙니다).
- 저장하지 않은 상태는 새로고침하면 사라집니다. 다른 탭에서 먼저 저장했으면 버전이 어긋나 저장이 거절되니, 새로고침한 뒤 다시 합니다.
editor_change_parts로 파츠를 바꾸면 그 자리에서 새 버전이 됩니다. 바꾸기 전 버전에는 그때의 파츠가 적혀 있어, [복원]하면 파츠도 함께 돌아옵니다.- 저장된 상태는
GET /api/editor?model=<id>(JSON: head·body·face 의 positions·unique·uvs·groups, versions)와GET /api/editor?texture=<part>&id=<id>(PNG,&which=original은 열었을 때 그림)로도 읽을 수 있습니다. 저장 전의 상태는editor_points·editor_texture_read로 읽습니다.
8. 화면으로만 조작할 때 (WebMCP 없이)
- 패널 id:
#editor-status(상태 텍스트, JSON 펼침),#editor-selection(목록·범위 선택),#editor-separate,#editor-transform(dx·dy·dz / rx·ry·rz / sx·sy·sz + [이동][회전][크기], 기준점),#editor-color,#editor-atlas(그림 붙여넣기·주소로 넣기·PNG 내려받기),#editor-tools,#editor-view(프리셋·각도·확대·캡처),#editor-parts(지금의 파츠 · [파츠 바꾸기]),#editor-versions,#editor-help. 마지막 동작은#editor-last-action, 저장 상태는#editor-save-state. - 단축키: 도구 Q 선택 · W 이동 · E 회전 · R 크기 · T 칠하기 · C 카메라. 보기 1~8. V 분리. Esc 선택 지우기. 화살표·PageUp/PageDown 은 선택을 0.005씩 옮깁니다(Shift 0.02). Ctrl+Z / Ctrl+Y 되돌리기·다시 실행, Ctrl+S 저장.
- 화면 선택: 클릭 = 가까운 점 하나, 드래그 = 상자 안의 보이는 점, 더블클릭 = 이어진 조각·부위, Shift 추가, Alt 제외. 「뒷면 점도 선택」을 켜면 상자가 가려진 점도 고릅니다.
- 그림 넣기: 파일 선택 창을 못 쓰면 「아틀라스」 패널의 주소 필드에
data:imageURL이나 https 주소를 넣고 Enter, 또는 페이지에 붙여넣기(Ctrl+V).
9. 주의
- 스킨 파일 받기와 게시판 게시·삭제는 사람이 합니다. 로그인 정보나 API 키는 어디에도 넣지 않습니다.
- 스킨 파일(.skin·.hskin·.hhskin)이나 OBJ는 편집기에 넣을 수 없습니다. 그림(PNG/JPG/WEBP)만 들어갑니다.
- 큰 편집은 저장 사이에 나눠 되돌릴 수 있게 하고, 저장할 때 note에 무엇을 했는지 적습니다.
- 긴 머리·앞머리·땋은 머리를 투명 종이카드로 만들 때는 먼저
/guide/hair-cards(긴 머리 종이 헤어카드 가이드)를 읽습니다. 파츠 고르기, 원본 그림 투영, 얼굴 외곽선 틈을 피하는 규칙이 있습니다.