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

블루프린트와 Python 에서 스태틱 메시로 콜리전 설정

언리얼 엔진

스태틱 메시가 레벨에서 물리 상호작용을 하기 위해서는, 예를 들어 다른 오브젝트에 걸리도록 하거나 실행시간에 하이 퍼포먼스 콜리전 테스트를 사용하여 존재를 감지하고자 하는 경우, Collision Mesh (콜리전 메시)로 스태틱 메시 설정을 해야 합니다. 콜리전 메시란 피직스 시뮬레이션 내 스태틱 메시 오브젝트의 경계를 나타냅니다. 스태틱 메시의 보이는 지오메트리를 사용할 수도 있지만, 보통 디테일이 너무 높습니다. 일반적으로 물리 상호작용은 그렇게 정확도가 높지 않아도 현실적인 결과를 낼 수 있으므로, 콜리전 메시를 가급적 단순하게 ㅏㄴ들어 피직스 시스템 퍼포먼스를 향상시킬 수 있습니다.

스태틱 메시 에디터에서 스태틱 메시의 단순화된 콜리전 표현을 자동으로 만들 수 있습니다.

이미지를 클릭하면 원본을 확인합니다.

자세한 내용은 스태틱 메시로 콜리전 설정 문서를 참고하세요.

경우에 따라 콜리전 메시 표현을 스태틱 메시 에디터에서 직접 만드는 대신 프로그래밍적으로 만들어야 할 수 있습니다. 예를 들어 같은 프로젝트의 스태틱 메시 오브젝트 다수를 설정해야 하는 경우, 하나씩 차례로 열기가 불가능할 수 있습니다. 아니면 콘텐츠를 임포트하고 관리하는 대규모 자동화 파이프라인의 한 단계로 콜리전 설정을 하고싶을 수도 있습니다.

다음 섹션에서는 블루프린트와 Python 로 언리얼 에디터에서 위에 표시한 콜리전 메시 여러 유형을 스태틱 메시 애셋에 자동 적용하는 방법을 설명합니다.

Editor Scripting Utilities (에디터 스크립팅 유틸리티) 플러그인을 설치하지 않은 경우 미리 설치해야 합니다. 자세한 내용은 에디터 자동화 및 스크립팅NEW! 문서를 참고하세요.

구현 방법을 선택하세요:

Blueprints

Python

스태틱 메시 콜리전 관리에 필요한 노드는 Editor Scripting > Static Mesh (에디터 > 스태틱 메시) 카테고리에서 찾을 수 있습니다.

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

콜리전을 설정하면 스태틱 메시 애셋이 수정됩니다. 변경사항을 유지한다 가정하면, 나중에 Save Asset 또는 Save Loaded Asset 같은 노드도 사용해야 합니다.

unreal.EditorStaticMeshLibrary 클래스에서 스태틱 메시 콜리전 관리에 필요한 함수 대부분을 찾을 수 있습니다.

LOD 를 설정하면 스태틱 메시 애셋이 수정됩니다. 변경사항을 유지한다 가정하면, 나중에 unreal.EditorAssetLibrary.save_asset() 또는 unreal.EditorAssetLibrary.save_loaded_asset() 과 같은 함수도 사용해야 합니다.

단순화 콜리전 모양 추가

스태틱 메시에 단순화 콜리전 모양을 새로 추가하려면 Add Simple Collisions 노드를 사용합니다. Shape Type 입력으로 추가하려는 콜리전 모양 유형을 제어합니다. 이 옵션은 스태틱 메시 에디터의 Collision (콜리전) 메뉴에서 사용할 수 있는 것과 동일합니다.

set_collisions_simple_bp.png

스태틱 메시에 단순화 콜리전 모양을 새로 추가하려면, unreal.EditorStaticMeshLibrary.add_simple_collisions() 함수를 사용합니다. 전달할 내용은 다음과 같습니다.

  • 수정하려는 unreal.StaticMesh 오브젝트입니다.

  • 생성하려는 콜리전 프리미티브 유형을 나타내는 unreal.ScriptingCollisionShapeType 열거형의 항목입니다. 이 옵션은 스태틱 메시 에디터의 Collision (콜리전) 메뉴에 있는 것과 일치합니다.

예:

import unreal
asset_path = "/Game/ArchVis/Mesh"
def add_box_collision (static_mesh):
    # 대신 사용할 수 있는 유형:SPHERE, .CAPSULE, .NDOP10_X, .NDOP10_Y, .NDOP10_Z, .NDOP18, .NDOP26
    shape_type = unreal.ScriptingCollisionShapeType.BOX
    unreal.EditorStaticMeshLibrary.add_simple_collisions(static_mesh, shape_type)
    unreal.EditorAssetLibrary.save_loaded_asset(static_mesh)
# 경로의 모든 애셋 목록을 구합니다.
all_assets = unreal.EditorAssetLibrary.list_assets(asset_path)
# 모두 메모리에 로드합니다.
all_assets_loaded = [unreal.EditorAssetLibrary.load_asset(a) for a in all_assets]
# 스태틱 메시만 포함하도록 목록에 필터를 적용합니다.
static_mesh_assets = unreal.EditorFilterLibrary.by_class(all_assets_loaded, unreal.StaticMesh)
# 목록의 스태틱 메시마다 위 함수를 실행합니다.
map(add_box_collision, static_mesh_assets)

참고로 스태틱 메시에 이미 다른 단순화 콜리전 모양이 있든 새로운 콜리전 모양을 추가합니다. 기존 콜리전 모양을 먼저 제거하려면 아래 모든 단순 콜리전 제거 부분을 참고하세요.

set_collisions_simple_result.png

컨벡스 콜리전 자동 생성

스태틱 메시의 보이는 지오메트리에서 컨벡스 콜리전 지오메트리를 자동 생성하려면 Set Convex Decomposition Collisions 노드를 사용하세요.

set_collisions_complex_bp.png

이 노드의 입력은 스태틱 메시 에디터 유저 인터페이스의 Collisions > Auto Convex Collisions (콜리전 > 자동 컨벡스 콜리전)을 선택했을 때 묻는 옵션과 똑같습니다. 생성된 콜리전 메시의 복잡도와 충실도를 제어합니다. 일반적으로 값이 클수록 콜리전 메시는 스태틱 메시의 보이는 지오메트리에 더 가까워지지만, 런타임 시뮬레이션에 더 많은 비용이 듭니다.

스태틱 메시의 보이는 지오메트리에서 컨벡스 콜리전 모양을 자동 생성하려면, unreal.EditorStaticMeshLibrary.set_convex_decomposition_collisions() 함수를 사용하세요. 전달할 내용은 다음과 같습니다.

  • 수정하려는 unreal.StaticMesh 오브젝트입니다.

  • 세 개의 정수로 최대 헐 수, 헐당 최대 버텍스 수, 헐 정밀도를 정의합니다. 이 파라미터는 스태틱 메시 에디터 유저 인터페이스에서 Collisions > Auto Convex Collisions (콜리전 > 자동 컨벡스 콜리전)을 선택하면 묻는 옵션과 똑같습니다. 생성된 콜리전 메시의 복잡도와 충실도를 제어합니다. 일반적으로 값이 클수록 콜리전 메시는 스태틱 메시의 보이는 지오메트리에 더 가까워지지만, 런타임 시뮬레이션에 더 많은 비용이 듭니다.

예:

import unreal
asset_path = "/Game/ArchVis/Mesh"
def set_convex_collision (static_mesh):
    unreal.EditorStaticMeshLibrary.set_convex_decomposition_collisions(static_mesh, 4, 12, 460000)
    unreal.EditorAssetLibrary.save_loaded_asset(static_mesh)
# 경로의 모든 애셋 목록을 구합니다.
all_assets = unreal.EditorAssetLibrary.list_assets(asset_path)# load them all into memory.
all_assets_loaded = [unreal.EditorAssetLibrary.load_asset(a) for a in all_assets]# 스태틱 메시만 포함하도록 목록에 필터를 적용합니다.
static_mesh_assets = unreal.EditorFilterLibrary.by_class(all_assets_loaded, unreal.StaticMesh)# 목록의 스태틱 메시마다 위 함수를 실행합니다.
map(set_convex_collision, static_mesh_assets)

기존 콜리전 메시는 전부 스태틱 메시에서 자동 제거한 뒤 새 메시를 생성합니다.

