You are on page 1of 2

안녕하십니까, 오늘은 물리엔진의 내부 과정에 대해서 소개해보겠습니다.

먼저 물리엔진에 대해 알아보고, 종류와 과정, 그리고 다양한 물리엔진을 알아보겠습니다. ㅇ


유명한 자동차 게임 ‘카트라이더’ 에는 가속도나 충돌의 물리엔진 등이 잘 적용되있죠. ㅇ
ㅇ ㅇ 그렇기 때문에 경주가 가능하고, 막자가 가능하고, 그렇기에 컨텐츠가 되고 게임이 될 수 있었습니다. ㅇ ㅇ

- 이렇게 물리엔진은 가상공간을 구성하는 물체들이


실제 세계의 물리 법칙에 따라 움직이도록 처리해주는 프로그램입니다.

- 우리의 일상 공간을 지배하는 물리 법칙은 뉴턴의 운동법칙이고, 이의 핵심은 F = ma 라는 공식.


1 초에 n 번의 영상이 나온다 가정하면,
어떤 물체에 힘이 가해져 움직이는 경우 우리는 1 초가 지날 때마다 물체의 위치를 계산해서 이를 화면에 그려줘야하죠.
힘 F 와 물체의 질량 m 이 주어지면 이를 대입해
이 물체에 발생한 가속도 a 를 계산. 1/n 이 지날때마다
업데이트되니 가속도를 적분해 속도를 구해, 익숙한 공식인 ㅇ
(속도) = (초기속도) + (가속도) * (시간) 이라는 공식에 대입을 하합니다..
여기서 시간에는 1/n 을 넣습니다. ㅇ 또 속도를 적분해 위치를 구하고,
아까와 같은 과정을 거치면 현 물체 위치가 계산되고,
이 작업을 반복해 사실적으로 물체가 움직이는것처럼 보이게 할 수 있습니다. ㅇ ㅇ

- 이러한 원리로 물리적 현상을 적용하고, 이리저리 튀는 공이나 옷같은 변형체, 물과 연기같은 유체 등 여러
미분방정식을 푸는 복잡한 수학적 풀이과정을 통해 적용시켜 사실적 영상을 보입니다.
여기 물리엔진이 적용됐다 가정했을땐 바퀴의 마찰, 무게중심에
의한 균형, 합력 등을 적용시켜 실현해낼 수 있겠죠.

/
이제 물리엔진 중 하나인 하복 물리엔진을 예로써 종류를 설명드리겠습니다. ㅇ

1. 강체(Rigid Body) 시뮬레이션 ㅇ


-물리 연산을 단순화를 위해 물리가 적용된 물체를 형태가 절대로 변하지 않는 단단한 물체인 강체로 가정합니다.
마찬가지로 지형도 역시 변형되지 않는다고 가정하면, ㅇ
속도 최적화를 위해 실제 화면상에 보이는 형태 대신 좀 더 단순한 물리 형태를 사용하죠. ㅇ

-운동의 상태가 변할 가능성이 있는 물체를 따로 모아서 시뮬레이션 하기도 합니다. ㅇ


이런식으로 시간이 변할때마다 움직이죠.

/
2. 동역학(dynamics) 시뮬레이션 ㅇ

힘에 의한 물체의 동적인 상태 변화를 시뮬레이션 합니다. ㅇ


컴퓨터로 시뮬레이션하기 위해 물체의 운동 과정을 시간의 경과에 따라 미세한 프레임들로 나누어서 연산하는데,
물체의 다음 위치를 계산할 때 전체 운동과정이 아닌 바로 직전 프레임의 운동 상태만을 참조하니
계산 과정에서 발생할 수 있는 오차는 시간이 경과할수록 누적됩니다. ㅇ
그래서 오차를 줄이기 위해 화면에 표시되는 갱신 주기보다 더 세분화된 주기로 자주 연산을 해서 정밀도를 높여야만
합니다. 예를 들어 화면을 60Hz 로 업데이트 하는 게임인 경우 물리 시뮬레이션은 보통 240Hz 로 업데이트 하게 되죠.

3. 물리적인 속성(Physical Property) ㅇ ㅇ


강체의 다양한 물리적인 속성(질량, 탄성 계수, 마찰 계수 등)을 조절할 수 있습니다. ㅇ
물리 법칙을 직접 컨트롤 할 수 있기 때문에 필요에 따라 중력을 증가시키거나 공기 저항, 바람 등의 일부 물리 속성을
생략할 수도 있죠. ㅇ

