정교한 충돌 검사를 위한 Unreal Engine 엔진 커스텀
포스트
취소

정교한 충돌 검사를 위한 Unreal Engine 엔진 커스텀

개요

개발 환경에 앞서, 환경은 4.27.2 에서 진행하였고, 운영체제는 Windows 10이며, IDE는 Visual Studio 2022, SDK는 Windows 10 SDK(버전 10.0.18362.0) 로 진행하였다.

언리얼 엔진과 유니티 엔진은 주로 사용되는 게임 엔진 중 하나이다. 그 중, 유니티 엔진은 내부 소스코드가 공개가 되어 있지 않지만, 언리얼 엔진의 경우 모든 코드가 오픈소스로 공개가 되어 있다. 그렇기에 타 엔진에 비해 플러그인을 개발하거나, 엔진을 수정하는 것이 가능하다.

연구과제를 진행하면서, “충돌 알고리즘 개발 및 개선” 그리고 “시각화 프로그램” 개발 업무를 진행하면서, 언리얼 엔진과 유니티에 대한 성능적인 이슈와 문제점이 있어 직접 구현하였었다. 하지만, 언리얼 엔진의 코드를 수정하여 엔진 레벨에서 성능적인 이슈와 문제점을 개선한다면 어떻게 될지 궁금하였다.

그래서 언리얼 엔진에서 사용되는 충돌 감지/검사 알고리즘, 충돌 박스의 생성 알고리즘, 물리 엔진 알고리즘에 대해 공부가 필요하였고, 결과를 정리해 보았다.

UE4의 환경

UE4.27.2 기준으로 설명을 하자면, 물리엔진은 PhysX 4를 사용하고 있으며, 충돌 박스 생성 알고리즘은 VHACD 2.3 을 사용하고 있다.

[V-HACD 깃허브 주소]

  • 요약 : Voxelize와 Hierarchy 통한 형태 근사화 알고리즘

[PhysX 4 깃허브 주소]

  • NVIDIA에서 만든 유일한 GPU 가속이 되는 범용 물리엔진

충돌 검사 과정

유니티의 경우 코드가 공개가 되어 있지 않아, 따로 분석이 어렵기에, 언리얼 엔진을 기준으로 설명한다.

충돌 검사하기 위해 모든 물체간에 충돌 검사를 수행한다면, 시간이 엄청나게 소요가 될 것이고, 엔진 성능에 악 영향을 주게 된다. 특히, 실시간성이 중요한 게임에서 렌더링 시간이 아닌, 충돌 검사를 위해 많은 시간 할애가 어렵다. 그렇기에, 100 % 충돌이 발생하지 않는 경우에는 충돌 검사를 수행하지 않는 전처리가 필요하다.

그래서, 효율적인 충돌 검사하기 위해 2 단계로 충돌 검사를 수행하게 된다. 충돌 가능성에 대해 계산하는 Broad Phase와, 실제로 충돌 유무를 판단하는 Narrow Phase로 나눠져 있다.

Broad Phase 과정에서는 아래의 그림과 같이, 검사를 수행해야하는 충돌 객체가 많으면 많을수록 영역을 잘게 나눠 충돌 가능성을 계산한다. 그리고, 추후 Narrow Phase에서 실질적으로 SDF(Signed-Distance-Field, PhysX5에서 실험적으로 제공 됨.)나 GJK(Gilbert–Johnson–Keerthi) + EPA(Expanding Polytope Algorithm), SAT(Separating Axis Theorem) 등 다양한 충돌 검사 알고리즘을 이용하여 충돌 검사를 수행하게 된다.

언리얼 엔진 또한, 마찬가지로 위의 Broad Phase와 Narrow Phase 순으로 충돌 검사를 수행하게 되고, 충돌이 감지가 되었을 때 이벤트를 발행한다.

확실하지 않습니다!

따라서, Broad Phase 단계에서 충돌 검사 시, 충돌 감지가 된 경우, Overlap 이벤트를 발생하게 되고, Narrow Phase에서 충돌이 감지된 경우 Hit 이벤트를 발행하게 된다.

충돌 알고리즘 개선

개선하기 위해 Narrow Phase를 개선하는 것은 너무나도 어렵다. 그 이유는 과거 부터 연구가 되어 왔고, 성능 향상에 대한 한계가 왔기 때문이다. 그렇기에, CPU나 GPU 를 병렬적으로 연산을 수행하여 문제를 해결하는 연구 방향이 되어왔다.

마찬가지로 Broad Phase 또한, 혁신적인 성능 개선을 기대하는 것은 어렵지만, 간헐적으로 일부 최적화하는 연구가 되고 있기도 한다. 그렇다면 최근 연구에는 어떤 방향으로 진행이 되고 있는가? 그것은 Broad Phase와, Narrow Phase와 별개로, 충돌 박스를 생성하는 알고리즘을 개선하는 방향으로 진행되고 있다.

대표적으로 충돌박스를 생성하는 V-HACD는 2016년에 나온 기술을 개선하기 위해 2020년과 2022년에 발표하였고, Deep Mind에서 연구한 Monte Carlo Tree Seach 기반으로 형태 근사화하는 [CoACD]가 있다.

그 외에도, 2017년에 영상 처리 기법을 도입하여 형태 근사화를 수행하는 [Bounding proxies for shape approximation ] 도 있으며, FFT와 Voxelize를 이용하여 2D를 3D로 변환하는 연구도 있다. (컴퓨터 사이언스 분야라기 보다, 수학적인 분야이다…)

그렇다면, 외부에서 CoACD나, V-HACD 개선판을 사용하여 형태 근사화한 정보를 UE4에 삽입하여 충돌 검사를 수행한다면 결과가 어떻게 나올지 확인해 보았다.

결과적으로는 기존 UE4에 비해 더 정교하고, 기존 V-HACD에서 잘못된 충돌 박스 생성으로 인하여, 잘못된 충돌 감지가 발생하던 문제가 감소가 되었다.

그리고, 언리얼 엔진에서는 설정이 가능한 파라미터 값이 제한적이므로, 아무래도 외부에서 생성한 충돌 박스가 이점이 있다.

그렇다면, 언리얼 엔진에서 설정이 가능한 파라미터 값의 범위를 무한으로 설정하고, 외부가 아닌 내부에서 충돌 박스를 생성해 보고자 하였다.

언리얼 엔진 개선

우선적으로 커스텀이 가능한지 유무 확인 하기 위해 진행하였다. 기본적으로 언리얼 엔진에서 충돌 박스 생성하기 위해 “헐 개수”, “최대 헐 버텍스”, “정밀도”로 3가지 옵션이 주어진다. 각각의 값은 64, 32, 100000000 이란 최대값이 지정되어 있다. 하지만, 이런 최대 값 지정은 아름답지도 않고, 제한적인 요소로만 다가오게 된다.

우선, 아래의 사진으로 결과를 확인이 가능하다. 개선한 결과로는 충돌이 정상적으로 이뤄지고 있고, 커스텀 또한 된다는 것을 확인 할 수 있었다. 이제, 추가적으로 CoACD를 도입하거나, 다른, 알고리즘을 도입하여 언리얼 엔진에 대한 다양성과 개선을 수행할 예정이다.

기존커스텀

코드 변경한 위치

5월 4일에 관련 논문을 투고하고, 발표 세션이 진행이 될 예정/하였다. 학술 대회

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

안드로이드와 라즈베리파이에서 텐서플로우 연산 과정

자동 근태 확인을 위한 자동화 시스템 구축