언어:
페이지 정보
엔진 버전:
언리얼 엔진

UV 채널 작업

언리얼 엔진

UV 채널은 메시의 버텍스 각각을 2D 공간의 좌표로 매핑하는 데이터 세트로, 스태틱 메시 안에 저장됩니다. 이 매핑은 메시를 렌더링할 때 2D 텍스처 맵으로 3D 지오메트리를 둘러싸는 방법을 정의합니다.

일반적으로 스태틱 메시에 대한 지오메트리를 생성할 때 사용하는 것과 같은 전용 모델링 툴에서 UV 매핑을 만들고 관리합니다. 그러나 에디터에 제공되는 다른 방식으로 모델의 UV 채널 작업을 할 수도 있으며, 그 방식은 다음과 같습니다.

UV 채널은 엔진에서 주로 두 가지 용도로 쓰입니다.

  • 머티리얼의 텍스처 좌표 - 텍스처 맵을 샘플링하는 머티리얼을 만들어 스태틱 메시의 표면에 적용할 때, Texture Coordinate (또는 Texcoord) 노드를 사용하여 UV 채널을 지정할 수 있습니다. 머티리얼은 선택된 UV 채널에 들어있는 2D 좌표와 3D 버텍스 위치 사이 매핑을 사용해서 텍스처 어느 영역을 3D 모델의 어느 트라이앵글 셰이딩에 사용할지 결정합니다.

    예를 들어, 이 (이미지 오른쪽 위에 표시된) 단순 평면 스태틱 메시의 UV 채널 0은 메시의 (A와 B) 두 트라이앵글을 텍스처 공간에 매핑하는 가장 간단한 방법을 보여줍니다. 이 (TexCoord 노드의 Coordinate Index 프로퍼티로 설정된) UV 채널을 사용하면, 머티리얼은 평면에 텍스처의 전체 너비와 높이만큼 적용합니다.
    texture-mapping-1-1.png
    반면, 아래 이미지는 UV 채널 1을 보여주며, 트라이앵글과 UV 텍스처 공간 사이 매핑을 회전하고 왜곡합니다. 같은 이미지 텍스처를 스태틱 메시에 적용하면, 스태틱 메시에 적용되는 텍스처 부위가 바뀝니다.
    texture-mapping-2.png
    UV 매핑의 트라이앵글은 겹칠 수 있습니다. 겹친다는 것은 텍스처 같은 부분이 3D 스태틱 메시 지오메트리의 여러 부분에 적용된다는 뜻입니다.

    "UV 채널"의 U는 텍스처의 수평 축을, V 는 수직 축을 나타냅니다. 텍스처 좌표는 일반적으로 0과 1 사이에 유지되며, 여기서 (0,0)은 텍스처의 왼쪽 하단을, (1,1)은 오른쪽 상단을 나타냅니다. 그러나 항상 그런 것은 아닙니다. 기본적으로 U 또는 V 값이 1 초과 또는 0 미만인 경우, 머티리얼은 텍스처 반대편으로 "둘러쌉"(wrap)니다. 예를 들어, V 값이 1.25 면 보통 0.25 로 취급합니다. 그러나 머티리얼에서 이 값을 클램핑하여 최소값 0과 최대값 1로 제한할 수 있습니다.

  • 라이트맵 - UV 채널은 라이트맵을 저장하고 적용하는 데도 사용됩니다. 라이트맵은 스태틱 메시에 대해 미리 계산한 라이팅 정보를 저장하는 특수 유형 텍스처입니다. 레벨에 모빌리티가 스테이셔너리 또는 스태틱 설정된 라이트가 있을 때 레벨에 라이팅을 빌드하면, 라이트매스 툴이 간접광(과 스태틱 라이트에 대한 직사광)을 라이트맵 텍스처에 저장하는데, 이 때 UV 채널을 사용해서 스태틱 메시의 3D 지오메트리와 2D 텍스처 공간 사이 매핑을 결정합니다.

    라이트맵에 사용되는 UV 채널은 다음과 같은 몇 가지 특수 규칙을 따라야 합니다. 오브젝트 모든 부분은 보통 받는 빛의 양이 다르기 때문에, 메시의 두 트라이앵글은 2D 텍스처 공간에서 겹칠 수 없습니다. 각 트라이앵글은 텍스처의 고유 영역을 점유해야 합니다. 추가로, 모든 UV 좌표 값은 0과 1 사이여야 합니다. 라이트맵 텍스처는 정규 텍스처 매핑과 똑같은 방식으로 "둘러쌀" 수 없습니다.
    그래서 라이트맵 UV는 일반적으로 간단한 UV 매핑에서 생성, 또는 패킹 합니다.

    예를 들어, 이 기둥의 텍스처 매핑 UV 채널은 네 면 각각의 지오메트리를 텍스처의 동일한 겹치는 영역에 매핑합니다. 이 UV 채널을 사용하여 텍스처를 지오메트리에 적용할 때, 면 각각은 텍스처 같은 부분을 사용합니다.
    texture-mapping-pillar.png
    그러나 오브젝트의 라이트맵 UV에서 각 면은 2D 공간의 고유 영역을 점유해야 합니다.
    texture-mapping-pillar-packed.png
    라이트맵 UV와 생성 방법에 대한 자세한 내용은 라이트맵 UV 펼치기 , 언리얼 엔진 4 의 라이트맵 생성 문서를 참고하세요.

