Artoke

피직스(PhysX): 게임 속 물건들이 진짜처럼 굴러가는 비밀

피직스(PhysX): 게임 속 물건들이 진짜처럼 굴러가는 비밀 대표 이미지
출처: PhysX — GPU 물리 시뮬레이션

피직스(PhysX): 게임 속 물건들이 진짜처럼 굴러가는 비밀

게임에서 상자를 총으로 쏘면 상자가 데굴데굴 굴러갑니다. 유리창을 깨면 조각이 사방으로 튑니다. 천이 바람에 살랑살랑 흔들립니다. 이런 게 다 저절로 되는 걸까요? 아닙니다. 누군가 뒤에서 열심히 계산하고 있습니다. 그 계산 담당 프로그램 중 하나가 바로 피직스(PhysX)입니다.

피직스는 엔비디아(NVIDIA)라는 회사가 만든 물리 엔진입니다. 물리 엔진이란, 게임 속 물건들이 현실처럼 움직이도록 계산해 주는 소프트웨어예요. 지금은 누구나 가져다 쓸 수 있게 소스 코드가 공개되어 있습니다.

물리 엔진이 뭐예요?

게임을 만드는 사람은 그림만 그리는 게 아닙니다. 물건이 어떻게 움직일지도 정해 줘야 해요.

그런데 여기에는 문제가 있습니다. 세상의 움직임은 규칙이 아주 많아요.

  • 물건은 아래로 떨어진다 (중력)
  • 부딪히면 튕긴다 (충돌)
  • 바닥이 거칠면 미끄러지다 멈춘다 (마찰)
  • 무거운 게 가벼운 걸 밀어낸다 (질량)

이 규칙을 게임 하나하나마다 처음부터 다시 만들면 너무 힘듭니다. 그래서 미리 잘 만들어 둔 계산기를 가져다 씁니다. 그게 물리 엔진이에요. 피직스는 그중에서 아주 유명한 계산기입니다.

비유하자면 이렇습니다. 여러분이 요리를 할 때 밀가루를 직접 밀에서 빻지 않죠? 마트에서 밀가루를 사 옵니다. 게임 개발자도 마찬가지예요. 물리 계산을 직접 만들지 않고 피직스를 사 옵니다(정확히는 무료로 받아옵니다).

피직스는 무슨 계산을 하나요?

피직스가 하는 일을 아주 단순하게 줄이면 딱 두 가지입니다.

첫째, "이 물건이 다음 순간 어디에 있을까?" 공을 위로 던지면 처음엔 빠르게 올라가다가, 점점 느려지고, 결국 멈췄다가 떨어집니다. 피직스는 이걸 1초에 수십 번씩 다시 계산해서 위치를 갱신합니다.

둘째, "이 물건이 저 물건이랑 부딪혔나?" 부딪혔으면 어느 방향으로 얼마나 세게 튕겨야 하는지도 계산합니다. 이걸 충돌 검사라고 불러요.

게임 화면이 1초에 60번 새로 그려진다면, 피직스도 1초에 최소 60번은 이 계산을 끝내야 합니다. 화면에 상자가 500개 있으면? 500개를 전부 60번씩. 계산량이 어마어마하죠.

피직스(PhysX): 게임 속 물건들이 진짜처럼 굴러가는 비밀 도식

왜 GPU를 쓰나요?

피직스의 이름 앞에는 종종 "GPU 물리"라는 말이 붙습니다. GPU는 원래 그림을 그리는 부품이에요. 그런데 왜 물리 계산을 GPU에게 시킬까요?

이렇게 생각해 보세요.

CPU는 대학생 4명입니다. 아주 똑똑해서 어려운 문제도 풉니다. 하지만 4명뿐이라 문제가 1만 개면 오래 걸립니다.

GPU는 초등학생 3000명입니다. 한 명 한 명은 덧셈밖에 못 합니다. 하지만 3000명이 동시에 덧셈을 합니다. 쉬운 문제 1만 개라면? 눈 깜짝할 사이에 끝납니다.

물리 계산은 바로 이런 종류예요. "이 조각을 아래로 조금 옮겨라"라는 쉬운 계산이 엄청나게 많이 필요합니다. 초등학생 3000명이 딱 맞는 일이죠. 그래서 피직스는 GPU를 활용해서 계산 속도를 크게 올립니다.

물리 전용 카드가 있던 시절

사실 옛날엔 물리 계산만 전담하는 별도의 카드까지 있었습니다. 아예 컴퓨터에 꽂는 부품이었어요. "그래픽 카드가 그림을 그린다면, 물리 카드는 물리를 계산한다"는 생각이었죠.

하지만 이 방식은 오래가지 못했습니다. 카드를 따로 사야 하니 비싸고, 그걸 지원하는 게임도 적었거든요. 결국 엔비디아가 피직스를 사들이면서, 물리 계산을 그래픽 카드 안의 GPU가 함께 처리하는 방향으로 바뀌었습니다. 따로 살 필요가 없어졌으니 훨씬 편해졌죠.

피직스가 켜지면 뭐가 달라지나요?

게임 설정에 "물리 효과: 높음 / 낮음 / 끄기" 같은 항목을 본 적 있나요? 그게 바로 이 얘기입니다.

