top of page
  • Join our Discord!
  • Join our Kickstarter!

생츄어리 게임 엔진의 품격을 레이로 높이다

  • Aug 26, 2022
  • 3 min read

반가워요, 인터넷! 여려분의 위험하리만치 잘생긴 DOTS-개발자가 새로운 개발자 로그를 들고 여러분들에게 돌아왔습니다. 와아아아! 벌써 생츄어리 게임 엔진의 뒷구석까지 함성소리가 들리는군요. 백색소음과 블루스크린의 멋진 신세계 속에서, 오늘 저는 제 최고의 업적이자 지난 몇 주(컴퓨터 그래픽을 연구한 시간까지 합산한다면 몇 년)동안 저를 붙잡아둔 것에 대해서 소개하려고 합니다. 무엇인지 아시겠나요? 네, 맞이요! 레이입니다!

여러분들 중 몇몇이 아마 이게 생츄어리랑 대체 무슨 상관인지 의아해하실 수도 있을 겁니다. “엥? 설마 레이트레이싱을 넣은 거야?” 라고 누가 말하면, 제가 “아니 누?구, 레이트레이싱은 안 넣었어.” 라고 답한 적이 있으니까요. 하지만 이것도 물리 엔진과 연관이 많은 건 같으니, 오늘은 핵심적인 레이와 그것이 생츄어리에서 수행하는 역할에 대해 알아볼까 합니다.

레이에 대해서 분석해보기 전에, 우선 제가 이걸 여러분들에게 전부 소개해드리고 싶지만, 세상은 잔혹한 곳이고 제가 직접 설명하는 대신, 여기 요점을 정확하게 짚어주는 기사 하나를 소개해드리겠습니다: What is a Ray? | Virtual Nerd

물론, 여러분들 중 게임 개발에 관심이 많은 사람이라면 튜토리얼이 불필요하겠지만요!


먼저, 레이의 장엄미에 대해서 분석해볼까 합니다. 생츄어리의 주된 관심사는 시뮬레이션되는 물리적 환경을 만들어내는 것입니다? 무슨 의미냐고요? 말 그대로, 모든 것이 시뮬레이션이라는 뜻입니다! 투사체, 유닛, 게임 내의 세상 전체가 하나의 큰 시뮬레이션이죠! 이건 아주 좋은 장점이라고 할 수 있는데, 게임 내에서 RTS에 아주 중요하고도 재밌는, 정말로 흥미로운 상호작용들이 가능해지기 때문입니다. 폭격기를 격추시켰는데 여러분 머리 위로 떨어진다고 생각해보세요. 제 발로 제 무덤을 파는 격이군요. 물론, 이렇게 역동적인 세계에는 역동적인 문제가 따릅니다 – 나와 저기 나를 밀어버리려고 오는 전차 사이의 거리가 얼마냐 되냐는 것이죠!


“근데 그거 그냥 거리 공식같은 방법으로 구하면 되는 거 아님?” 누군?가가 또 끼어드는군요! 첫 줄로 다시 돌아가시죠. 생츄어리의 환경은 전부 시뮬레이션되었기 때문에, 더 이상 무언가를 지점으로 나타내는 방식은 적용이 불가능합니다. 여기, 이 장면을 한번 보시면 알게 될 거에요.

이 멋진 그림은 owlieart의 작품입니다! 이 개발자 로그를 한층 더 멋지게 만들어준 그녀에게도 박수를 보내주세요.


자, 4티어의 베헤모스, 빅 베르타를 소개합니다 – 적에게는 약속된 승리의 전차, 여러분들에게는 약속된 통곡의 벽이죠. 그녀의 위압감은 달을 떨구고도 남을 겁니다. 반대편은: 티어 1의 모스키토입니다. 한때는 중요했을지도 모르지만 25분이 넘어간 시점에서는 그냥 하루하루 죽어나갈 뿐인 유닛이 되었죠. 설정해놓고 오래 전에 잊어먹은 집결 지점 탓에... 방어 거점에 무작정 꼬라박는 중이기도 합니다. 저런... 힘내라, 모스키토!

owlieart에게 여러분의 성원을 보내주는 걸 잊지 마세요!


