주의 : 이 글의 목적은 자기계발 용도와 게임에서 쓰이는 각종 그래픽스, 그래픽카드 관련 단어 (안티엘리어싱, 셰이더, 텍스쳐 품질등) 들이 처음 보는 사람에게는 굉장히 생소하고 어려워 보이기 때문에 해당 부분에 대한 이해를 쉽게 하기 위해 작성되었습니다.
주의 : 해당분야는 전문적인 분야이며 그리고 실시간 발전되는 기술입니다. 지금도 새로운 기술들이 나오고 있어 틀린 부분이 있을 수도 있습니다.
1. 물리엔진
3D게임을 하다보면 한번쯤이라도 들을 수 있는 물리엔진. 게임을 하다보면 가장 많이 마주치는 버그이기도 하다.


물리엔진 버그가 특히 많은 게임을 하다보면 정말 신기할정도로 물리가 개판으로 적용되는 것을 느낄 수가 있는데 대체 왜 이런 문제가 발생하는지에 대해 알아보자.
물리엔진에 대해서 간단하게 설명 해보면 사물간 상호작용을 최대한 현실적으로 그려내야하기 때문에 상호작용 하는 물체의 특성, 특징에 따라 물리엔진 연산방법도 다르다. 사물의 특징에 따라 계산하는 방식은 대충 아래같은 방식으로 나눠진다.
1. Rigid - Body Simulation (리지드 바디)

2. Soft - Body Simulation

3. Fluid / Particle Simulation

2, 3번 소프트, 플루이드,파티클 시뮬레이션 같은 경우는 비교적 미시적인 영역을 다루므로 인게임에서 미치는 영향이 리지드 시뮬레이션에 비해 영향이 다소 적다. 게임에서 대부분 차지하는 물체가 강체(크기, 모양과 같은 형태) 이기 때문에 Rigid 시뮬레이션이 게임에서 가장 기초적인 물리 시뮬레이션이라고 할 수 있다.
2. 기술적 한계의 물리엔진 버그
여기서 뜬금 없는 질문 하나를 해보자. 우리는 왜 현실세계에서 바닥에 떨어지지 않고 잘 서 있을수가 있을까? 발이 바닥을 짚고있어서? 바닥에 접착체가 붙어있는 것도 아닌데.. 그럼 발은 어떻게 바닥을 짚는걸까?
정말 간단하게 설명하면 발과 바닥이 접촉해 있을때 전자끼리 발생하는 척력, 파울리 베타 원리로 인해 전자가 같은 궤도를 공유할 수가 없어서 서로 밀어내는 성질로 우리는 바닥에 서있을 수 있다고 할 수 있다. 근데 이 현대 컴퓨터에서 수조개가 발생하는 양력, 정력등 (참고로 사람을 구성하는 원자의 수는 10의 27승 개이다) 미시셰게를 컴퓨터에서 전부 구현이 가능할까.,? 당연히 불가능하다 ㅎㅎ 엄청 먼 미래라면 몰라도..
여기서 개발자는 현실과 타협해서 Collision Detection 충돌감지 기법을 사용한다.

두 물체간의 거리가 반지름의 합이 반지름의 거리보다 짧아지면 미리 설정된 마찰계수, 중력, 탄력등을 통해 비슷한 상호작용을 구현한다. 이렇게 들으면 간단하게 보이지만 그래도 엄청난 연산을 잡아먹는다.

그래서 부정확하지만 간단한 Discreate 방식과 정확하지만 계산이 느린 Continuous 방식 이 2가지 방식을 사용한다.
Discreate collision Detection (DCD) 이 일반 충돌 감지 기법이 좀 골때리는 녀석인데 실제 충돌을 감지하지 못한다는 것이다;
위 내용에 대해 간단하게 설명해보자면, 우리는 게임을 하면서 프레임이 떨어지네 높아지네 말을 자주하는데, 30프레임이라고 하면 1초에 30장의 연속된 사진이 이어지는것을 30프레임. 즉 프레임은 1초당 사진의 갯수라고 생각하면된다.

위 DCD는 한프레임, 한프레임 마다 담겨있는 각종 물체의 위치 정보를 분석해서 미리 설정된 알고리즘에 따라 겹쳐있는 물체가 있다면 아 얘내 충돌했구나 계산을 하면서 겹치기 직전 위치로 돌리는 식으로 작동하기 때문에 물체가 충돌하기 전 후는 감지 할 수가 있지만 실제 충돌을 감지 할수가 없다.



단 대부분 개발자가 예상한 범위내에서 물체가 겹친다면 크게 문제는 없겠지만 물체가 너무 빨리 이동한다거나 물체가 새로 형성된다거나, 예상치 못한 문제로 겹치는 범위가 증가하면 바로 악몽같은 물리 버그가 시작하는 것이다.