4. 충돌 처리(Collision Detection) ㅇ
물리가 적용된 오브젝트가 서로 충돌했는지 검사하기 위한 과정으로 물리 엔진의 성능에 영향을 미치는 가장 중요한
요소입니다.
게임상의 모든 오브젝트를 충돌 검사 하게 되면 실시간으로 연산하기가 거의 불가능에 가깝기 때문에 최적화를 위해서 세
단계를 거쳐서 충돌할 가능성이 있는 오브젝트만 선별해서 처리하게 됩니다. ㅇ ㅇ

상세한 충돌 처리 단계로 넘어 가기 전 'AABB 연산'을 통해서 대부분의 오브젝트를 제거하는 broadphase 가 있습니다.
AABB 연산이란 충돌 로직 중 하나로, 각 축에 정렬시켜 겹치면 충돌로 판정합니다. ㅇ ㅇ

충돌 처리를 위한 연산의 복잡도를 낮추는 Midphase 는,


예를 들면 수천개의 폴리곤으로 이루어진 지형위로 공이 굴러 떨어질 때 공이 닿은 지면 근처에 있는 몇 개의 요소만
선별해서 연산하는 기능을 합니다. ㅇ ㅇ

그리고 실제 두 오브젝트 간의 거리 계산을 통해 충돌 여부를 확인하는 Narrow phase 등이 있죠. ㅇ

이제 물리엔진의 내부 과정을 설명하겠습니다. ㅇ


- 광역탐지 단계에선 그래픽 엔진과 유사한 알고리즘을 사용해 물리 엔진의 연산 부하를 줄여주는 단계입니다.
충돌의 기본적인 속성이 쌍 기반 개념으로,
간단하게 A 와 B 의 충돌을 검사하기 위해선 A 와 B 를 묶어 하나의 쌍으로 봐야 하죠.
그리고 만약 정해진 공간 안에 10 개의 물체간에 충돌을 검사하기 위해서 10 의 제곱인 100 번의 계산이 있어야 하고,
중복을 줄인다 하더라도 45 번의 연산이 필요하다.
이렇게 중복을 줄이고 충돌 가능성이 있는 쌍만 추리는 알고리즘을 구현하는게 광역 탐지 단계입니다. ㅇ

- 지역탐지 단계에선
간단하게 요약하면 두 도형이 교차하는지 수학적으로 참/거짓을 판별 한 후에 추가적인 계산을 통해 다음 단계에 사용할
데이터를 찾는것입니다.
예를 들어 좌표상의 두 원이 겹치는지 판단하는것은 두 원 중심으로 간의 거리가 두 원의 반지름의 합보다 작다면 두
원은 서로 교차중인 상태이죠.
여기에 아까 나왔던 AABB 연산 등의 알고리즘이 사용됩니다. ㅇ

- 이제 해결 단계에선
지역 탐지를 마치고 물체가 교차중인 것이나, 물체가 접촉중인 것이나, 여러가지 힘 등등 각종 역학적인 효과들을
계산해 적용하는 단계가 해결 단계입니다.
중력, 마찰력, 인력, 항력, 탄성력 등등 우리가 물리학에서 배우고, 실제 현실에서 볼수 있는 물리적 효과를 구현하거나
실제로 없는 가상의 물리효과 등등 굉장히 다양한 형태로 효과를 줄수 있습니다.
또 앞서 연산한 물체의 충돌 해결 역시 중요한 부분중 하나죠.
현대에 제약조건을 여러 프레임 동안 유지해 제약조건 수렴값에 도달할때까지 반복적인 연산으로
역학 문제를 해결하는 제약기반 물리 알고리즘이 있다합니다. 또 연산 값이 너무 어려워 가까운 값을 구할때 쓰는
수치적분법도 쓰인다 하네요. ㅇ

이렇게 물리엔진의 실행 과정을 알아보았습니다.


세상엔 다양한 물리엔진들이 존재하고, 대표적으로 정역학, ㅇ 고체역학, ㅇ
그리고 계산 능력의 발전으로 이룰 수 있는 유체역학 물리엔진이 있죠.
게임 뿐 아니라 예기되는 미래 버츄얼 메타버스 세계 등 쓰일 곳이 많고,
그에 대한 현실성, 사실성과 몰입이 매우 중요함으로 물리엔진 개발은 꼭 발전되어야하는 분야인것 같습니다. ㅇ
감사합니다.

You might also like