본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.
본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.
이미지 로딩 중...
AI Generated
2025. 12. 29. · 3 Views
Blender 캐릭터 모델링 완벽 가이드
Blender를 활용한 캐릭터 모델링의 전체 워크플로우를 다룹니다. 메시 편집부터 UV 언래핑, 재질 적용, 최적화까지 실무에서 바로 활용할 수 있는 기법을 배웁니다.
목차
1. 캐릭터 모델링 기본 워크플로우
김모델 씨는 웹 개발자로 일하다가 3D 캐릭터가 필요한 프로젝트를 맡게 되었습니다. "Blender로 캐릭터를 만들어야 하는데, 어디서부터 시작해야 할까요?" 선배 개발자 박3D 씨가 친절하게 전체 워크플로우를 설명해줍니다.
캐릭터 모델링 워크플로우는 단순한 도형에서 시작해 복잡한 캐릭터를 완성하는 전체 과정입니다. 마치 조각가가 점토 덩어리로 작품을 만드는 것처럼, 기본 메시를 변형하고 세분화하며 디테일을 추가합니다.
이 워크플로우를 제대로 이해하면 체계적이고 효율적으로 캐릭터를 제작할 수 있습니다.
다음 코드를 살펴봅시다.
import bpy
# 기본 큐브 삭제하고 UV Sphere로 시작
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete()
# 캐릭터 머리 베이스 생성
bpy.ops.mesh.primitive_uv_sphere_add(radius=1, location=(0, 0, 2))
head = bpy.context.active_object
head.name = "Character_Head"
# 몸통 베이스 생성
bpy.ops.mesh.primitive_cube_add(size=2, location=(0, 0, 0))
body = bpy.context.active_object
body.name = "Character_Body"
body.scale = (0.8, 0.5, 1.2)
김모델 씨는 웹 개발 3년 차 개발자입니다. Three.js로 3D 웹사이트를 만들던 중, 직접 캐릭터를 모델링해야 하는 상황이 생겼습니다.
"Asset Store에서 사면 되지 않나요?"라고 물었지만, 프로젝트 예산이 빠듯했습니다. 박3D 씨가 옆자리에 앉아 Blender를 열었습니다.
"캐릭터 모델링, 어렵지 않아요. 워크플로우만 알면 누구나 할 수 있습니다." 그렇다면 캐릭터 모델링 워크플로우란 정확히 무엇일까요?
쉽게 비유하자면, 캐릭터 모델링 워크플로우는 마치 레고 블록으로 복잡한 건축물을 만드는 것과 같습니다. 처음에는 큰 블록으로 대략적인 형태를 만들고, 점점 작은 블록을 추가하며 디테일을 살립니다.
마지막으로 색을 칠하고 스티커를 붙여 완성하죠. Blender에서도 똑같은 방식으로 캐릭터를 만듭니다.
워크플로우가 없던 시절에는 어땠을까요? 초보 모델러들은 처음부터 완벽한 형태를 만들려고 했습니다.
머리카락 한 올 한 올을 그리듯 작업하다 보니 시간은 오래 걸리고, 결과물은 비효율적이었습니다. 더 큰 문제는 수정이 거의 불가능하다는 점이었습니다.
한 부분을 고치면 전체가 무너지는 일이 비일비재했습니다. 바로 이런 문제를 해결하기 위해 체계적인 워크플로우가 등장했습니다.
워크플로우를 사용하면 단계별로 작업을 나눌 수 있어 각 단계에서 집중할 부분이 명확해집니다. 또한 수정과 반복이 쉬워져 클라이언트 피드백을 빠르게 반영할 수 있습니다.
무엇보다 작업 시간이 크게 단축된다는 큰 이점이 있습니다. 위의 코드를 한 줄씩 살펴보겠습니다.
먼저 3-4번째 줄을 보면 Blender의 기본 큐브를 삭제하는 것을 알 수 있습니다. 새 프로젝트를 시작할 때 깨끗한 캔버스가 필요하기 때문입니다.
다음으로 7-9번째 줄에서는 UV Sphere로 캐릭터의 머리 베이스를 생성합니다. 구 형태는 머리를 만들기에 가장 적합한 시작점입니다.
12-15번째 줄에서는 몸통을 큐브로 만들고 있습니다. scale 속성으로 비율을 조정해 사람의 몸통 형태에 가깝게 만듭니다.
이것이 바로 블록아웃 단계입니다. 실제 현업에서는 어떻게 활용할까요?
예를 들어 게임 캐릭터를 만든다고 가정해봅시다. 먼저 큰 도형으로 머리, 몸통, 팔다리의 대략적인 비율과 포즈를 잡습니다.
이 단계에서 기획자나 아트 디렉터에게 승인을 받습니다. 승인이 나면 그때부터 디테일을 추가하기 시작합니다.
많은 스튜디오에서 이런 단계별 워크플로우를 적극적으로 사용하고 있습니다. 하지만 주의할 점도 있습니다.
초보 모델러들이 흔히 하는 실수 중 하나는 블록아웃 단계를 건너뛰고 바로 디테일 작업에 들어가는 것입니다. 이렇게 하면 전체 비율이 어긋나거나, 나중에 큰 수정이 필요할 때 처음부터 다시 만들어야 하는 문제가 발생할 수 있습니다.
따라서 반드시 큰 형태부터 시작해 점진적으로 디테일을 추가하는 방법으로 작업해야 합니다. 다시 김모델 씨의 이야기로 돌아가 봅시다.
박3D 씨의 설명을 들은 김모델 씨는 고개를 끄덕였습니다. "아, 처음부터 완벽하게 만들려고 하지 말고, 단계별로 진행하면 되는 거군요!" 캐릭터 모델링 워크플로우를 제대로 이해하면 더 빠르고 효율적으로 작업할 수 있습니다.
여러분도 오늘 배운 내용을 실제 프로젝트에 적용해 보세요.
실전 팁
💡 - 처음에는 Mirror Modifier를 사용해 좌우 대칭으로 작업하면 시간을 절반으로 줄일 수 있습니다
- 블록아웃 단계에서 Proportional Editing을 활용하면 자연스러운 형태를 빠르게 만들 수 있습니다
- 각 단계마다 파일을 저장해두면 나중에 이전 단계로 돌아가기 쉽습니다
2. 메시 편집 및 세분화 기법
김모델 씨가 기본 형태를 만들고 나서 박3D 씨에게 물었습니다. "이제 어떻게 디테일을 추가하나요?" 박3D 씨는 미소를 지으며 Edit Mode로 전환했습니다.
"메시 편집과 세분화, 이게 진짜 모델링의 시작이에요."
메시 편집은 버텍스, 엣지, 페이스를 조작해 원하는 형태를 만드는 과정입니다. 세분화는 메시를 더 작은 조각으로 나누어 디테일을 추가할 수 있게 만드는 기법입니다.
마치 종이접기에서 접는 횟수를 늘릴수록 복잡한 형태를 만들 수 있는 것처럼, 메시를 세분화할수록 더 정교한 표현이 가능해집니다.
다음 코드를 살펴봅시다.
import bpy
# 머리 오브젝트 선택 및 Edit Mode 진입
obj = bpy.data.objects['Character_Head']
bpy.context.view_layer.objects.active = obj
bpy.ops.object.mode_set(mode='EDIT')
# Subdivision Surface Modifier 추가 (세분화)
bpy.ops.object.mode_set(mode='OBJECT')
subdiv = obj.modifiers.new(name="Subdivision", type='SUBSURF')
subdiv.levels = 2 # 뷰포트에서 2단계 세분화
subdiv.render_levels = 3 # 렌더링 시 3단계 세분화
# Loop Cut으로 디테일 추가 영역 준비
bpy.ops.object.mode_set(mode='EDIT')
bpy.ops.mesh.select_all(action='SELECT')
bpy.ops.mesh.loopcut_slide(MESH_OT_loopcut={"number_cuts":4})
김모델 씨는 만든 구 형태를 바라보며 고민에 빠졌습니다. "이 각진 구를 어떻게 부드러운 머리 형태로 만들죠?" 화면에는 각이 진 폴리곤들이 보였습니다.
박3D 씨가 키보드를 두드렸습니다. "Subdivision Surface, 이게 마법이에요." 그렇다면 메시 편집과 세분화란 정확히 무엇일까요?
쉽게 비유하자면, 메시 편집은 마치 찰흙을 손으로 눌러 형태를 만드는 것과 같습니다. 찰흙의 특정 부분을 밀고, 당기고, 늘리면서 원하는 모양을 만들죠.
세분화는 거친 찰흙 덩어리를 물로 적셔 더 부드럽고 매끄럽게 만드는 과정입니다. Blender에서도 거칠게 만든 메시를 세분화해 부드러운 표면으로 바꿉니다.
세분화가 없던 시절에는 어땠을까요? 모델러들은 부드러운 곡면을 만들기 위해 수백, 수천 개의 폴리곤을 직접 배치해야 했습니다.
작업 시간은 길어지고, 컴퓨터는 느려졌습니다. 더 큰 문제는 수정할 때마다 모든 버텍스를 다시 조정해야 한다는 점이었습니다.
프로젝트가 커질수록 이런 문제는 감당하기 어려워졌습니다. 바로 이런 문제를 해결하기 위해 Subdivision Surface Modifier가 등장했습니다.
이 모디파이어를 사용하면 적은 수의 폴리곤으로 부드러운 곡면을 만들 수 있습니다. 또한 원본 메시는 단순하게 유지되어 수정이 쉽습니다.
무엇보다 뷰포트에서는 낮은 해상도로, 렌더링에서는 높은 해상도로 자동 조절된다는 큰 이점이 있습니다. 위의 코드를 한 줄씩 살펴보겠습니다.
먼저 3-5번째 줄을 보면 캐릭터 머리 오브젝트를 선택하고 Edit Mode로 전환하는 것을 알 수 있습니다. Edit Mode에서만 버텍스, 엣지, 페이스를 편집할 수 있기 때문입니다.
다음으로 8-11번째 줄에서는 Subdivision Surface Modifier를 추가하고 있습니다. levels는 뷰포트에서 보이는 세분화 정도이고, render_levels는 최종 렌더링 시 사용될 세분화 정도입니다.
렌더링 시에는 더 높은 품질이 필요하므로 보통 1-2단계 더 높게 설정합니다. 14-16번째 줄에서는 Loop Cut을 사용해 메시에 엣지 루프를 추가합니다.
이것은 특정 부분에만 디테일을 집중하고 싶을 때 사용하는 핵심 기법입니다. 실제 현업에서는 어떻게 활용할까요?
예를 들어 캐릭터의 얼굴을 만든다고 가정해봅시다. 눈, 코, 입 주변은 많은 디테일이 필요하지만, 뒤통수는 상대적으로 단순합니다.
이때 Loop Cut으로 얼굴 중앙에만 엣지를 추가하면 필요한 부분에만 폴리곤이 집중됩니다. AAA 게임 스튜디오에서는 이런 방식으로 효율적인 토폴로지를 만듭니다.
하지만 주의할 점도 있습니다. 초보 모델러들이 흔히 하는 실수 중 하나는 세분화 레벨을 너무 높게 설정하는 것입니다.
레벨 5, 6까지 올리면 폴리곤이 기하급수적으로 증가해 컴퓨터가 멈출 수 있습니다. 따라서 대부분의 경우 레벨 2-3이면 충분하며, 꼭 필요한 경우에만 더 높은 값을 사용해야 합니다.
또 다른 실수는 Subdivision을 적용하기 전에 메시를 정리하지 않는 것입니다. 겹친 버텍스나 뒤집힌 노멀이 있으면 세분화 후 이상한 결과가 나옵니다.
다시 김모델 씨의 이야기로 돌아가 봅시다. Subdivision을 적용한 순간, 각진 구가 매끄러운 구체로 변했습니다.
"우와, 마법 같아요!" 메시 편집과 세분화를 제대로 이해하면 효율적이고 아름다운 모델을 만들 수 있습니다. 여러분도 오늘 배운 내용을 실제 프로젝트에 적용해 보세요.
실전 팁
💡 - Ctrl+R로 Loop Cut을 빠르게 추가할 수 있습니다
- Subdivision 적용 전 Merge by Distance로 중복 버텍스를 정리하세요
- Edge Crease로 특정 엣지만 날카롭게 유지할 수 있습니다
3. 얼굴 및 신체 모델링
김모델 씨는 부드러운 구 형태까지는 만들었지만, 이제 진짜 어려운 부분이 남았습니다. "얼굴은 어떻게 만들죠?
눈, 코, 입이 다 달라야 하는데..." 박3D 씨가 웃으며 대답했습니다. "얼굴도 결국 메시 편집의 연장이에요.
핵심은 올바른 토폴로지죠."
얼굴 모델링은 Edge Flow를 따라 자연스러운 근육 흐름을 만드는 작업입니다. 눈, 코, 입 주변에 Edge Loop를 배치해 표정 애니메이션이 자연스럽게 동작하도록 합니다.
마치 지도의 등고선이 산의 형태를 나타내는 것처럼, 올바른 엣지 배치는 얼굴의 자연스러운 움직임을 보장합니다.
다음 코드를 살펴봅시다.
import bpy
# 얼굴 영역 작업을 위한 준비
obj = bpy.data.objects['Character_Head']
bpy.context.view_layer.objects.active = obj
bpy.ops.object.mode_set(mode='EDIT')
# 눈 위치에 Inset으로 깊이 만들기
bpy.ops.mesh.select_all(action='DESELECT')
bpy.ops.mesh.select_mode(type='FACE')
# 특정 페이스 선택 후 Inset
bpy.ops.mesh.inset(thickness=0.1, depth=0.05)
# Extrude로 코 돌출부 만들기
bpy.ops.mesh.extrude_region_move(
TRANSFORM_OT_translate={"value":(0, 0.3, 0)}
)
# Proportional Editing으로 자연스러운 곡면 조정
bpy.context.scene.tool_settings.use_proportional_edit = True
bpy.context.scene.tool_settings.proportional_edit_falloff = 'SMOOTH'
김모델 씨는 화면에 띄운 참고 이미지를 보며 한숨을 쉬었습니다. "사람 얼굴이 이렇게 복잡한 줄 몰랐어요." 눈썹, 눈꺼풀, 콧망울, 입술...
모든 부분이 서로 다른 형태였습니다. 박3D 씨가 참고 자료 하나를 보여주었습니다.
"이걸 보세요. 얼굴 근육의 흐름이죠.
우리 엣지도 이 흐름을 따라가야 해요." 그렇다면 얼굴 모델링에서 토폴로지란 정확히 무엇일까요? 쉽게 비유하자면, 얼굴 토폴로지는 마치 얼굴에 그려진 지문과 같습니다.
지문의 패턴이 손가락의 굴곡을 따라가듯, 엣지 루프도 얼굴의 근육과 주름 방향을 따라가야 합니다. 눈 주변은 동심원처럼, 입 주변은 방사형으로 배치됩니다.
이렇게 하면 표정을 지을 때 메시가 자연스럽게 변형됩니다. 올바른 토폴로지가 없던 시절에는 어땠을까요?
초기 3D 게임들을 보면 캐릭터가 웃을 때 얼굴이 부자연스럽게 일그러졌습니다. 엣지가 무작위로 배치되어 있어서 애니메이션이 제대로 작동하지 않았기 때문입니다.
더 큰 문제는 텍스처 매핑이 뒤틀린다는 점이었습니다. 아무리 좋은 텍스처를 사용해도 결과물은 어색했습니다.
바로 이런 문제를 해결하기 위해 Edge Flow 기반 모델링이 표준이 되었습니다. 올바른 토폴로지를 사용하면 표정 애니메이션이 자연스럽게 동작합니다.
또한 UV 언래핑이 쉬워져 텍스처 작업 시간이 단축됩니다. 무엇보다 폴리곤 수를 최소화하면서도 자연스러운 형태를 유지할 수 있다는 큰 이점이 있습니다.
위의 코드를 한 줄씩 살펴보겠습니다. 먼저 3-6번째 줄을 보면 Edit Mode로 전환하는 것을 알 수 있습니다.
얼굴 디테일 작업은 모두 Edit Mode에서 이루어집니다. 다음으로 9-12번째 줄에서는 Inset 기능을 사용하고 있습니다.
Inset은 선택한 페이스 안쪽에 새로운 페이스를 만들면서 깊이를 추가합니다. 눈구멍이나 콧구멍처럼 움푹 들어간 부분을 만들 때 완벽합니다.
thickness는 안쪽으로 들어가는 정도, depth는 깊이를 조절합니다. 14-16번째 줄에서는 Extrude로 코를 돌출시킵니다.
y축 방향으로 0.3만큼 밀어내 코가 앞으로 나오게 만듭니다. 19-20번째 줄의 Proportional Editing은 게임 체인저입니다.
한 버텍스를 움직일 때 주변 버텍스들도 부드럽게 따라 움직여 자연스러운 곡면을 만들 수 있습니다. 실제 현업에서는 어떻게 활용할까요?
영화나 게임에서 사용되는 캐릭터를 보면 눈 주변에 최소 3-4개의 동심원 루프가 배치되어 있습니다. 이것은 눈을 감고 뜰 때, 웃을 때 자연스러운 주름을 만들기 위함입니다.
입 주변도 마찬가지로 방사형 엣지 패턴을 사용해 말할 때의 입 모양 변화를 표현합니다. 픽사나 드림웍스 같은 스튜디오에서는 이런 토폴로지 규칙을 매우 엄격하게 지킵니다.
하지만 주의할 점도 있습니다. 초보 모델러들이 흔히 하는 실수 중 하나는 삼각형 폴리곤을 너무 많이 사용하는 것입니다.
대부분의 영역은 사각형 폴리곤으로 구성해야 Subdivision이 자연스럽게 작동합니다. 삼각형은 폴리곤 흐름이 바뀌는 특수한 위치에만 최소한으로 사용해야 합니다.
또 다른 실수는 디테일을 너무 일찍 추가하는 것입니다. 큰 형태가 제대로 잡히지 않은 상태에서 주름이나 모공을 만들면 나중에 수정이 거의 불가능합니다.
다시 김모델 씨의 이야기로 돌아가 봅시다. Edge Loop를 눈 주변에 배치하자 갑자기 얼굴이 살아 움직이는 것 같았습니다.
"아, 이래서 토폴로지가 중요한 거군요!" 얼굴 모델링을 제대로 이해하면 생동감 있는 캐릭터를 만들 수 있습니다. 여러분도 오늘 배운 내용을 실제 프로젝트에 적용해 보세요.
실전 팁
💡 - 눈 주변은 최소 3개, 입 주변은 4개의 Edge Loop를 배치하세요
- K키로 Knife Tool을 사용하면 자유롭게 엣지를 추가할 수 있습니다
- X-Ray 모드를 켜면 뒷면의 버텍스도 선택하기 쉽습니다
4. UV 언래핑 기초
김모델 씨가 모델링을 마치고 기뻐했지만, 박3D 씨가 말했습니다. "이제 색을 칠해야죠.
하지만 그 전에 UV 언래핑이 필요해요." "UV 언래핑이요? 그게 뭔가요?" 김모델 씨의 눈이 커졌습니다.
UV 언래핑은 3D 메시를 2D 평면으로 펼치는 과정입니다. 마치 종이 상자를 가위로 잘라 평평하게 펴는 것과 같습니다.
이렇게 펼쳐진 UV 맵에 텍스처를 그리면 3D 모델에 정확하게 입혀집니다.
다음 코드를 살펴봅시다.
import bpy
# UV 언래핑할 오브젝트 선택
obj = bpy.data.objects['Character_Head']
bpy.context.view_layer.objects.active = obj
bpy.ops.object.mode_set(mode='EDIT')
# 모든 페이스 선택
bpy.ops.mesh.select_all(action='SELECT')
# Seam 마킹 (머리 뒤쪽에 솔기 추가)
bpy.ops.mesh.select_mode(type='EDGE')
# 특정 엣지 선택 후
bpy.ops.mesh.mark_seam(clear=False)
# Smart UV Project로 자동 언래핑
bpy.ops.mesh.select_all(action='SELECT')
bpy.ops.uv.smart_project(angle_limit=66.0, island_margin=0.02)
# 또는 Unwrap으로 수동 언래핑
# bpy.ops.uv.unwrap(method='ANGLE_BASED', margin=0.001)
김모델 씨는 완성한 얼굴 모델을 보며 뿌듯해했습니다. "이제 피부색을 칠하면 되겠네요!" 하지만 박3D 씨가 고개를 저었습니다.
"그냥 색을 칠하면 안 돼요. UV 맵을 만들어야 텍스처가 제대로 입혀져요." "UV 맵이요?
왜 3D인데 2D로 펼쳐야 하죠?" 김모델 씨가 의아해했습니다. 그렇다면 UV 언래핑이란 정확히 무엇일까요?
쉽게 비유하자면, UV 언래핑은 마치 축구공의 가죽을 펼치는 것과 같습니다. 축구공을 보면 오각형과 육각형 조각들이 바느질로 연결되어 있습니다.
이 바느질 선을 뜯어내면 가죽을 평평하게 펼칠 수 있죠. 펼친 가죽에 그림을 그린 다음 다시 바느질하면 축구공에 정확한 패턴이 들어갑니다.
UV 언래핑도 똑같은 원리입니다. UV 언래핑이 없던 시절에는 어땠을까요?
초기 3D 그래픽에서는 단순한 절차적 텍스처만 사용했습니다. 체커보드 패턴이나 단색 그라디언트 같은 것들이죠.
복잡한 디테일을 표현하려면 모델링으로 직접 만들어야 했습니다. 피부의 주름, 옷의 무늬, 로고 같은 것들을 폴리곤으로 만들다 보니 모델이 엄청나게 무거워졌습니다.
바로 이런 문제를 해결하기 위해 UV 매핑 시스템이 등장했습니다. UV 맵을 사용하면 텍스처 이미지를 정확한 위치에 배치할 수 있습니다.
또한 포토샵이나 서브스턴스 페인터 같은 2D 도구로 작업할 수 있어 효율이 크게 높아집니다. 무엇보다 폴리곤 수를 늘리지 않고도 엄청난 디테일을 추가할 수 있다는 큰 이점이 있습니다.
위의 코드를 한 줄씩 살펴보겠습니다. 먼저 3-6번째 줄을 보면 UV 작업을 위해 Edit Mode로 전환하는 것을 알 수 있습니다.
UV 언래핑도 메시 편집의 일종이기 때문입니다. 다음으로 12-13번째 줄에서는 Seam을 마킹하고 있습니다.
Seam은 바느질 선, 즉 3D 모델을 어디서 자를지 표시하는 것입니다. 잘 보이지 않는 부분에 Seam을 배치하면 텍스처 이음새가 눈에 띄지 않습니다.
머리의 경우 보통 뒤통수 중앙에 Seam을 넣습니다. 17번째 줄의 Smart UV Project는 자동으로 UV를 펼쳐주는 편리한 기능입니다.
angle_limit는 어느 정도 각도 차이까지 하나의 아일랜드로 묶을지 결정하고, island_margin은 UV 아일랜드 사이의 여백을 조절합니다. 20번째 줄의 주석 처리된 Unwrap 메서드는 Seam을 기준으로 수동 언래핑할 때 사용합니다.
더 정확한 제어가 필요할 때 이 방식을 선택합니다. 실제 현업에서는 어떻게 활용할까요?
게임 캐릭터의 경우 텍스처 해상도가 제한적이므로 UV 공간을 최대한 효율적으로 사용해야 합니다. 얼굴처럼 중요한 부분은 UV 공간의 50% 이상을 차지하게 하고, 뒤통수나 목 뒤처럼 잘 안 보이는 부분은 작게 배치합니다.
이를 Texel Density 최적화라고 합니다. 또한 대칭인 부분은 UV도 겹쳐서 배치하면 텍스처 용량을 절반으로 줄일 수 있습니다.
왼쪽 팔과 오른쪽 팔이 똑같다면 굳이 두 번 그릴 필요가 없죠. 하지만 주의할 점도 있습니다.
초보 모델러들이 흔히 하는 실수 중 하나는 UV 아일랜드를 너무 많이 만드는 것입니다. 조각이 많을수록 텍스처 이음새도 많아져 텍스처 작업이 어려워집니다.
따라서 꼭 필요한 위치에만 Seam을 배치해야 합니다. 또 다른 실수는 UV가 뒤틀리는 것을 확인하지 않는 것입니다.
Blender의 UV Editor에서 체커보드 텍스처를 입혀보면 뒤틀린 부분이 한눈에 보입니다. 정사각형 체커 패턴이 찌그러져 보이면 UV를 다시 조정해야 합니다.
다시 김모델 씨의 이야기로 돌아가 봅시다. UV 맵을 생성하고 체커보드를 입혀보니 머리 전체가 깔끔하게 펼쳐져 있었습니다.
"와, 이제 여기에 그림을 그리면 되는 거군요!" UV 언래핑을 제대로 이해하면 텍스처 작업이 훨씬 수월해집니다. 여러분도 오늘 배운 내용을 실제 프로젝트에 적용해 보세요.
실전 팁
💡 - 잘 안 보이는 부분(머리 뒤, 겨드랑이 등)에 Seam을 배치하세요
- UV Editor에서 Ctrl+P를 눌러 UV를 펼 때 Pin 기능을 활용하세요
- Checker 텍스처로 항상 UV 왜곡을 확인하세요
5. 색상 및 재질 적용
김모델 씨가 UV 맵을 완성하고 신나게 말했습니다. "이제 진짜 색칠하면 되죠?" 박3D 씨가 Shading 워크스페이스를 열며 답했습니다.
"네, 하지만 단순히 색만 칠하는 게 아니라 재질을 만드는 거예요."
**재질(Material)**은 색상뿐만 아니라 반사, 거칠기, 투명도 등 표면의 모든 특성을 정의합니다. Principled BSDF 셰이더는 물리 기반 렌더링을 위한 만능 셰이더로, 현실적인 재질을 쉽게 만들 수 있습니다.
마치 실제 물체의 표면 특성을 디지털로 재현하는 것과 같습니다.
다음 코드를 살펴봅시다.
import bpy
# 새 재질 생성
mat = bpy.data.materials.new(name="Skin_Material")
mat.use_nodes = True
# Principled BSDF 노드 가져오기
bsdf = mat.node_tree.nodes.get("Principled BSDF")
# 기본 피부색 설정 (Base Color)
bsdf.inputs['Base Color'].default_value = (0.8, 0.6, 0.5, 1.0)
# 피부의 거칠기 설정 (Roughness)
bsdf.inputs['Roughness'].default_value = 0.4
# 약간의 표면하 산란 효과 (Subsurface)
bsdf.inputs['Subsurface Weight'].default_value = 0.1
bsdf.inputs['Subsurface Radius'].default_value = (1.0, 0.2, 0.1)
# 오브젝트에 재질 적용
obj = bpy.data.objects['Character_Head']
if obj.data.materials:
obj.data.materials[0] = mat
else:
obj.data.materials.append(mat)
김모델 씨는 단순히 분홍색을 칠하면 끝일 줄 알았습니다. 하지만 박3D 씨가 보여준 재질 설정 패널에는 수십 개의 파라미터가 있었습니다.
"이걸 다 설정해야 하나요?" 박3D 씨가 미소를 지었습니다. "처음에는 몇 가지만 알면 돼요.
Base Color, Roughness, Subsurface 이 세 가지만 제대로 설정해도 괜찮은 결과가 나와요." 그렇다면 재질이란 정확히 무엇일까요? 쉽게 비유하자면, 재질은 마치 물체의 표면 성격을 정의하는 신분증과 같습니다.
같은 형태의 공이라도 농구공은 고무 재질이라 거칠고, 당구공은 플라스틱 재질이라 매끄럽고 반짝입니다. 3D에서도 같은 모델에 다른 재질을 적용하면 완전히 다른 느낌이 납니다.
금속처럼 반짝거릴 수도 있고, 천처럼 부드러워 보일 수도 있죠. 재질 시스템이 없던 시절에는 어땠을까요?
초기 3D 그래픽에서는 단순한 색상만 지정할 수 있었습니다. 모든 물체가 플라스틱처럼 보였죠.
사실적인 표현을 위해서는 복잡한 셰이더 코드를 직접 작성해야 했습니다. 프로그래머가 아닌 아티스트는 원하는 재질을 만들기 어려웠습니다.
바로 이런 문제를 해결하기 위해 Principled BSDF가 등장했습니다. 이 셰이더를 사용하면 코드 없이 슬라이더만으로 사실적인 재질을 만들 수 있습니다.
또한 **물리 기반 렌더링(PBR)**을 따르므로 어떤 조명 환경에서도 자연스럽게 보입니다. 무엇보다 한 번 만든 재질을 다른 프로젝트에서도 재사용할 수 있다는 큰 이점이 있습니다.
위의 코드를 한 줄씩 살펴보겠습니다. 먼저 4-5번째 줄을 보면 새 재질을 생성하고 노드를 활성화하는 것을 알 수 있습니다.
use_nodes를 True로 설정해야 Shader Editor에서 노드 기반 재질 편집이 가능합니다. 다음으로 8번째 줄에서는 Principled BSDF 노드를 가져옵니다.
11번째 줄의 Base Color는 재질의 기본 색상입니다. RGBA 값으로 지정하며, 피부색은 보통 (0.8, 0.6, 0.5) 정도의 따뜻한 톤을 사용합니다.
14번째 줄의 Roughness는 표면의 거칠기입니다. 0이면 완전히 매끄러운 거울처럼, 1이면 완전히 거친 무광 표면처럼 보입니다.
피부는 중간 정도인 0.4가 적당합니다. 17-18번째 줄의 Subsurface는 표면하 산란 효과로, 빛이 표면을 뚫고 들어가 내부에서 산란되는 현상입니다.
피부, 왁스, 대리석 같은 반투명 재질에서 중요합니다. Subsurface Radius의 RGB 값은 빨강, 초록, 파랑 빛이 얼마나 깊이 침투하는지 결정합니다.
21-25번째 줄에서는 생성한 재질을 실제 오브젝트에 적용합니다. 실제 현업에서는 어떻게 활용할까요?
영화나 게임에서 캐릭터를 보면 피부뿐만 아니라 옷, 머리카락, 액세서리가 모두 다른 재질로 표현됩니다. 금속 갑옷은 Metallic을 1.0으로 설정하고, 천 옷은 Roughness를 높이고 약간의 Sheen을 추가합니다.
머리카락은 Anisotropic을 사용해 방향성 반사를 표현합니다. 게임 엔진으로 내보낼 때는 텍스처 맵으로 베이킹합니다.
Base Color 맵, Roughness 맵, Normal 맵 등을 이미지 파일로 저장해 Unity나 Unreal Engine에서 사용합니다. 하지만 주의할 점도 있습니다.
초보 모델러들이 흔히 하는 실수 중 하나는 모든 재질을 너무 반짝거리게 만드는 것입니다. 현실 세계의 대부분 물체는 Roughness가 0.3 이상입니다.
너무 낮은 값을 사용하면 플라스틱 장난감처럼 보입니다. 또 다른 실수는 Subsurface를 과도하게 사용하는 것입니다.
피부에 Subsurface Weight를 0.5 이상 주면 반투명한 유령처럼 보입니다. 미묘한 효과가 중요하므로 0.05-0.15 사이 값을 사용하세요.
다시 김모델 씨의 이야기로 돌아가 봅시다. 재질을 적용하고 조명을 비춰보니 캐릭터가 살아있는 것처럼 보였습니다.
"와, 정말 사람 피부 같아요!" 재질을 제대로 이해하면 단순한 모델도 생생하게 만들 수 있습니다. 여러분도 오늘 배운 내용을 실제 프로젝트에 적용해 보세요.
실전 팁
💡 - Viewport Shading을 Material Preview나 Rendered로 바꿔야 재질이 보입니다
- Shader Editor와 3D Viewport를 나란히 띄워놓고 작업하면 편리합니다
- 무료 PBR 텍스처는 Polyhaven.com에서 다운로드할 수 있습니다
6. 캐릭터 최적화 (Low-poly 기법)
김모델 씨가 완성한 캐릭터를 웹에 올리려다 멈칫했습니다. "파일이 50MB나 되네요?
이걸 Three.js에 어떻게 올리죠?" 박3D 씨가 고개를 끄덕였습니다. "최적화가 필요한 시점이네요.
Low-poly 버전을 만들어봅시다."
Low-poly 최적화는 폴리곤 수를 줄여 성능을 향상시키는 기법입니다. Decimate Modifier로 자동 감소하거나 Retopology로 수동으로 새 메시를 만듭니다.
마치 고해상도 사진을 웹용으로 압축하는 것처럼, 시각적 품질은 유지하면서 데이터 크기를 줄입니다.
다음 코드를 살펴봅시다.
import bpy
# 최적화할 오브젝트 선택
obj = bpy.data.objects['Character_Head']
bpy.context.view_layer.objects.active = obj
# Decimate Modifier로 폴리곤 감소
decimate = obj.modifiers.new(name="Decimate", type='DECIMATE')
decimate.ratio = 0.5 # 폴리곤을 50%로 감소
decimate.use_collapse_triangulate = True
# Modifier 적용
bpy.ops.object.modifier_apply(modifier="Decimate")
# 정리: Merge by Distance로 중복 버텍스 제거
bpy.ops.object.mode_set(mode='EDIT')
bpy.ops.mesh.select_all(action='SELECT')
bpy.ops.mesh.remove_doubles(threshold=0.0001)
# Normal 데이터 정리
bpy.ops.mesh.normals_make_consistent(inside=False)
# 최종 통계 확인
print(f"최적화 후 폴리곤 수: {len(obj.data.polygons)}")
print(f"최적화 후 버텍스 수: {len(obj.data.vertices)}")
김모델 씨는 자랑스럽게 완성한 캐릭터를 보며 뿌듯했습니다. Subdivision을 레벨 3까지 올리고, 디테일도 가득 추가했습니다.
하지만 Three.js에 로드하자 브라우저가 느려졌습니다. 박3D 씨가 폴리곤 수를 확인했습니다.
"50만 폴리곤이네요. 웹에서는 이건 너무 많아요.
1만 폴리곤 이하로 줄여야 해요." 그렇다면 Low-poly 최적화란 정확히 무엇일까요? 쉽게 비유하자면, Low-poly 최적화는 마치 책을 요약하는 것과 같습니다.
500페이지짜리 책의 핵심 내용을 50페이지로 압축해도 주요 메시지는 전달됩니다. 마찬가지로 50만 폴리곤을 1만 폴리곤으로 줄여도 멀리서 보면 거의 구분이 안 됩니다.
중요한 것은 실루엣과 주요 특징을 유지하는 것입니다. 최적화가 없던 시절에는 어땠을까요?
초기 웹 3D는 성능 문제로 고통받았습니다. 고품질 모델을 그대로 사용하면 로딩 시간이 길고, 프레임 레이트가 떨어졌습니다.
모바일에서는 아예 작동하지 않는 경우도 많았습니다. 사용자들은 3D 웹사이트를 피했고, 개발자들은 3D를 포기했습니다.
바로 이런 문제를 해결하기 위해 LOD(Level of Detail) 시스템과 Retopology 기법이 등장했습니다. 최적화를 사용하면 로딩 시간이 10배 이상 빨라집니다.
또한 낮은 사양의 기기에서도 부드럽게 동작합니다. 무엇보다 같은 씬에 더 많은 캐릭터를 배치할 수 있다는 큰 이점이 있습니다.
위의 코드를 한 줄씩 살펴보겠습니다. 먼저 3-5번째 줄을 보면 최적화할 오브젝트를 선택하는 것을 알 수 있습니다.
최적화는 원본을 보존하기 위해 복사본에서 작업하는 것이 좋습니다. 다음으로 8-10번째 줄에서는 Decimate Modifier를 추가하고 있습니다.
Decimate는 세 가지 모드가 있습니다. Collapse는 엣지를 병합해 폴리곤을 줄이고, Un-Subdivide는 Subdivision을 반대로 적용하며, Planar는 평평한 면의 폴리곤을 줄입니다.
보통 Collapse 모드를 가장 많이 사용합니다. ratio는 남길 폴리곤 비율입니다.
0.5면 원본의 50%만 남깁니다. 너무 낮게 설정하면 형태가 무너지므로 0.3-0.7 사이에서 조절하세요.
12번째 줄에서 Modifier를 적용하면 실제로 메시가 수정됩니다. 16-18번째 줄의 Merge by Distance(구 Remove Doubles)는 지정한 거리 안에 있는 버텍스를 하나로 합칩니다.
Decimate 후 남은 중복 버텍스를 정리하는 필수 단계입니다. 20번째 줄의 Normals Make Consistent는 면의 방향을 일관되게 만듭니다.
뒤집힌 노멀이 있으면 렌더링이 이상해지므로 반드시 체크하세요. 실제 현업에서는 어떻게 활용할까요?
게임 개발에서는 LOD 시스템을 사용합니다. 같은 캐릭터를 5만, 2만, 5천, 1천 폴리곤 버전으로 만들어둡니다.
카메라가 가까우면 5만 폴리곤, 멀면 1천 폴리곤을 자동으로 교체합니다. 사용자는 차이를 눈치채지 못하지만 성능은 크게 향상됩니다.
웹 개발에서는 GLTF 포맷의 Draco 압축을 함께 사용합니다. 폴리곤 감소와 압축 알고리즘을 결합하면 파일 크기를 90% 이상 줄일 수 있습니다.
하지만 주의할 점도 있습니다. 초보 모델러들이 흔히 하는 실수 중 하나는 Decimate ratio를 너무 낮게 설정하는 것입니다.
0.1 같은 극단적인 값을 사용하면 실루엣이 망가집니다. 단계적으로 줄여가며 육안으로 확인하세요.
또 다른 실수는 Subdivision을 적용한 채로 Decimate하는 것입니다. Subdivision은 나중에 적용하거나 아예 제거하고 수동 Retopology를 하는 것이 좋습니다.
Normal Map Baking도 함께 사용하세요. High-poly 모델의 디테일을 Normal Map으로 구워서 Low-poly 모델에 입히면 폴리곤은 적지만 디테일은 유지됩니다.
다시 김모델 씨의 이야기로 돌아가 봅시다. Decimate로 1만 폴리곤까지 줄이고 Normal Map을 구웠더니 웹에서 부드럽게 돌아갔습니다.
"파일 크기는 1/10인데 거의 똑같이 보이네요!" 캐릭터 최적화를 제대로 이해하면 어떤 플랫폼에서도 사용할 수 있는 모델을 만들 수 있습니다. 여러분도 오늘 배운 내용을 실제 프로젝트에 적용해 보세요.
실전 팁
💡 - 원본은 항상 백업하고 복사본에서 최적화 작업하세요
- Wireframe 모드로 전환해 폴리곤 분포를 확인하세요
- Three.js에서는 10,000 폴리곤 이하를 권장합니다
이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!
댓글 (0)
함께 보면 좋은 카드 뉴스
Three.js 카메라 및 조명 설정 완벽 가이드
3D 웹 개발에서 가장 중요한 카메라와 조명 설정을 실무 중심으로 배워봅니다. 초급 개발자도 쉽게 따라할 수 있도록 실전 예제와 함께 설명합니다.
Three.js 모델 불러오기 완벽 가이드
Blender에서 만든 3D 모델을 웹 브라우저로 불러오는 방법을 배웁니다. GLTFLoader 사용법부터 텍스처 처리, 성능 최적화까지 실무에서 바로 쓸 수 있는 완전한 가이드입니다.
Blender 내보내기 최적화 완벽 가이드
Blender에서 Three.js로 3D 모델을 내보낼 때 반드시 알아야 할 최적화 기법을 다룹니다. 노멀 수정부터 경량화, 포맷 선택까지 실무에서 바로 쓸 수 있는 체크리스트를 제공합니다.
Blender 텍스처링 완벽 가이드
3D 모델에 생명을 불어넣는 텍스처링 기법을 처음부터 차근차근 배워봅니다. 이미지 준비부터 UV 매핑, Shader Editor 활용까지 실무에 바로 적용할 수 있는 내용으로 구성했습니다.
Three.js 기초 개념 완벽 가이드
Three.js의 핵심 개념인 Scene, Camera, Renderer부터 조명, 재질, 애니메이션까지 실무에서 바로 사용할 수 있는 3D 웹 개발 기초를 다룹니다. 초급 개발자도 쉽게 따라할 수 있도록 단계별로 설명합니다.