엔진의 각 스태틱 메시는 최대 7개의 UV 채널을 가질 수 있으므로, 여러 머티리얼( 또는 단일 머티리얼 내 여러 텍스처 샘플링 노드)에 대해 여러가지 다양한 방법의 래핑 텍스처를 구성할 수 있습니다.

스태틱 메시 에디터의 UV 채널

스태틱 메시 에디터 UI에서 UV 채널을 나열, 시각화, 제거할 수 있습니다.

UV 채널 나열

스태틱 메시 에디터에서 스태틱 메시 애셋을 열면, 툴바의 UV 버튼을 사용하여 현재 스태틱 메시가 사용 중인 모든 UV 채널을 나열할 수 있습니다.

UV 채널 나열

UV 채널 시각화

목록의 UV 채널을 선택하면 메시의 트라이앵글을 2D 텍스처 공간에 매핑한 결과를 뷰포트에서 오버레이로 시각화할 수 있습니다.

UV 채널 시각화

목록 상단의 없음 을 선택하면 UV 오버레이를 숨깁니다.

UV 채널 제거

목록에 선택한 채널이 있으면, 제거할 수 있습니다. 각 UV 채널은 각 버텍스에 대한 텍스처 좌표를 스태틱 메시의 일부로 저장하므로, 사용하지 않는 매핑을 제거하여 런타임 메모리를 조금 절약할 수 있습니다.

선택한 UV 채널 제거

목록에서 삭제된 채널 뒤에 있던 다른 모든 UV 채널은 한 지점 위로 이동시켜, 채널 제거로 생긴 빈 공간을 채웁니다.

스태틱 메시 애셋이 라이트맵 UV를 생성하도록 구성되어 있고, 선택한 UV 채널이 이미 라이트맵 UV에 대한 소스 또는 대상 채널로 사용 중인 경우, UV 채널을 삭제할 수 없습니다. 빌드 세팅 > Generate Lightmap UVs (라이트맵 UV 생성) 옵션을 끄거나, 빌드 세팅 > Source Lightmap Index (소스 라이트맵 인덱스)와 빌드 세팅 > Destination Lightmap Index (대상 라이트맵 인덱스) 세팅이 다른 UV 채널을 가리키도록 변경하세요.

언어 선택

블루프린트

Python

에디터 스크립팅의 UV 채널

UV 채널 작업은 언리얼 엔진에서 실행하는 블루프린트 및 Python 스크립트로도 할 수 있습니다. 스태틱 메시 에디터에서 할 수 있는 모든 작업에 더해, 새 채널 추가나 새 UV 매핑 생성도 할 수 있습니다.

선행 조건: Editor Scripting Utilities (에디터 스크립팅 유틸리티) 플러그인을 미리 설치한 상태여야 합니다. 자세한 내용은 에디터 자동화 및 스크립트 작성NEW! 문서를 참고하세요.

UV 채널을 관리해야 하는 노드는 Editor Scripting > Static Mesh (에디터 스크립팅 > 스태틱 메시) 카테고리에서 찾을 수 있습니다.