위 게임 버그들처럼 두물체가 충돌한 것을 감지해서 그 전에 위치로 돌려놔도 물체가 여전히 겹쳐있어 떨어질려는 힘과 붙어있으니까 떨어 질수 없는 힘 두개가 미친듯이 동작하면서 미친듯이 덜렁인다거나, 피파같은 축구게임을 하다보면 선수끼리 붙어서 이상한(?) 행동을 한다거나 이런 버그들이 발생 할 수 있다.
우리가 보는 대부분 물리 엔진 버그가 위현상에서 발생하는데 일반 충돌 감지 기법의 기술적 한계로 발생하는 문제이다. 물론 개발자 능력에 따라 예상적인 범위를 짜서 물리엔진을 개발하거나 연속충돌검사 기법(Collision Dection) CCD 를 사용하면 버그를 줄일 수 있다고 한다. 간단하게 설명하면 다양한 방법으로 충돌을 감지하는 기법으로 충돌감지가 굉장히 중요한 투사체에 자주 사용된다 (https://doc.photonengine.com/ko-kr/quantum/current/manual/physics/ccd)
3. 기술적문제가 아닌 물리엔진 버그
일반충돌 감지기법 문제로 인한 버그들이 기술적인 문제라고 하면 그렇지 않은 물리엔진 버그들이있다. 물체 속성이 잘못 지정되있을때 문제가 발생할 수 있는데, GTA에는 유명한 그네 버그가 있는데 차를 그네에 갖다대면 차가 날라가는 버그이다.


위 문제는 그네의 재질은 움직일 수 없는 속성으로 지정되있고, 마찬가지로 차도 움직일 수 없는 상황이 될 때 그네가 차를 밀어내는 힘이 응축되서 한번에 밀어내면서 발생하는 문제로 볼 수 있다. 만약 그네가 브레이커블(부셔지는)이나 움직일 수 있는 물체로 지정되있으면 발생하지 않았을 문제일 것이다.
위에서 서술했듯이 물리연산은 굉장히 많은 연산을 차지하기 때문에 최적화 과정이 필수적인데, 충돌감지 연산량이 워낙 많아 사양을 많이 잡아먹기 때문이다.

그래서 다양한 최적화가 이루어지는데 여기에서 물리 버그가 발생 할 수 있다. 예를 들어 멀리있는 물체는 충돌을 계산하지 않는다라거나, 오랫동안 많이 움직이지 않는 물체는 연산하지 않는다는 등의 최적화 말이다.

정말 복잡하고 어려운 공식들로 이루어진 자연법칙이 적용되는 현실세계의 물리를 개인용 컴퓨터에 현실처럼 구현하는 게임용 물리엔진은 당연히 엄청나게 어려운 과정일 것이다. 그래서 버그가 가장 많이 나오는 걸 수도 있지만 물론 정말 잘만든 물리 엔진은 왠만해서는 안정성이 정말 뛰어나다. 수많은 게임, 영화에서 사용되는 하복엔진, 중력,항력,탄성, 관성까지 계산하는 루비콘엔진 등이 있을 것이다. 다만 이런 물체(객체)에 대한 Material, 물리 설정등에서 나오는 버그들은 고칠 수 있는 문제들이기 때문에 게임 QA로서는 플레이 뿐만이아닌 이런 부분까지 테스트방법을 고려해야하지 않을까 싶다.
유튜브 댓글에서 가져왔습니다.
ArtTech_KR님의 개인 의견
총알처럼 튀어나가거나하는 문제는 상당히 복잡한 경우들이 많습니다만. 대부분 물체의 질량이나 마찰, 저항,감쇄가 제대로 설정되지 않는경우 그러한 문제들이 생겨날 여지가 많습니다. 그래서 로켓을 쏘거나 차로 들이받으면 무슨 로켓단마냥 날아가는게 질량값을 세세하게 설정하지 않았기 때문이죠. 월드 중력은 공통적으로 설정되어 있으니 어차피 떨어질테고. 물체끼리 겹쳤을때 충돌 에너지를 서서히 감쇄(Damping)시켜야 하는게 객체마다 그런 세세한 설정을 잘 하지 않기 때문에 계속 주입되는 에너지만 가속 되어 결국 차량이 사람한테 암바를 걸어 날려보낸다던지 우주로 날아간다든지 하는 현상을 볼수 있습니다. 타격, 충돌이나 미사일 폭발시 주입되는(Impulse)에너지를 물체들의 물리적 수준과 맞춰서 설정해야 하는데 , 많은 게임들이 그냥 호쾌한 느낌을 주기위해 주입은 강하게두고, 객체들의 무게나 탄성 이런것들을 설정하는데 소홀한 이유에 있기도 합니다. 사실 제대로된 물리 설정을 하려면 각각 객체를 만들때만큼 수준의 시간과 노력, 테스트를 해야하지만 대부분의 게임QA는 게임플레이에 집중하지 이런 세부적물리관련은 거의 엔진에서 제공되거나 초기 프리셋정도로 그냥저냥 넘어가는 경우가 많기 떄문이죠.
댓글