Geometry Script 플러그인 설치

GeneratedDynamicMeshActor 상속하는 블루프린트 생성

 

박스 생성하기

Event On Rebuild Generated Mesh 노드에 Append Box 노드 연결

블루프린트 변수를 사용하여 Dynamic Mesh Object의 속성을 노출시켜 뷰포트에서 박스의 크기를 확인하며 변경할 수 있다.

 

Bake to Static Mesh

방법 1. Modeling Mode > Dynamic Mesh 선택 > Convert 

 

방법 2. 블루프린트에 함수 추가, Call In Editor 세팅 > Get Dynamic Mesh 노드와 Copy Mesh to Static Mesh Node 연결, Static Mesh 프로퍼티 추가하고 Copy Mesh 노드에 연결 

에디터에서 다이나믹 메시를 수정하고 Default 세팅에서 [함수 이름] 버튼을 눌러 스태틱 메시로 저장할 수 있다.

 

Displacement Map

Procedural displacement mesh Object 만들기

 

 

Frozen 프로퍼티를 사용하는 이유는 Normal Recompute 연산이 꽤 복잡하기 때문에 해당 Frozen 값을 False인 상태에서 메시를 월드에서 움직이면 에디터에서 느리게 동작한다.

 

액터의 Reset On Rebuild 프로퍼티의 기본값이 True여서 Frozen 을 True로 설정할 때 메시가 보이지 않을 수 있기 때문에  false로 설정해주자.

Frozen을 에디터에서 True로 설정하고 메시를 움직이면 에디터에서 빠르게 응답한다.

 

 

테셀레이션 적용 후 Displace Texture 맵을 다이나믹 메시에 적용한다.

Normal 계산은 자동으로 되는 것이 아니라서 ReCompute Normals 노드를 마지막에 배치해주어야 한다.

 

Mesh Booleans and Patterns

 

Allocate Compute Mesh 노드 : 해당 블루프린트에서 임시로 메시를 사용한다. Pool에 Request하여 얻어온다. Release 해주어야 한다.

 

Spehere 메시를 하나 할당하고, Append Mesh Repeated를 사용해 구체 4개짜리 메시를 또 할당한다.

 

메시 Boolean Subtract 연산을 사용해 Cube의 가장자리를 Sphere 메시 4개로 깎았다.

 

 

Y-to-Z-Up and Edit Pivot with an Asset Action

Unreal은 Z축이 Up벡터이기 때문에 Y축이 Up벡터인 프로그램에서 임포트한 애셋은 변형해줘야 한다.

 

Editor Utilities > Editor Utility Blueprint > Asset Action Utility

 

Get Supported Class 함수 오버라이드

Return Node 클래스를 Static Mesh로 설정 : 스태틱 메시 액터에 대해서만 액션을 지원하겠다는 의미

 

블루프린트 함수를 생성

선택한 모든 애셋에 대해 Static Mesh로 캐스팅 후 다이나믹 메시를 새로 생성

다이나믹 메시에 Static Mesh 복사 후 다이나믹 메시에 Transform Mesh 노드를 거치게 하여 회전시키고 다시 Dynamic Mesh를 기존 Static Mesh에 복사

 

Content Browser에서 선택한 Static 메시를 우클릭 > Scripted Asset Actions > 함수

메시의 피벗이 메시 중앙에 오는 현상을 해결하기

피벗을 메시의 Bounding Box 가장 낮은 부분 (z축) 으로 옮긴다.

 

Assigning Materials to Mesh Areas

 

Remap material IDs 노드 : 타겟 메시의 머터리얼 ID를 바꿔준다.

새로운 메시의 머터리얼 ID를 0에서 1로 리매핑 해주고 Append Mesh 노드를 통해 다른 메시에 붙여주는 경우 합쳐진 메시는 0과 1 두 개의 머터리얼 ID를 갖게 된다. 

Configure Material Set 노드를 사용하면 머터리얼 배열을 메시에 붙여줄 수 있다.

 

Using a BVH to Sample a Mesh Surface with Ray Intersections

BVH : Bounding Volume Hierarchy

 

1. Nearest Point on Mesh with BVH

각각의 삼각형에 쿼리하는 것 보다 BVH를 사용하는 것이 훨씬 효율적이다.

Build BVH For Mesh 노드는 BVH를 생성한다. 계산은 한 번만 이뤄지도록 출력 값을 변수로 Promote 해준다.

 