이 노드를 사용하려면, PlacedEditorUtilityBase 와 같은 에디터 전용 클래스에서 파생한 블루프린트 클래스여야 합니다. 자세한 내용은 블루프린트를 사용한 에디터 스크립팅NEW! 문서를 참고하세요.

이 모든 함수는 스태틱 메시에 사용할 수 있는데, 이 메시는 일반적으로 Editor Scripting > Asset Library > Load Asset (에디터 스크립팅 > 애셋 라이브러리 > 애셋 로드) 노드를 호출해서 로트해야 합니다.

UV 채널을 수정하면 애셋이 수정됩니다. 변경사항을 유지하려는 경우, 나중에 Editor Scripting > Asset Library > Save Asset (에디터 스크립팅 > 애셋 라이브러리 > 애셋 저장) 또는 Save Loaded Asset (로드된 애셋 저장)같은 노드도 사용해야 합니다. 아래 예를 참고하세요.

UV 채널 나열

Get Num UV Channels (UV 채널 수 얻기) 노드를 사용하면 주어진 스태틱 메시 애셋에 현재 얼마나 많은 UV 채널이 있는지 확인할 수 있습니다.

예:

UV 채널 제거

각 UV 채널은 각 버텍스에 대한 텍스처 좌표를 스태틱 메시의 일부로 저장하므로, 사용하지 않는 매핑을 제거하여 런타임 메모리를 조금 절약할 수 있습니다.

UV 채널을 제거하려면, Remove UV Channel (UV 채널 제거) 노드를 사용합니다. 제거하려는 스태틱 메시 애셋과 UV 채널 인덱스를 전달하면 됩니다.

예:

목록에서 지정한 채널 뒤에 이미 있던 다른 모든 UV 채널은 한 지점 위로 이동시켜, 항목 제거로 생긴 빈 공간을 채웁니다.

스태틱 메시 애셋이 라이트맵 UV를 생성하도록 구성되어 있고, 선택한 UV 채널이 이미 라이트맵 UV에 대한 소스 또는 대상 채널로 사용 중인 경우, UV 채널을 삭제할 수 없습니다. 빌드 세팅 > Generate Lightmap UVs (라이트맵 UV 생성) 옵션을 끄거나, 빌드 세팅 > Source Lightmap Index (소스 라이트맵 인덱스)와 빌드 세팅 > Destination Lightmap Index (대상 라이트맵 인덱스) 세팅이 다른 UV 채널을 가리키도록 변경하세요.

새 UV 채널 추가

스태틱 메시 애셋에 새 UV 채널을 추가하려면 다음 노드 중 하나를 호출하면 됩니다.

  • Add UV Channel UV 채널 추가 - 기존 채널 목록 끝에 새 채널을 추가합니다.

  • Insert UV Channel UV 채널 삽입 - 지정한 인덱스에 새 채널을 추가하고, 다른 UV 채널은 목록에서 한 번호 아래로 이동합니다. UV 채널 배열은 중간이 비어있으면 안됩니다. 목록에서 기존 채널 옆의 위치에만 새 채널을 삽입할 수 있습니다. 예를 들어, 목록에 UV 채널이 셋 (인덱스 0, 1, 2) 있는 경우, 인덱스 3으로는 추가할 수 있지만 4로는 안됩니다.

새 매핑은 비어 있습니다. 어떻게든 채워야 사용할 수 있는데, 메시 지오메트리를 투영하거나 (아래 참고) 라이트맵을 생성할 대상으로 사용하면 됩니다.

UV 채널로 메시 지오메트리 투영

스태틱 메시의 트라이앵글을 2D 평면 또는 단순 3D 볼륨에 투영하여 UV 매핑을 새로 만들 수 있습니다.

이 기능은 현재 언리얼 에디터 스크립팅 API 에만 노출되어 있으며, 스태틱 메시 에디터 UI 에는 없습니다. 그러나 API 에 필요한 프로세스와 세팅은 3ds Max 등의 메시 투영 비주얼 툴에 익숙하다면 이해하기 쉽습니다. 배경 지식은 3ds Max Help 의 UVW Map Modifier 를 참고하세요.

아래 설명한 각 노드는 생성하는 UV 매핑을 지정한 UV 채널에 저장합니다. 이 UV 채널은 이미 존재해야 하며, 존재하지 않으면 함수가 이를 생성하지 않습니다.

