POSTECHIAN 기사 보기

[2021 가을호] 1-가상 세계 구축을 위한 도구, 게임 엔진

  • 박정은
  • 2021-10-29 07:00:36

2021 AUTUMN 기획특집 1

가상 세계 구축을 위한 도구, 게임 엔진

Metaverse, New Paradigm of the Virtual World


코로나19의 확산으로 인해 많은 대면 행사가 취소되고 있는 지금, 바이러스로부터 자유로운 공간이 있다는 것 알고 계신가요?
바로 ‘메타버스’입니다.
최근 사람들은 메타버스에서 사회적 거리두기 걱정 없이 사회 · 경제 · 문화 활동을 하고 있습니다.
메타버스(Metaverse)는 초월이라는 뜻을 가진 ‘메타(Meta)'와 세계를 의미하는 ‘유니버스(Universe)’의 합성어로, 현실과 연결된 가상 공간을 뜻합니다.
다양한 기술의 융합체인 메타버스가 사람들의 일상에 더 깊숙이 파고들기 위해서는
생생한 가상 공간을 구현하는 게임 엔진 기술, 고용량 데이터를 빠르게 전송할 수 있는 네트워크 기술,
현실과 가상의 구분이 불가능하게 만드는 인터페이스 기술이 발전되어야 하는데요.
이번 기획특집에는 이러한 메타버스를 위한 기술들에 대한 내용을 담았습니다!



메타버스, 가상 세계의 새로운 패러다임
여러분은 네이버의 자회사인 SNOW에서 출시한 3D 아바타 플랫폼, 제페토(ZEPETO)[링크-제페토 스튜디오 홈페이지]를 들어보았나요?
제페토는 메타버스를 효과적으로 활용하는 플랫폼으로, 사람들은 제페토를 통해 자신의 아바타를 만들고,
마치 현실처럼 구현된 가상 공간에서 시공간의 제약 없이 다양한 활동을 할 수 있습니다.
명품 브랜드들이 가상 공간에 입점하여 신제품을 공개할 뿐만 아니라 코로나19로 인해 불가능했던 유명 K-POP 가수들의 팬 미팅, 콘서트가 가상 공간에서 이루어지는 등[링크-제페토에 입점한 명품 브랜드], 현실에서만 이루어지던 일들이 메타버스로 확장되어 나가고 있습니다.
이렇게 사람들이 메타버스에 몰입하는 것을 돕는 그래픽을 구현하는 데에는 ‘게임 엔진’이 이용되는데요.
그럼 게임 엔진이 무엇인지, 게임 엔진 중에서도 어떤 요소가 중요한 역할을 하는지 함께 알아볼까요?

게임 엔진이란?

게임 엔진은 그래픽 엔진, 오디오 엔진, 물리 엔진, UI 시스템 등 게임을 개발하는 데에 필요한 기능을 구현하는 요소를 모아 놓은 소프트웨어입니다. 이름에서 알 수 있듯이 게임 엔진은 원래 게임 개발을 목적으로 만들어졌지만 최근에는 게임 분야뿐만 아니라 건축, 자동차 등 다양한 산업에서 활용되고 있습니다. 이는 게임 엔진을 통해 가상 공간을 만들고 현실에서 일어나는 일을 그곳에서 구현할 수 있다는 점 때문입니다. 게임 엔진은 아래의 도식과 같이 게임 시작, 게임 루프, 게임 종료의 과정으로 작동하는데, 이때 게임 루프가 핵심 역할을 수행합니다.


게임 엔진의 작동 과정


게임 엔진의 역사와 종류가 궁금하다면 아래의 버튼을 클릭하세요!

게임 엔진 더 알아보기


게임 루프는 게임을 실행하는 동안 계속해서 돌아가며 게임의 상태를 갱신Update한 뒤 갱신된 정보를 화면에 표현Render하고, 게임을 이용하는 사람의 입력이 있다면 이를 처리하는 과정입니다. 게임 루프는 더 세분화 될 수 있는데, 갱신과 표현 과정 사이에 게임 속 물체에 물리 법칙을 적용하는 과정을 거치면 물체의 움직임을 더욱 사실적으로 표현할 수 있습니다. 이때, 정보를 화면에 표현하는 역할을 렌더링 엔진Rendering Engine이 수행하고, 물리 법칙을 적용하고 이에 따라 물체들이 충돌하는지를 확인하는 역할을 물리 엔진Physics Engine이 수행합니다.


세분된 게임 루프 과정

그럼 렌더링 엔진과 물리 엔진에 대해 더 자세히 살펴봅시다!

입체적인 그래픽을 만드는 렌더링 엔진

먼저 렌더링 엔진은 그래픽 엔진이라고도 불리는데, 이는 3D 그래픽을 2D 화면에 구현합니다. 쉽게 말해, 사람들이 2차원인 평면에 나타낸 이미지를 3차원처럼 인식하게끔 하는 것입니다. 이러한 렌더링 엔진은 크게 적용Application, 기하Geometry, 래스터화Rasterization의 3단계로 이루어집니다.