물리 효과를 끄면: 벽을 총으로 쏘면 그냥 자국만 남습니다. 깔끔하지만 밋밋해요.

물리 효과를 켜면: 벽에서 콘크리트 조각이 우수수 떨어지고, 바닥에 굴러다니고, 먼지가 피어오릅니다. 훨씬 실감 납니다.

같은 장면을 물리 효과 최고 설정과 낮은 설정으로 비교한 게임 화면. 위쪽은 파편이 풍부하게 흩어지고 아래쪽은 파편이 거의 없다.
(PC) The top screenshot shows how debris is simulated in Mafia II when PhysX is turned to the highest level in the game settings. The bottom screenshot shows a similar scene with PhysX turned to the l · 출처: PhysX — GPU 물리 시뮬레이션

차이가 보이시나요? 위아래 그림은 똑같은 장면입니다. 다른 건 파편이 얼마나 많이, 얼마나 진짜처럼 흩어지느냐뿐이에요. 그런데 느낌이 완전히 다르죠.

대신 대가가 있습니다. 조각 하나하나를 다 계산해야 하니 컴퓨터가 훨씬 바빠집니다. 컴퓨터 성능이 부족하면 화면이 뚝뚝 끊길 수 있어요. 그래서 "높음/낮음"을 고를 수 있게 해 둔 겁니다.

피직스는 어떤 것들을 흉내 낼 수 있을까요?

  • 딱딱한 물체 — 상자, 통, 자동차. 모양이 안 변하고 굴러다니는 것들.
  • 부서짐 — 유리, 벽, 나무 상자가 조각으로 깨지는 것.
  • — 깃발, 망토, 커튼이 바람에 흔들리는 것.
  • 액체 — 물이 흐르고 튀는 것.
  • 연기와 입자 — 먼지, 불꽃, 눈보라처럼 작은 알갱이가 잔뜩 있는 것.
  • 인체 관절 — 캐릭터가 쓰러질 때 팔다리가 축 늘어지는 것.

천이나 액체는 특히 어렵습니다. 딱딱한 상자는 "덩어리 하나"로 다루면 되지만, 천은 수천 개의 점이 서로 연결된 그물망이거든요. 점 하나가 움직이면 옆의 점도 끌려갑니다. 이걸 전부 계산해야 진짜 천처럼 보여요. 여기서 GPU의 "초등학생 3000명"이 진가를 발휘합니다.

거짓말을 잘하는 게 목표입니다

여기서 중요한 사실 하나. 피직스는 진짜 물리학을 완벽하게 계산하지 않습니다. 오히려 일부러 대충 합니다.

왜냐고요? 시간이 없으니까요. 1초에 60번 계산을 끝내야 하는데, 완벽하게 계산하려면 몇 시간이 걸릴 수도 있습니다. 그래서 "눈으로 봤을 때 그럴듯하면 통과"라는 원칙을 씁니다.

영화 CG는 다릅니다. 영화는 한 장면을 몇 시간이고 계산할 수 있어요. 어차피 미리 만들어서 틀어 주는 거니까요. 하지만 게임은 여러분이 버튼을 누른 바로 그 순간 답을 내야 합니다. 이걸 실시간(realtime)이라고 부릅니다.

그래서 피직스의 진짜 재능은 "정확한 물리학"이 아니라 "빠르면서도 속아 넘어갈 만한 물리학"입니다. 훌륭한 마술사처럼요.

누구나 열어 볼 수 있게

예전에 피직스는 엔비디아만의 비밀이었습니다. 하지만 지금은 오픈 소스입니다. 설계도를 인터넷에 공개했다는 뜻이에요.

덕분에 누구나 피직스를 가져다 쓸 수 있고, 안을 뜯어보며 공부할 수도 있고, 더 좋게 고쳐서 다시 나눠 줄 수도 있습니다.

그리고 요즘엔 게임 말고 다른 데서도 씁니다. 로봇을 진짜로 만들기 전에 컴퓨터 안에서 먼저 걷게 해 보거나, 자율주행차를 가상의 도로에서 미리 달려 보게 하는 데도 쓰여요. 진짜 로봇은 넘어지면 부서지지만, 가상의 로봇은 만 번 넘어져도 공짜니까요.

정리하면

  • 피직스는 게임 속 물건이 현실처럼 움직이도록 계산해 주는 프로그램입니다.
  • 매 순간 위치 계산충돌 검사를 반복합니다.
  • 쉬운 계산이 아주 많이 필요해서 GPU(일꾼 수천 명)가 잘 어울립니다.
  • 정확함보다 빠르면서 그럴듯함이 목표입니다.
  • 지금은 오픈 소스라 누구나 쓰고 배울 수 있습니다.

다음에 게임에서 상자가 데굴데굴 굴러가는 걸 보면, 그 뒤에서 초등학생 3000명이 미친 듯이 덧셈을 하고 있다고 상상해 보세요. 실제로 그러고 있으니까요.

출처

광고

리깅 파이프라인 자동화 도구

반복 작업은 스크립트에게. 현업에서 쓰는 리깅 툴 모음.

리깅 도구 보기