평면 투영

Generate Planar UV Channel (평면 UV 채널 생성) 노드를 사용하여 스태틱 메시 지오메트리를 평면에 투영합니다. 이런 투영법은 스태틱 메시의 한 면만 텍스처를 둘러쌀 필요가 있을 때 사용합니다.

예:

원기둥 투영

Generate Cylindrical UV Channel (원기둥 UV 채널 생성) 노드를 사용하여 스태틱 메시 지오메트리를 원기둥 위아래 면에 투영합니다.

예:

박스 투영

Generate Box UV Channel (박스 UV 채널 생성) 노드를 사용하여 스태틱 메시 지오메트리를 큐브의 면들에 투영합니다.

예를 들어, 다음 스크립트는 스태틱 메시와 거의 같은 크기의 박스를 생성한 다음, 스태틱 메시의 지오메트리를 그 박스의 면들에 투영하여 UV 매핑을 새로 생성합니다.

LOD 관리 함수는 unreal.EditorStaticMeshLibrary 클래스에서 찾을 수 있습니다.

이 함수 모두 스태틱 메시 에셋에 사용할 수 있으며, 일반적으로 이 애셋은 unreal.EditorAssetLibrary.load_asset 같은 함수를 호출해서 로드해야 합니다.

UV 채널을 수정하면 애셋이 수정됩니다. 변경사항을 유지한다 가정하면, 나중에 unreal.EditorAssetLibrary.save_asset() 또는 unreal.EditorAssetLibrary.save_loaded_asset() 같은 함수를 사용해야 합니다.

UV 채널 나열

unreal.EditorStaticMeshLibrary.get_num_uv_channels 함수를 사용하면 주어진 스태틱 메시 애셋에 현재 얼마나 많은 UV 채널이 있는지 확인할 수 있습니다.

예:

import unreal
asset_name = '/Game/Path/MyStaticMeshAsset'
# 스태틱 메시 애셋을 로드합니다.
loaded_asset = unreal.EditorAssetLibrary.load_asset(asset_name)
# 애셋에 저장된 UV 채널 수를 구합니다.
num_uv_channels = unreal.EditorStaticMeshLibrary.get_num_uv_channels(asset_name)
print("Number of UV channels: " + str(num_uv_channels))

UV 채널 제거

각 UV 채널은 각 버텍스에 대한 텍스처 좌표를 스태틱 메시의 일부로 저장하므로, 사용하지 않는 매핑을 제거하여 런타임 메모리를 조금 절약할 수 있습니다.

UV 채널을 제거하려면, unreal.EditorStaticMeshLibrary.remove_uv_channel 함수를 호출합니다. 제거하려는 스태틱 메시 애셋과 UV 채널 인덱스를 전달하면 됩니다.

예:

import unreal
asset_name = '/Game/Path/MyStaticMeshAsset'
# 스태틱 메시 애셋을 로드합니다.
loaded_asset = unreal.EditorAssetLibrary.load_asset(asset_name)
# 애셋에 저장된 UV 채널 수를 구합니다.
num_uv_channels = unreal.EditorStaticMeshLibrary.get_num_uv_channels(asset_name)
# 목록의 마지막을 제거합니다.
channel_to_remove = num_uv_channels - 1
unreal.EditorStaticMeshLibrary.remove_uv_channel(asset_name, channel_to_remove)
# 수정한 애셋을 저장합니다.
unreal.EditorAssetLibrary.save_asset(asset_name)

목록에서 지정한 채널 뒤에 이미 있던 다른 모든 UV 채널은 한 지점 위로 이동시켜, 항목 제거로 생긴 빈 공간을 채웁니다.

스태틱 메시 애셋이 라이트맵 UV를 생성하도록 구성되어 있고, 선택한 UV 채널이 이미 라이트맵 UV에 대한 소스 또는 대상 채널로 사용 중인 경우, UV 채널을 삭제할 수 없습니다. 빌드 세팅 > Generate Lightmap UVs (라이트맵 UV 생성) 옵션을 끄거나, 빌드 세팅 > Source Lightmap Index (소스 라이트맵 인덱스)와 빌드 세팅 > Destination Lightmap Index (대상 라이트맵 인덱스) 세팅이 다른 UV 채널을 가리키도록 변경하세요.