렌더링 엔진의 작동 과정

첫 단계인 적용의 단계에서 평면에 나타낼 3D 모델을 로딩하는데, 이때 3차원 물체의 정점Vertex을 읽어 옵니다. 여기서 정점이란 3D 그래픽스에서 공간상의 위치를 나타내는 점으로, 정점을 이용하여 점, 선, 삼각형 등과 같은 기본 도형을 이룹니다. 그리고 두 번째인 기하 과정을 통해서는 3차원에 나타나 있는 물체를 2차원으로 옮깁니다. 이 과정에서 정점 쉐이더Vertex Shader를 이용해 3D 모델을 구성하는 정점을 화면상 좌표로 나타내는 정점 쉐이딩Vertex Shading, 물체를 바라보는 시각을 정한 뒤 이에 따라 원근감이 드러나도록 물체의 모습을 나타내는 투영Projection, 시각을 설정함에 따라 화면에 보이지 않게 되는 정보를 잘라내는 클리핑Clipping, 물체에 색이나 물체의 재질을 입히는 맵핑Mapping이 이루어집니다. 마지막으로 래스터화는 2차원 이미지를 보여주는 단계로, 기하의 단계에서 얻은 픽셀 좌표를 이미지로 변환하여 사람들이 결과물을 볼 수 있도록 합니다.

이러한 렌더링이 이루어지는 방법에는 두 가지가 있는데요. 바로 비실시간 렌더링Offline Rendering실시간 렌더링Real-Time Rendering입니다. 먼저 비실시간 렌더링의 경우에는 필요한 모든 연산을 미리 수행하기 때문에 사용자의 입력을 실시간으로 반영할 수는 없지만, 현실과 구분이 불가능할 정도로 높은 퀄리티의 그래픽을 구현할 수 있습니다. 이는 디즈니나 픽사에서 제작하는 3D 애니메이션과 같은 고품질 영상을 만드는 데에 주로 이용되죠. 이와 달리 실시간 렌더링은 비실시간 렌더링에 비해 다소 품질이 낮은 영상을 빠르게 생성함으로써 사용자와 계속해서 상호 작용을 할 수 있도록 하는 방법입니다. 사용자가 입력을 수정하는 즉시 그래픽을 확인할 수 있다는 장점 덕분에 최근 개발되는 메타버스 플랫폼에 활발하게 활용되고 있습니다. 동영상은 렌더링을 통해 얻은 여러 개의 연속된 장면들, 즉 여러 개의 프레임이 빠르게 넘어가는 과정을 통해 화면에 보이는데요. 실시간 렌더링과 비실시간 렌더링은 동영상을 구성하는 프레임 하나하나를 사실감 넘치게 만들기 위해 얼마나 공을 들이는지에 차이가 있다고 할 수 있습니다. 최근에는 그래픽 카드와 렌더링 엔진으로 사실적인 그래픽을 빠르게 구현하는 기술이 날이 갈수록 발전하면서 두 렌더링 방법 간의 경계가 점점 희미해지고 있습니다.

사실적인 움직임을 구현하는 물리 엔진

렌더링 엔진을 통해 2차원 화면에서 3차원적 영상을 볼 수 있게 됨에 따라 사람들은 더 높은 몰입도를 위해 화면 속 물체의 움직임 또한 실제처럼 이루어지기를 원했습니다. 이에 따라 현실 세계에서 일어나는 물리적 상호 작용을 게임 내에서 표현하기 위해 개발된 소프트웨어가 바로 물리 엔진입니다. 물체의 종류에는 강체Rigid Body, 연체Soft Body, 유체Fluid가 있는데, 각각을 구현하는 시뮬레이션은 연산을 진행하는 수식의 종류와 복잡도에 차이가 있습니다. 그중 물리 엔진에서 대표적으로 구현되는 강체 시뮬레이션에 대해 알아봅시다!

강체 시뮬레이션은 관절체나 포탄 등 형태가 변하지 않는 물체의 운동을 주로 구현합니다. 강체는 외력, 또는 다른 물체와의 충돌에 의해 움직일 수 있습니다. 먼저, 외력에 의해 움직이는 경우를 생각해 봅시다. 외력에 의해서는 물체가 병진 운동Translational Motion회전 운동Rotational Motion을 하게 됩니다. 병진 운동의 경우에는 강체의 모든 부분이 평행하게 한 방향으로 움직이기 때문에 시간에 따라 물체의 위치가 달라집니다. 이때, 물체의 위치($\vec{x}$)를 시간($t$)에 대해 미분하면 속도($\vec{v}$)를 얻을 수 있고, 이를 다시 미분하면 가속도($\vec{a}$)를 얻을 수 있는데, 뉴턴 운동 법칙 중 제 2법칙인 가속도 법칙($\vec{F}=m\vec{a}$)을 이용하면 물체에 가해지는 힘에 따른 가속도를 알 수 있습니다. 따라서 외력의 세기를 알면 물체의 가속도를 알 수 있고 이에 따라 물체의 이동 거리를 계산하여 나타낼 수 있습니다. 이 과정에서 사용되는 식들은 아래와 같이 나타낼 수 있습니다.

