dev.to

I Made Spider-Man Swing Without Animating a Single Frame

프레임을 직접 그리지 않고 스파이더맨을 움직였습니다

Blender를 처음 써 본 글쓴이가 Blender-MCP, Mixamo, 모션 캡처 데이터를 조합해 스파이더맨 애니메이션을 만들었습니다. 캐릭터 리깅과 역운동학부터 애니메이션 클립 연결, 루트 모션, 스켈레톤 리타기팅까지 작업 과정에서 만난 3D 그래픽 개념을 설명합니다.

AI 요약

글쓴이는 프레임을 손으로 하나도 그리지 않고 스파이더맨이 거미줄을 쏘고 착지하는 영상을 만들었습니다. Blender를 처음 접한 상태에서 Blender-MCP로 LLM을 연결하고, Mixamo의 자동 리깅과 모션 캡처 클립을 활용했습니다. 작업을 진행하며 3D 캐릭터 애니메이션의 구성 요소와 각 단계에서 생긴 문제를 설명합니다.

Blender를 프롬프트로 조작하기

Blender-MCP는 Blender 내부 애드온과 외부 MCP 서버로 구성됩니다. 애드온은 소켓 서버를 열고, MCP 서버는 Model Context Protocol로 LLM과 통신한 뒤 JSON 명령을 Blender 쪽으로 전달합니다. 가장 강력한 도구인 execute_blender_code는 Blender의 Python API인 bpy에서 코드를 실행합니다. LLM은 장면을 바꾼 뒤 뷰포트 스크린샷을 확인하고 다음 수정 사항을 정합니다. 글쓴이는 셸을 통한 로컬 자동화와 마찬가지로 임의 코드 실행 권한을 주의해서 다뤄야 한다고 덧붙입니다.

메시를 움직이는 리그와 역운동학

캐릭터는 정점으로 이뤄진 메시만으로는 움직이지 않습니다. 뼈대인 아마추어(Armature), 각 정점에 뼈의 영향력을 지정하는 스킨 웨이트(Skin Weights), 모든 애니메이션의 기준이 되는 휴식 포즈(Rest Pose)가 필요합니다. 정점은 여러 뼈의 영향을 가중치로 받아 움직이며, 이를 선형 블렌드 스키닝(Linear Blend Skinning)이라고 합니다. 예를 들어 팔꿈치 정점에 위팔과 아래팔 뼈의 영향력을 각각 절반씩 주면 관절을 부드럽게 구부릴 수 있습니다.

다운로드한 모델에는 뼈대는 있었지만 애니메이션을 쉽게 조작할 컨트롤 리그가 없었습니다. 관절 각도를 직접 정하는 전방 운동학(FK)만으로는 손이나 발을 원하는 위치에 놓기 어렵습니다. 역운동학(IK)은 손이나 발의 목표 위치를 지정하면 솔버가 관절 각도를 역산합니다. 발을 IK 목표에 고정한 채 엉덩이를 움직이면 무릎이 굽습니다. Blender의 IK 제약 조건을 이용하면 이 동작을 구현할 수 있습니다.

글쓴이는 직접 컨트롤 리그를 만들지 않고 Adobe의 무료 자동 리거 Mixamo를 선택했습니다. T자 포즈의 FBX 모델을 올리고 턱, 손목, 팔꿈치, 무릎, 사타구니 위치를 표시하면 Mixamo가 뼈대와 스킨 웨이트를 만듭니다. 손목 표시를 팔뚝 쪽에 두면 손이 잘못된 위치에서 꺾이므로 랜드마크 배치가 중요합니다. 손가락 뼈를 포함하는 Standard Skeleton (65)을 선택해 두 손으로 물체를 당기는 동작도 표현했습니다.

애니메이션 클립 연결과 루트 모션

Mixamo 애니메이션은 뼈 이름을 기준으로 한 회전 키프레임 데이터입니다. 첫 클립만 메시를 포함해 받고, 나머지는 뼈대와 동작만 받으면 같은 65개 뼈를 쓰는 캐릭터에 재사용할 수 있습니다. 글쓴이는 클립 78개를 내려받았고, 파일명만으로 내용이 정확한지 알 수 없어 FBX 내부를 직접 확인했습니다.

Blender의 비선형 애니메이션 편집기(NLA)는 각 동작을 액션(Action) 스트립으로 배치하고, 겹치는 구간을 블렌딩합니다. 글쓴이는 동작 이름과 길이, 속도, 블렌드 프레임을 적은 목록으로 시퀀스를 구성했습니다. 예를 들어 6프레임 블렌드는 다음 동작으로 부드럽게 넘어가게 합니다. 각 클립은 서로 다른 원점에서 시작하기 때문에 그대로 이어 붙이면 캐릭터가 순간이동할 수 있습니다. 시퀀서는 앞 클립에서 엉덩이가 끝난 위치를 읽고 다음 클립을 그 위치에 맞춰 오프셋합니다. 이렇게 루트 모션을 이어 붙이면 동작을 바꿀 때 거미줄과 소품, 카메라의 타이밍도 함께 조정됩니다.

렌더링과 모션 캡처 리타기팅

첫 16초 영상은 GTX 1650에서 720p로 렌더링하는 데 약 8분이 걸렸습니다. 반복 수정에 부담이 있어 미리보기는 360p로 낮췄고, 최종 렌더에만 720p를 사용했습니다. 캐릭터 수트가 검은 덩어리처럼 보이는 문제는 툰 셰이더를 물리 기반 셰이딩으로 바꾸고, 캐릭터 조명과 빨강·파랑 림 라이트를 더해 해결했습니다.

Mixamo에서 매번 클립을 내려받는 대신 CMU Graphics Lab Motion Capture Database의 약 2,500개 무료 동작과 GitHub의 BVH 미러도 살펴봤습니다. CMU와 Mixamo는 서로 다른 뼈대와 휴식 포즈를 쓰므로 회전값을 그대로 복사할 수 없습니다. 리타기팅(Retargeting)은 원본 뼈의 회전을 공통 좌표계로 옮긴 뒤 대상 뼈의 휴식 포즈 기준으로 변환합니다. 보폭은 다리 길이에 맞춰 조정합니다. 첫 시도에서는 BVH의 엉덩이 높이가 0이라 스케일 계산이 0으로 나뉘며 캐릭터가 화면 밖으로 날아갔습니다. 클립에서 가장 낮은 발 위치로 바닥을 추정해 문제를 고쳤습니다.

글쓴이는 작업에서 얻은 교훈으로 메시와 뼈대의 관계, 휴식 포즈 기준 애니메이션, IK를 제약 조건 솔버로 보는 관점, 뼈 이름에 연결된 클립 데이터의 재사용, NLA와 루트 모션 연결을 꼽습니다. 셰이더 노드 그래프와 패스 트레이싱, 물리 시뮬레이션도 각각 데이터 흐름과 수치 계산으로 이해할 수 있다고 설명합니다.

원문: dev.to / 번역·요약: Trawling