새 UV 채널 추가

스태틱 메시 애셋에 새 UV 채널을 추가하려면 다음 함수 중 하나를 호출하면 됩니다.

  • unreal.EditorStaticMeshLibrary.add_uv_channel - 기존 채널 목록 끝에 새 채널을 추가합니다.

  • unreal.EditorStaticMeshLibrary.insert_uv_channel - 지정한 인덱스에 새 채널을 추가하고, 다른 UV 채널은 목록에서 한 번호 아래로 이동합니다. UV 채널 배열은 중간이 비어있으면 안됩니다. 목록에서 기존 채널 옆의 위치에만 새 채널을 삽입할 수 있습니다. 예를 들어, 목록에 UV 채널이 셋 (인덱스 0, 1, 2) 있는 경우, 인덱스 3으로는 추가할 수 있지만 4로는 안됩니다.

예:

import unreal
asset_name = '/Game/Path/MyStaticMeshAsset'
# 스태틱 메시 애셋을 로드합니다.
loaded_asset = unreal.EditorAssetLibrary.load_asset(asset_name)
# 애셋에 저장된 UV 채널 수를 구합니다.
num_uv_channels = unreal.EditorStaticMeshLibrary.get_num_uv_channels(asset_name)
print("Number of UV channels before: " + str(num_uv_channels))
*   목록 끝에 추가합니다.
unreal.EditorStaticMeshLibrary.add_uv_channel(asset_name)
# Add one at the beginning of the list.
unreal.EditorStaticMeshLibrary.insert_uv_channel(asset_name, 0)
# 애셋에 저장된 UV 채널 수를 구합니다.
num_uv_channels = unreal.EditorStaticMeshLibrary.get_num_uv_channels(asset_name)
print("Number of UV channels after: " + str(num_uv_channels))
# 수정한 애셋을 저장합니다.
unreal.EditorAssetLibrary.save_asset(asset_name)

새 매핑은 비어 있습니다. 어떻게든 채워야 사용할 수 있는데, 메시 지오메트리를 투영하거나 (아래 참고) 라이트맵을 생성할 대상으로 사용하면 됩니다.

UV 채널로 메시 지오메트리 투영

스태틱 메시의 트라이앵글을 2D 평면 또는 단순 3D 볼륨에 투영하여 UV 매핑을 새로 만들 수 있습니다.

이 기능은 현재 언리얼 에디터 스크립팅 API 에만 노출되어 있으며, 스태틱 메시 에디터 UI 에는 없습니다. 그러나 API 에 필요한 프로세스와 세팅은 3ds Max 등의 메시 투영 비주얼 툴에 익숙하다면 이해하기 쉽습니다. 배경 지식은 3ds Max Help 의 UVW Map Modifier 를 참고하세요.

아래 설명한 각 함수는 생성하는 UV 매핑을 지정한 UV 채널에 저장합니다. 이 UV 채널은 이미 존재해야 하며, 존재하지 않으면 함수가 이를 생성하지 않습니다.

평면 투영

unreal.EditorStaticMeshLibrary.generate_planar_uv_channel 함수를 사용하여 스태틱 메시 지오메트리를 평면에 투영합니다. 이런 투영법은 스태틱 메시의 한 면만 텍스처를 둘러쌀 필요가 있을 때 사용합니다.

예:

import unreal
asset_name = '/Game/Path/MyStaticMeshAsset'
# 스태틱 메시 애셋을 로드합니다.
loaded_asset = unreal.EditorAssetLibrary.load_asset(asset_name)
# 투영할 LOD 를 지정합니다.
lod_index = 0
# 투영에 대한 새 UV 채널을 추가합니다.
num_uv_channels = unreal.EditorStaticMeshLibrary.get_num_uv_channels(asset_name)
unreal.EditorStaticMeshLibrary.add_uv_channel(asset_name)
channel_index = num_uv_channels
# 투영면, 또는 "기즈모"를 구성합니다.
bbox = loaded_asset.get_bounding_box()
gizmo_pos = ((bbox.min + bbox.max) * 0.5)   # 오브젝트의 바운딩 박스 가운데를 찾습니다.
# Set the rotation angles in degrees.
pitch = 0   # Around the X axis
yaw = 0     # Around the Y axis
roll = 0    # Around the Z axis
gizmo_orientation = unreal.Rotator(pitch, yaw, roll)
# 값을 높이거나 낮춰 투영을 더 크게 또는 작게 만듭니다.
tiling = unreal.Vector2D(1, 1)
# 스태틱 메시 지오메트리를 UV 채널에 투영합니다.
unreal.EditorStaticMeshLibrary.generate_planar_uv_channel(loaded_asset, lod_index, channel_index, gizmo_pos, gizmo_orientation, tiling)
# 수정한 애셋을 저장합니다.
unreal.EditorAssetLibrary.save_asset(asset_name)