메시에서 바운딩 박스를 얻고 바운딩 박스에서 박스 사이즈와 박스 중심 위치를 추출하여 Ranfom Point in bounding Box from Stream 의 입력으로 보낸다.

 

이 노드를 루프시켜 랜덤 포인트를 Find Nearest Point On Mesh 노드의 입력으로 넣는다.

 

Append Box노드가 실행되는 순간 BVH 싱크가 깨진다. 아예 새로운 메시가 되어버리기 때문이다. 이런 방식으로 진행하면Add 할때 마다 BVH를 다시 빌드해주는 노드가 추가되어야 한다. 이는 비싼 연산으로 이어진다. 또한 추가되는 메시들이 서로 쌓일 수가 있다.

 

Find Nearest Point On Mesh 노드의 Nearest Result 를 Split 하면 가장 가까운 Point 뿐만 아니라 가장 가까운 삼각형의 ID를 얻을 수 있다.

Target Mesh의 Get Triangle Normal 노드에 삼각형 ID를 집어넣어 노말 벡터 값을 얻고, 이것을 Rotator로 변환한 후 붙이는 Box의 Rotation으로 설정하면 붙이는 박스가 표면에 정렬되게 만들 수 있다.

 

 

메시를 겹치게 하지 않으면서 연산의 수를 줄이는 방법으로는 Allocate Compute Mesh를 사용하여 다른 다이나믹 메시에 전부 Append Box 한 뒤에 한 번에 Append Mesh하는 방법이 있다.

 

2. BVH for Multiple Actor

액터 배열에서 메시를 얻기 - Single 메시로 모은다.

각각의 액터의 루트 컴포넌트에 대해 Copy Mesh From Component 노드를 실행시켜 Dynamic Mesh (Allocated Compute Mesh)에 옮기고, RayCast Mesh (Single 메시) 에 붙인다.

 

Copy Mesh From Component는 애셋이 아니라 레벨에 존재하는 컴포넌트를 대상으로 한다.

 

이번에는 Find Nearest Point on Mesh가 아닌 Find Nearest Ray Intersection with Mesh 노드를 사용한다.

 

 

3. BVH Caching for Huge Meshes

2번 로직을 새로운 World Cache 라는 이름의 블루프린트(Generated Dynamic Mesh)에 옮기고 OnRebuild Generated Mesh 이벤트에서 실행되지 않고 새로 만든 함수에서 실행되도록 한다. ( + Call In Editor 활성화 )

여기에서 BVH 빌드 연산이 진행되도록 한다.

 

Raycast 라는 이름의 블루프린트에 나머지 로직을 정리한다.

 

World Cache 블루프린트를 레벨에 배치 (투명함) 하고 새로 만든 함수를 에디터에서 실행하면 캐시가 생성된다. (보이지 않음)

 

배치하는 박스 수를 늘리고 줄이는 과정에서 더 좋은 퍼포먼스를 보인다. 메시를 다른 곳으로 이동시켰을 때 BVH 캐시를 갱신하지 않았다면 메시가 원래 위치하던 자리에 박스가 생긴다.

 

매우 큰 메시의 BVH를 만드는데는 몇 초가 소요될 정도이므로 큰 메시에는 이 방식이 효과적이다.

 

Convex Hull Blocking Volume Tool

 

레벨 안의 여러 액터를 선택하고 Editor Utility Widget의 기능을 실행시켜서 Convex Hull Blocking Volume을 생성

 

Editor Utilities > Editor Utility Widget

 

1. 선택한 액터들의 메시를 Combined 메시에 합쳐 놓는다.

2. 바운딩 박스에서 피벗 포인트 뽑아낸다.

3. Compute Mesh Convex Hull node로 Combined 메시의 Hull Mesh를 생성하는데 Transform Mesh 노드를 사용하여 Pivot 포인트로 조정한다.

 

4. Create Volume For Mesh 노드를 실행하여 월드에 볼륨을 추가한다.

 

5. 유틸리티 위젯에 디테일 뷰 변수를 추가하여 유틸리티 위젯에 노출시킨다.

 

'언리얼 5 > 에픽 게임즈 공식 강의' 카테고리의 다른 글

Programming 2  (0) 2023.02.21
Enhanced Input Binding with Gameplay Tags C++  (0) 2023.02.21
Engine Structure  (0) 2023.02.20
All about Soft and Weak pointer  (0) 2023.02.20
프로그래밍 시작하기  (0) 2023.02.19

+ Recent posts