만약 이 두 유닛 사이의 거리를 나타내려고 한다면, 머지않아 금새 지점으로는 이 두 유닛들 사이의 거리를 구할 수 없다는 걸 깨닫게 될 겁니다. 사실, 부피(그러니까, 충돌 범위)를 가진 유닛, 특히 독특한 크기와 큰 부피를 가진 유닛을 단순히 지점으로 나타내는 건, 우리 개발팀이 달성하고자 노력하는 현실성을 크게 떨어트릴 겁니다.


owlieart 가 제 누나라고 얘기했던가요? 가족 로그를 더 알아보고 싶다면 인스타그램에서 그녀를 팔로우하세요!


자, 그렇다면 레이가 어떻게 이 문제를 해결할 수 있을까요? 아마 예상하신 분들도 있겠지만, 레이는 우리가 서로 다른 부피를 가진 유닛들의 거리를 정확하게 계산할 수 있도록 해 줍니다. 게다가, 레이의 다재다능함은 우리가 온갖 종류의 모양들에, 극도로 정확하고 효율적으로 레이를 응용할 수 있다는 걸 의미합니다 (그 덕분에 우리의 방어막은 타원형 모양으로 나타나는 게 가능해졌습니다!)


레이를 교차점 도구로 사용하는 것에 딸려오는 또 하나의 멋진 장점은, 이 교차점들이 과도하게 사양을 잡아먹지 않고도 금방 산출된다는 것입니다. 그에 더해, 실제 거리를 되돌리는 것은 우리가 원래 해야만 하는 몇몇 과정들을 넘어갈 수 있다는 걸 의미합니다 (레이 원점과 히트 포인트 사이의 거리 공식이라던가요) 이런 과정들을 넘기는 것은, 연산을 덜 해도 된다는 것, 거리를 제곱으로 나타낼 필요가 작어진다는 걸 의미하죠 - 누군가

정말, 레이의 길은 계속해서 선물이 쏟아져들어오는 길이라니까요. 잠깐... 방금 그거 누구였죠?

아무튼, 비록 레이의 기능을 4개 정도로 줄여서 요약할 수 있긴 하지만, 그 4개의 요점만으로도 생츄어리에 필요한 시뮬레이션 세계를 만드는 일의 기반 대부분을 형성하기에는 충분합니다:

  • 부피를 가진 것들 사이의 거리를 정확하게 측정 가능

  • 사물과 투사체 간의 충돌을 감지할 수 있음

  • 충돌이 막혔을 경우 쿼리가 가능함(예시: 범위 피해가 방어막이나 사물을 관통하고 뒤의 유닛에게 피해를 주는 것을 방지해야 하는 상황)

  • 게임에서 레이캐스트가 가능하도록 함 (당근이지!)

자, 어땠나요? 끝까지 잠을 참고 글을 완주하셨나요?

“응 아니 응...”

그건 또 무슨 답변이에요?! 아무튼, 조만간 이런 개발자 로그™들을 더 작성할 수 있다면 좋겠지만, 그 전에 여러분들의 피드백이 필요합니다! 다음 주제는 어떤 것이 좋을 것 같나요? 제가 좀 더 세부 사항에 집중해서, 실제 코드까지 보여주는 게 나았을까요, 아니면 이 정도로도 충분할까요? 어쩌면 최근에 브로콜리를 맛보고 그 끔찍함에 대해서 털어놓을 곳이 필요하신 걸지도 모르고요 (당신의 미뢰에 유감을 표합니다) 만약 “응 아니 응”이라면 언제든지 생츄어리 디스코드로 찾아와 FoneE#1533을 통해 저에게 연락을 주시면 됩니다.


추신: 레이캐스팅 시스템의 세부적인 구조-이걸 어떻게 했느냐 등등-에 대해 더 많은 관심을 가지신 개발자 동지 여러분, 여러분이 직접 만들어보실 수 있게 훌륭하고도 중요한 리소스 링크들을 남겨놓겠습니다. 더 필요하시다면, 언제든지 디스코드를 통해 FoneE#1533로 연락 주시는 거 잊지 말고요.


직접 레이캐스트를 시도하는 분들을 위한 유용한 정보 링크들:

레이캐스팅을 월드에서 사용하기 위한 알고리즘에 대한 훌륭한 소개 영상. Super Fast Ray Casting in Tiled Worlds using DDA - YouTube



여러 분야에서 레이 활용을 다루는 굉장히 유용한 기사. 고마워요 Inigo. Inigo Quilez :: fractals, computer graphics, mathematics, shaders, demoscene and more (iquilezles.org)

 
 
 
bottom of page