원기둥 투영

unreal.EditorStaticMeshLibrary.generate_cylindrical_uv_channel 함수를 사용하여 스태틱 메시 지오메트리를 원기둥 위아래 면에 투영합니다.

예:

import unreal
asset_name = '/Game/Path/MyStaticMeshAsset'
# 스태틱 메시 애셋을 로드합니다.
loaded_asset = unreal.EditorAssetLibrary.load_asset(asset_name)
# 투영할 LOD 를 지정합니다.
lod_index = 0
# 투영에 대한 새 UV 채널을 추가합니다.
num_uv_channels = unreal.EditorStaticMeshLibrary.get_num_uv_channels(asset_name)
unreal.EditorStaticMeshLibrary.add_uv_channel(asset_name)
channel_index = num_uv_channels
# 투영 원기둥, 또는 "기즈모"를 구성합니다.
bbox = loaded_asset.get_bounding_box()
gizmo_pos = ((bbox.min + bbox.max) * 0.5)   # Find the center of the object's bounding box.
# 회전 각도를 도 단위로 설정합니다.
pitch = 0   # Around the X axis
yaw = 0     # Around the Y axis
roll = 0    # Around the Z axis
gizmo_orientation = unreal.Rotator(pitch, yaw, roll)
# 값을 높이거나 낮춰 투영을 더 크게 또는 작게 만듭니다.
tiling = unreal.Vector2D(1, 1)
# 스태틱 메시 지오메트리를 UV 채널에 투영합니다.
unreal.EditorStaticMeshLibrary.generate_cylindrical_uv_channel(teapot, lod_index, channel_index, gizmo_pos, gizmo_orientation, tiling)
# 수정한 애셋을 저장합니다.
unreal.EditorAssetLibrary.save_asset(asset_name)

박스 투영

unreal.EditorStaticMeshLibrary.generate_box_uv_channel 함수를 사용하여 스태틱 메시 지오메트리를 원기둥 위아래 면에 투영합니다.

예를 들어, 다음 스크립트는 스태틱 메시와 거의 같은 크기의 박스를 생성한 다음, 스태틱 메시의 지오메트리를 그 박스의 면들에 투영하여 UV 매핑을 새로 생성합니다.

import unreal
asset_name = '/Game/Path/MyStaticMeshAsset'
# 스태틱 메시 애셋을 로드합니다.
loaded_asset = unreal.EditorAssetLibrary.load_asset(asset_name)
# 투영할 LOD 를 지정합니다.
lod_index = 0
# 투영에 대한 새 UV 채널을 추가합니다.
num_uv_channels = unreal.EditorStaticMeshLibrary.get_num_uv_channels(asset_name)
unreal.EditorStaticMeshLibrary.add_uv_channel(asset_name)
channel_index = num_uv_channels
# 투영 볼륨, 또는 "기즈모"를 구성합니다.
bbox = loaded_asset.get_bounding_box()
gizmo_pos = ((bbox.min + bbox.max) * 0.5)   # Find the center of the object's bounding box.
# 회전 각도를 도 단위로 설정합니다.
pitch = 0   # Around the X axis
yaw = 0     # Around the Y axis
roll = 0    # Around the Z axis
gizmo_orientation = unreal.Rotator(pitch, yaw, roll)
# 박스 크기를 구합니다.
gizmo_size = bbox.max - bbox.min
# 스태틱 메시 지오메트리를 UV 채널에 투영합니다.
unreal.EditorStaticMeshLibrary.generate_box_uv_channel(box, channel_index, lod_index, gizmo_pos, gizmo_orientation, gizmo_size)
# 수정한 애셋을 저장합니다.
unreal.EditorAssetLibrary.save_asset(asset_name)