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)