참고로 이 방법은 단순화 콜리전 프리미티브를 사용하는 것보다 예측하기 힘들고 불규칙적인 결과를 내는 경향이 있습니다. 불규칙적인 메시나, 생성 세팅을 눈으로 보고 조정하면서 스태틱 메시의 보이는 지오메트리에 잘 맞는 단순한 결과를 낼 수 있는 경우 사용하는 것이 가장 좋습니다.

set_collisions_convex_result.png

모든 단순 콜리전 제거

Remove Collisions 노드를 사용하여 스태틱 메시에 할당된 모든 콜리전 메시를 지울 수 있습니다.

set_collisions_remove_bp.png

그렇게 하면 "단순" 피직스 콜리전 테스트에서는 메시를 찾을 수 없지만, 스태틱 메시의 보이는 지오메트리를 고려하는 "디테일" 데스트에서는 찾을 수 있습니다. 단순 vs 복합 콜리전 문서를 참고하세요.

unreal.EditorStaticMeshLibrary.remove_collisions() 함수를 사용하여 스태틱 메시에 할당된 모든 콜리전 메시를 지울 수 있습니다.

예:

import unreal
asset_path = "/Game/ArchVis/Mesh"
def remove_collisions (static_mesh):
    unreal.EditorStaticMeshLibrary.remove_collisions(static_mesh)
    unreal.EditorAssetLibrary.save_loaded_asset(static_mesh)
# 경로의 모든 애셋 목록을 구합니다.
all_assets = unreal.EditorAssetLibrary.list_assets(asset_path)# load them all into memory.
all_assets_loaded = [unreal.EditorAssetLibrary.load_asset(a) for a in all_assets]# 스태틱 메시만 포함하도록 목록에 필터를 적용합니다.
static_mesh_assets = unreal.EditorFilterLibrary.by_class(all_assets_loaded, unreal.# 목록의 스태틱 메시마다 위 함수를 실행합니다.# 목록의 스태틱 메시마다 위 함수를 실행합니다.
map(remove_collision, static_mesh_assets)

이후 "단순" 피직스 콜리전 테스트에서는 메시를 찾을 수 없지만, 스태틱 메시의 보이는 지오메트리를 고려하는 "디테일" 데스트에서는 찾을 수 있습니다. 단순 vs 복합 콜리전 문서도 참고하세요.

콜리전에 LOD 사용

스태틱 메시에 이미 레벨 오브 디테일 (LOD) 설정을 한 경우, 콜리전 메시로 낮은 디테일의 LOD 중 하나를 사용할 수 있습니다.

unreal.StaticMesh 오브젝트에서 set_editor_property() 를 호출하고 lod_for_collision 프로퍼티를 사용하려는 LOD 인덱스로 설정합니다. 예:

import unreal
asset_path = "/Game/ArchVis/Mesh"
def use_lod_for_collisions (static_mesh):
    static_mesh.set_editor_property("lod_for_collision", 3)
    unreal.EditorAssetLibrary.save_loaded_asset(static_mesh)
# 경로의 모든 애셋 목록을 구합니다.
all_assets = unreal.EditorAssetLibrary.list_assets(asset_path)
# 모두 메모리에 로드합니다.
all_assets_loaded = [unreal.EditorAssetLibrary.load_asset(a) for a in all_assets]
# 스태틱 메시만 포함하도록 목록에 필터를 적용합니다.
static_mesh_assets = unreal.EditorFilterLibrary.by_class(all_assets_loaded, unreal.StaticMesh)
# 목록의 스태틱 메시마다 위 함수를 실행합니다.
map(use_lod_for_collision, static_mesh_assets)

LOD 콜리전 설정 방법 문서도 참고하세요.

아직 블루프린트 또는 Python 으로 커스텀 콜리전 메시를 설정할 수는 없습니다. 커스텀 메시를 임포트하여 물리 시뮬레이션에서 스태틱 메시의 콜리전 메시에 사용하는 방법은 다음 둘 중 하나입니다.

  • 스태틱 메시 에디터 유저 인터페이스를 사용하여 지원하는 파일 포맷에서 콜리전 메시를 임포트합니다.

  • 보이는 스태틱 메시와 동시에 충돌 테스트에 사용할 지오메트리를 나타내는 특수 명명 규칙을 사용하여 콜리전 메시를 임포트합니다. 자세한 내용은 FBX 스태틱 메시 파이프라인 문서를 참고하세요..