'간단한 접근 방식을 먼저 시도해 보세요. 대부분의 경우 이러한 접근 방식은 이미 놀라운 결과를 가져와서 더 복잡한 영역을 반복할 시간을 더 많이 확보할 수 있습니다.'
관련 분야: 프로그래밍, 게임 기획
작성자: John Wigg
게임 개발자 심층 분석은 비디오 게임의 특정 디자인, 아트 또는 기술적 특징을 조명하여 단순해 보이는 근본적인 디자인 결정이 실제로는 전혀 간단하지 않다는 것을 보여주기 위해 진행 중인 시리즈입니다.
이번 편에서는 프론티어 디벨롭먼트의 렌더 프로그래머 존 위그가 실제 물의 움직임을 사실적으로 모방한 이펙트를 제작하는 방법을 설명합니다.
안녕하세요, 영국에 본사를 둔 스튜디오 프론티어 디벨롭먼트의 렌더 프로그래머 존 위그입니다. 2016년 장르를 정의한 크리에이티브 경영 시뮬레이션 게임인 플래닛 코스터의 속편인 플래닛 코스터 2를 출시했습니다. 플래닛 코스터 2에서는 플레이어가 꿈에 그리던 코스터와 워터파크를 건설하면서 새로운 차원의 창의력, 관리, 공유를 경험할 수 있으며, 장대한 물놀이 기구와 코스터를 결합하여 손님들에게 즐거움과 스릴을 선사할 수 있습니다.
워터파크는 플래닛 코스터 2에 추가해 달라는 요청이 많았던 신규 콘텐츠입니다. 저희는 플레이어들이 이전 플래닛 게임에서 기대했던 것과 동일한 수준의 디테일과 몰입감을 이 새로운 영역에 부여하고 싶었습니다. 이번 심층 분석에서는 이를 달성하기 위해 다양한 시스템을 어떻게 제작했는지 설명해 드리겠습니다.
플래닛 코스터 2의 핵심은 창의성의 자유입니다. 워터파크의 경우, 이는 플레이어가 할 수 있다는 것을 의미합니다:
자유형 건축 도구를 사용하여 상상할 수 있는 모든 형태의 풀을 만들 수 있습니다.
파도 기계를 배치하여 재미있는 파도 패턴을 가진 파도 풀을 만들 수 있습니다.
새로운 1인칭 카메라를 사용하여 공원을 가까이에서 탐험하기
우리가 만드는 시스템은 매우 역동적이고 다양한 상황에 대응할 수 있는 것이 매우 중요합니다.
또한 공원 방문객이 물과 어떻게 상호작용하는지도 고려해야 했습니다. 공원에는 수천 명의 방문객이 동시에 방문할 수 있습니다. 유니티의 재능 있는 애니메이터들은 이러한 고객을 위해 수천 개의 독특한 수영장 애니메이션을 제작했습니다. 이 모든 것이 수면에 사실적인 방식으로 영향을 미치도록 하고 싶었습니다.
이러한 높은 수준의 디테일은 플래닛 게임의 기둥 중 하나이며 개발의 모든 영역에서 고려하는 사항입니다.
현미경으로 보는 물
일반적으로 많은 게임에서는 물을 평평한 평면으로 렌더링하고 노멀 또는 범프 맵과 같은 조명 트릭을 사용하여 표면이 고르지 않은 것처럼 보이게 합니다. 하지만 이러한 기법은 가까이서 보면 단점이 있습니다.
저희는 어떤 거리에서 보더라도 물이 살아 있고 입체적으로 느껴지길 원했습니다. 이를 위해 유니티는 다이내믹 레벨 오브 디테일 시스템을 사용했습니다. 이 시스템은 카메라 거리에 따라 물 메시의 트라이앵글을 세분화하는 방식으로 작동합니다. 이렇게 하면 화면에 항상 거의 동일한 양의 지오메트리가 표시되므로 렌더링 비용을 센티미터 단위까지 일정하게 유지할 수 있습니다. 이 접근 방식은 오픈 월드 게임에서 지형을 렌더링하는 데 매우 널리 사용되지만 물 표면에 이렇게 세밀하게 적용되는 경우는 드뭅니다.
이 세분화를 통해 파도와 잔물결에 따라 수면의 지오메트리를 위아래로 움직일 수 있습니다. 이렇게 하면 물에 많은 가소성이 추가되며, 특히 1인칭 카메라로 물놀이를 할 때와 같이 얕은 각도에서 수면을 관찰할 때 눈에 띄게 나타납니다.
물속에서 카메라를 움직일 때 발생하는 전환에도 많은 고민을 했습니다. 화면에 물줄기를 렌더링하여 사진에서 '스플릿 샷'이라고 하는 것을 구현하고, 화면 공간 셰이더에서 픽셀 위치를 월드 좌표로 변환하고 수면까지의 수직 거리로 저해상도 텍스처를 채웁니다. 그런 다음 이 거리 텍스처의 임계값을 설정하여 부드러운 물줄기를 렌더링합니다. 유사한 효과를 위해 디스턴스 필드를 사용하는 방법에 대해 자세히 알고 싶다면 Chris Green(2007)의 '벡터 텍스처 및 특수 효과를 위한 향상된 알파 테스트 배율'을 읽어보시기 바랍니다.
출시 후 첫 번째 전체 업데이트에서는 카메라가 물에 들어갔다 나올 때 재미있는 물방울 효과도 추가할 예정입니다.
물에 생명력 불어넣기
이제 매우 세밀한 물 표면을 렌더링할 수 있게 되었으니 애니메이션을 적용하는 방법을 살펴보겠습니다.
각 게스트 유형(어린이, 청소년, 성인)에는 다양한 수영장 상호 작용을 위한 수백 가지의 애니메이션이 있습니다. 예를 들어 수영하는 게스트는 물결을 일으키고 뒤에서 소용돌이를 일으키며, 수영장에 대포알을 던지는 사람은 큰 물보라를 일으키는 등 모든 애니메이션은 다양한 방식으로 물을 교란합니다. 파크 게스트는 물보라 싸움에 참여할 수도 있습니다. 수면 애니메이션을 위한 솔루션은 이러한 상호작용에 그럴듯하게 동적으로 반응해야 합니다.
인간은 물의 움직임을 매우 직관적으로 이해하기 때문에 재미있고 생동감 있는 물 애니메이션은 최대한 사실적이어야 합니다. 이를 위해 유니티는 최첨단 유체 시뮬레이션을 활용합니다. 이를 통해 물이 게스트 주위를 사실적으로 흐르고 그 과정에서 소용돌이와 파문을 만들 수 있습니다.
다양한 사용 사례를 위한 다양한 유체 시뮬레이션 모델이 존재합니다. (곧 보게 되겠지만, 유니티에서는 바로 이러한 이유로 두 가지 유체 시뮬레이션을 활용하고 있습니다.) 이러한 모델 중 일부는 유체의 특정 특성에 더 중점을 둘 수 있으며, 일부는 완전한 3차원 모델인 반면 다른 모델은 2차원에서 작동합니다.
수영장의 경우, 우리는 물의 세 가지 특성에 관심이 있습니다: 수직 변위(상하 운동), 흐름(예: 소용돌이 및 와류), 거품이 그것입니다. 유체 시뮬레이션은 표면 효과에만 관심이 있고 물의 더 깊은 층에는 관심이 없기 때문에 2차원적입니다.
유체 시뮬레이션은 크게 보면 다음과 같이 작동합니다. 각 프레임마다 GPU에 텍스처로 저장된 데이터 그리드를 현재 변위 및 흐름 벡터로 채웁니다. 게스트 또는 다른 물리 충돌체가 수면과 교차하는 것을 감지하면 해당 그리드 위치에 변위량과 물체의 속도를 오버라이드합니다. 결과 변위와 속도 값이 소위 초기 조건입니다. 시뮬레이션 코드를 사용하여 이러한 초기 조건을 발전시키고 출력을 렌더링합니다. 그런 다음 이 출력을 다음 프레임의 초기 조건으로 사용하는 식으로 반복합니다.
시뮬레이션 코드의 경우 게임의 요구사항에 맞는 수학적 모델을 선택해야 했습니다. 간단한 시뮬레이션의 경우 표준 파동 방정식을 사용할 수도 있습니다. 대신 저희는 변위와 흐름을 모델링하는 얕은 물 방정식을 선택했습니다. 이를 통해 소용돌이와 같은 더 많은 효과를 애니메이션으로 구현할 수 있습니다.
이러한 방정식을 컴퓨터 프로그램으로 바꾸는 것은 그 자체로 예술이며, 초보자에게 친숙한 YouTube 튜토리얼부터 고도로 기술적인 과학 논문까지 이 주제에 대한 수많은 자료가 존재합니다. 선택은 다시 게임의 요구 사항에 따라 달라집니다. 제 조언은 처음부터 수학적 복잡성에 빠져들지 말고 단순함을 추구하는 편이 좋다는 것입니다.
기술적으로 관심이 있는 분들을 위해 몇 가지 전문 용어를 사용하겠습니다(이 부분은 생략해도 됩니다). 저희는 크랭크-니콜슨 방법을 사용하여 통합하는 얕은 물 방정식의 세미 랑그랑주 공식을 사용합니다. 저희의 수치 솔버는 사전 조건부 공액 그라데이션(PCG) 방식입니다. 참고한 논문으로는 Anita Layton과 Michiel van de Panne(2002)의 “물결 애니메이션을 위한 수치적으로 효율적이고 안정적인 알고리즘”, Marco Ament 외(2010)의 “멀티 GPU 플랫폼에서 푸아송 문제를 위한 병렬 사전 조건부 접합 그라데이션 솔버”, Peter Sikachev(2018)의 “툼레이더의 그림자에서 실시간 유체 시뮬레이션” 강연이 있습니다. “GPU Gems"(2004)의 38장도 이 주제에 대한 좋은 소개를 제공합니다.
이 솔루션에 도달하기까지 많은 연구와 시행착오를 거쳤으며, 매우 안정적이고 정확한 결과를 얻을 수 있었습니다. 이는 플레이어가 게임 속도를 실시간보다 최대 5배 빠르게 제어할 수 있다는 점에서 중요합니다.
이 모든 작업은 컴퓨팅 셰이더를 사용하여 GPU에서 수행합니다. GPU는 각 그리드 포인트를 병렬로 업데이트하는 데 매우 효율적이기 때문에 이 작업에 매우 적합합니다.
또한 유체 시뮬레이션의 출력을 사용하여 표면 위에 거품 층을 시뮬레이션하여 거품을 동적으로 추가하고 물의 흐름에 따라 거품을 이동시킵니다.
이 모든 과정을 통해 우리 또는 플레이어가 던지는 모든 것에 자연스럽게 반응하는 완전히 동적인 물 시뮬레이션을 구현할 수 있습니다.
파도 만들기
파크 게스트가 만드는 파도 외에도 플레이어가 수영장 측면에 파도 기계를 배치하여 파도 풀을 만들 수 있습니다. 플레이어는 이러한 방식으로 흥미롭고 재미있는 파도 패턴을 만들 수 있으며, 이미 이 도구를 창의적으로 사용하는 것을 많이 보았습니다.
파도 기계의 파도가 게스트의 상호작용으로 생성되는 파도보다 훨씬 크기 때문에 다른 유체 시뮬레이션을 추가로 활용했습니다.
여기서 사용한 모델은 게스트 상호작용에 사용된 모델보다 훨씬 간단합니다. 제임스 오브라이언과 제시카 호진스(1995)의 “튀는 유체의 동적 시뮬레이션”에 소개된 소위 “정수압 파이프 모델”을 기반으로 각 수영장을 1미터 단위의 셀 그리드로 세분화했습니다. 그런 다음 각 셀은 가상의 '파이프'를 통해 네 개의 이웃 셀과 연결되며, 각 이웃 셀 사이의 높이 차이에 따라 물이 자유롭게 흐르게 됩니다. 주기적으로 웅덩이에서 물을 빼냈다가 다시 넣으면서 저점과 고점을 만드는 방식으로 파도를 만드는 것은 아주 간단합니다. 이는 실제 파도 기계가 작동하는 방식과 비슷합니다!
이 시뮬레이션은 게임플레이(게스트가 파도에 반응)에 영향을 미치기 때문에 CPU에서 구현하기로 결정했습니다. 각 풀은 자체 시뮬레이션을 실행하므로 한 공원에 여러 개의 풀이 있는 경우 작업을 여러 스레드에 쉽게 분산할 수 있습니다. 하지만 수영장이 매우 큰 경우에는 상황이 조금 더 까다로워지는데, 수영장의 크기에 대한 유일한 제한은 플레이 가능한 영역의 크기뿐입니다. 또한 매 프레임마다 시뮬레이션을 실시간으로 업데이트해야 합니다.
단일 시뮬레이션을 여러 스레드에 배포하려면 복잡한 동기화 코드가 필요합니다. 대신 SIMD 명령어 세트를 많이 활용합니다. SIMD는 단일 명령어, 다중 데이터의 줄임말로, 단 하나의 CPU 명령어로 여러 값에 대해 동일한 연산(예: 곱셈)을 수행할 수 있습니다. 즉, 단 한 번의 연산으로 여러 그리드 포인트를 병렬로 업데이트할 수 있습니다! 이 코드의 대부분은 수작업으로 조정되었으며, 거대한 풀이 있는 대규모 공원에서도 게임이 항상 원활하게 실행되도록 지속적으로 성능 테스트를 거쳤습니다.
실제로 파도 시뮬레이션이 매우 효율적이어서 섬과 해안선 레벨의 해안 파도에도 사용하기로 결정했습니다.
모든 것이 함께 흐르는 방식
이 심층 분석에서는 물의 다양한 측면을 모델링하는 여러 시스템에 대해 이야기했습니다. 유니티는 매우 세밀한 수면 렌더링을 구현하여 가까이서 보더라도 물 표면을 3차원으로 표시할 수 있었습니다. 최첨단 유체 시뮬레이션은 잔물결, 흐름, 거품을 역동적이고 자연스럽게 애니메이션화합니다. 마지막으로 간단하지만 효율적인 파도 시뮬레이션을 통해 파도 풀과 해안선까지 생생하게 구현할 수 있습니다.
이 모든 시스템에는 각자의 초점이 있으며, 각 시스템의 강점을 결합하여 매우 디테일하고 몰입감 넘치며 창의적인 워터파크를 제작할 수 있습니다.
읽어주셔서 감사드리며, 플래닛 코스터 2의 워터 렌더링과 물리학에 대해 알아보는 시간이 즐거우셨기를 바랍니다! 다양한 워터 시스템이 어떻게 작동하고 상호 작용하는지 더 명확하게 이해하셨기를 바라며, 저희가 설명한 기법 중 일부가 여러분의 작업에 유용하거나 영감이 될 수 있기를 바랍니다.
또한 이 글에서 게임은 수많은 움직이는 부품으로 구성된 복잡한 기계라는 점을 기억해 주셨으면 합니다. 이러한 부품 중 일부는 다른 부품보다 더 복잡할 수 있지만, 모두 함께 작동하여 최종 경험을 만들어냅니다. 처음부터 낙담하지 마세요. 대신 게임의 개별 구성 요소를 파악하고 이를 반복해 보세요. 많은 경우 간단한 접근 방식을 먼저 시도하면 이미 놀라운 결과를 얻을 수 있으므로 더 복잡한 부분을 반복할 시간을 더 많이 확보할 수 있습니다.
* 원문:
Deep Dive: Crafting detailed and dynamic water in Planet Coaster 2
'Try simple approaches first; in many cases, such an approach will already yield amazing results, leaving you more time to iterate on the more complex areas.'
www.gamedeveloper.com
* 게임 사이트:
Save 20% on Planet Coaster 2 on Steam
Build and customise thrilling roller coasters and incredible water slides, manage the ultimate theme park experience, and share your epic creations. Are you ready to ride the wave?
store.steampowered.com
'게임개발 > 가마수트라' 카테고리의 다른 글
멀티플레이어 게임을 위한 몰입형 시뮬레이션 트릭을 적용한 'Thick as Thieves' (3) | 2024.12.25 |
---|---|
로봇 슈팅 게임에서 '공정한' 자동 조준 시스템을 만드는 방법 (1) | 2024.12.21 |
'The Last Humble Bee' 포스트모템: 1인 개발에서 제정신 유지하기 (2) | 2024.12.12 |
'슬리터헤드'(Slitterhead) 크리에이티브 디렉터 토야마 케이이치로, 자신만의 독특한 영향력에 대해 이야기합니다. (0) | 2024.12.03 |
게임 개발과 Steam 퍼블리싱을 위한 생존 가이드 (4) | 2024.12.02 |
댓글