$$\vec{v}=\lim_{\Delta t\to 0}\frac{\Delta \vec{x}}{\Delta t}=\frac{d\vec{x}}{dt}$$ $$\vec{a}=\lim_{\Delta t\to 0}\frac{\Delta \vec{v}}{\Delta t} =\frac{d\vec{v}}{dt}$$ $$\vec{F}=\frac{d}{dt}m\vec{v}=m\frac{d\vec{v}}{dt}=m\vec{a}$$

또한, 회전 운동은 물체의 특정 부분을 축으로 삼고 도는 것인데, 이를 통해서는 시간에 따라 물체의 각도가 변하게 됩니다. 변하는 각도($\vec{\theta}$)를 시간($t$)에 대해 미분하면 각속도($\vec{\omega}$)를 얻을 수 있고, 이를 다시 미분하면 각가속도($\vec{\alpha}$)를 얻을 수 있습니다. 물체를 회전시키는 힘인 돌림힘($\vec{\tau}$)과 물체가 회전을 지속하려고 하는 정도를 나타내는 관성 모멘트($I$)를 이용하면 각가속도를 알 수 있고, 이를 통해 물체가 얼마나 회전했는지 알 수 있습니다. 이 과정에서 사용되는 식들은 아래와 같습니다.

$$\vec{\omega}=\lim_{\Delta t\to 0}\frac{\Delta \vec{\theta}}{\Delta t}=\frac{d\vec{\theta}}{dt}$$ $$\vec{\alpha}=\lim_{\Delta t\to 0}\frac{\Delta \vec{\omega}}{\Delta t} =\frac{d\vec{\omega}}{dt}$$ $$\vec{\tau_{ext}}=\vec{F}\vec{r},     \sum \vec{\tau_z}=I_{cm}\vec{\alpha_z}$$

다음으로 충돌에 의한 움직임을 구현하는 방법에 대해 알아봅시다.
이는 전체적으로 충돌 감지Collision Detection, 충돌 반응Collision Response의 과정으로 이루어집니다. 먼저 충돌 감지 과정에서는, 물체가 충돌했는지의 여부를 조사한 뒤 충돌했다면 충돌한 지점과 그 지점에서의 법선 벡터, 그리고 물체가 서로 얼마나 관통했는지를 구합니다. 이때 얻은 세 가지 정보를 통합하여 충돌에 대한 반응을 구현하는 과정이 충돌 반응입니다. 이 과정에서 운동량 보존 법칙($m_A\vec{v_A}+m_B\vec{v_B}=m_A\vec{v'_A}+m_B\vec{v'_B}$)과 운동량의 변화량인 충격량이 이용됩니다. 단위 충격량에 따라 강체의 속도가 얼마나 변하는지를 계산하면, 반발 계수($e=\frac{v_2-v_1}{v_1-v_2}$)를 이용하여 충돌 후 속도가 얼마나 변하는지 알아낼 수 있습니다. 이렇게 구한 속도의 변화량을 토대로 충격량을 계산하여 물체에 적용하면 움직임을 구현할 수 있습니다


강체의 충돌을 구현하는 과정


앞서 설명한 식들을 바탕으로 물리 엔진을 어떻게 구현하는지가 궁금하다면?

물리 엔진의 구현 방법 알아보기



지금까지 현실과 흡사한 가상 공간을 구축하는 데에 게임 엔진이 어떻게 기여하는지에 대해 알아보았는데요.
이렇게 구축된 메타버스와 현실 세계가 실시간으로 상호작용하기 위해서는 막대한 양의 데이터를 고품질로 빠르게 전송하는 기술이 필요합니다.
비대면 상황의 도래와 더불어 메타버스가 다시 주목받기 시작한 또 다른 이유 중 하나인 네트워크의 발전에 대해서 알아봅시다!


[참고문헌]
1. Peter Shirley, Steve Marschner, 『Fundamentals of Computer Graphics(3rd Edition)』, A. K. Peters/CRC Press, 2009.
2. 이안 밀링턴, 김도균 옮김, 진석준 옮김, 박종규 옮김, 『게임 물리 엔진 개발』, 지&선, 2016.


기획특집 ② - 데이터 처리를 위한 네트워크 기술의 발전, Edge Computing 편으로 이어집니다.

기획특집 ② 보기

ALIMI 26기 컴퓨터공학과 박정은

포스텍이 궁금하다면! 포스테키안 구독, 알리미 페이스북 페이지 좋아요, 알리미 인스타그램 팔로우까지❤️

기사 모아 보기
공유하기
목록