전체 글
제품 업데이트 · 8 min read

제대로 행동하는 물: Numivo Water 첫인상

Unreal Engine용 Numivo Water 첫인상: 참조 사진에 견주어 판정되는 영화 품질의 바다·호수·수중·동굴, 물리 기반 빛과 거품, 그리고 어떤 물체든 설정 없이 뜨거나 가라앉게 하는 Drop-a-Mesh 부력을 다룬다.

Illustration of a stylised sea with a floating crate and a sinking statue

우리는 Unreal Engine용 물 시스템을 두 가지 약속과 함께 만들고 있습니다: 올바르게 보이는 물(빛·색·거품이 물리적으로 계산되기 때문이며, 씬마다 손으로 튜닝되는 것이 아닙니다)과 제대로 행동하는 물: 어떤 메시든 표면에 떨어뜨리면 설정 없이 올바르게 뜨거나, 기울거나, 가라앉습니다. 활발히 개발 중입니다. 이 글은 그것이 무엇을 다루는지, 참조 사진으로 우리 자신을 어떻게 책임 지우는지, 왜 부력이 모두가 건너뛰는 어려운 부분인지, 그리고 나머지 툴킷 옆 어디에 자리하는지를 설명합니다.

바위투성이 해안에 부딪혀 폭발하는 폭풍 파도 넘어야 할 기준. 무엇이 이것을 진짜로 만드는지 보세요: 부서지는 파도에서 태어난 거품, 절벽을 갉아먹는 안개, 너울 전반의 백파 통계. 어느 것도 손으로 배치되지 않았고, 모두 물리입니다. 그것이 우리가 세운 잣대입니다.

왜 또 다른 물 시스템인가?

대부분의 게임 물은 정확히 하나의 조명 조건에서만 훌륭해 보입니다: 스토어 스크린샷의 그것입니다. 태양을 옮기고, 흐림으로 전환하고, 카메라를 물선 절반 아래로 내려보면, 무너집니다.

똑같이 중요한, 더 조용한 실패가 하나 더 있습니다: 거의 모든 물 시스템이 떠 있는 물체를 나중에 붙인 생각처럼 다룹니다. 보트 템플릿, 폰툰 리깅 지침 한 페이지, 그리고 아무도 무작위 상자를 바다에 던지지 않을 것이라는 말없는 가정을 얻습니다. 플레이어는 끊임없이 상자를 바다에 던집니다.

우리는 현재 하나의 패키지에 공존하지 않는 두 가지를 원했습니다: 어떤 조명도 살아남는 영화 품질의 외관, 그리고 어떤 설정도 필요 없는 물리적 행동. 둘 다 스크린샷이 예뻐 보일 때까지 파라미터를 만지작거려 달성되지 않습니다: 스크린샷은 하나의 태양 아래 한 프레임이고, 둘 중 하나가 바뀌는 순간, 취향에 맞춰 튜닝된 물은 이음새를 드러내기 때문입니다. 그래서 프로젝트의 토대는 기능 목록이 아닙니다. 인간이 논쟁할 수 없는 수용 테스트입니다: 한 장의 사진.

취향이 아니라 사진에 견주어 판정된다

개발은 고정된 카메라·조명 계약을 가진 참조 사진으로 게이팅됩니다: 물리적 빛 단위, 잠긴 톤매퍼, 그리고 합격 또는 불합격을 정하는 지각적 차이 지표이며, 그날 아트 디렉터의 기분이 아닙니다.

두 참조가 정전(正典)이며, 서로 반대가 되도록 선택되었습니다:

  • 맑은 호수, 카메라는 물선 안. 절반은 공기, 절반은 물, 아티팩트 띠 없는 물결치는 경계; 거리와 함께 색이 깊어지는 녹색빛 해안형 물; 위의 표면과 일치하는 바위의 코스틱; 경계면에서 올바르게 굴절하는 잠긴 통나무. 이것은 굴절, 물선 통과, 수중 색 흡수를 한꺼번에 시험합니다.
  • 완전한 흐림 아래의 폭풍 해안. 태양 없음, 반짝임 띠 없음: 바다는 부드러운 하늘 반사, 채도 낮은 회녹색, 백파 통계, 그리고 절벽 위의 안개를 통해 읽혀야 합니다. 부표가 그럴듯한 주기와 기울기로 너울을 탑니다; 행동은 정지 이미지뿐 아니라 수용의 일부입니다.

흐림 참조는 의도적으로 둘 중 하나입니다. 햇빛 받은 물은 지구상 모든 렌더러를 치켜세웁니다. 스페큘러 반짝임이 수많은 죄를 숨깁니다. 태양을 없애면, 물은 반사 거칠기, 색, 움직임만으로 프레임을 짊어져야 합니다. 그것이 정직한 시험이고, 대부분의 시스템이 조용히 피하는 것입니다. 햇빛에서만 좋아 보이는 바다는 출시되지 않습니다.

카메라 쪽은 물 쪽만큼 엄격하게 지정됩니다. 사진 비교는 카메라가 속일 수 없을 때만 공정하기 때문이죠. 그것은 진짜 물리적 빛 강도(임의의 밝기 슬라이더가 아니라, 정오 태양 약 100,000 럭스), 고정 노출, 그리고 참조당 고정 톤매핑·블룸 구성을 의미합니다. 톤매퍼를 바꾸면 어떤 물이든 어떤 사진에도 맞출 수 있습니다. 바로 그래서 톤매퍼를 먼저 못 박습니다.

Drop-a-Mesh: 숙제 없이 뜨기

어떤 메시든 Numivo 물체로 끌어다 놓으면 즉시 올바르게 행동합니다: 시스템이 물리 프록시를 자동으로 짓고, 실제 파고에서 프레임마다 밀어낸 부피를 계산하며, 실제 밀도에서 뜨거나-가라앉는지를 도출합니다.

맑은 파란 물을 통해 보이는 산호초 수중은 포스트프로세스가 아니라 하나의 장소입니다. 색은 깊이와 함께 흡수되고, 빛은 기둥으로 걸러져 내려오며, 머리 위 경계면은 깔끔하게 건너져야 합니다. 호수 참조는 이 셋을 한꺼번에 정직하게 유지하기 위해 존재합니다.

통나무가 뜨고 긴 쪽으로 굴러갑니다. 상자가 까딱입니다. 돌 조각상이 가라앉습니다. 리깅 없음, 폰툰 배치 없음, 스크립트 없음. 후드 아래에서는:

  • 충돌 형상이 물체의 실제 부피를 재기 위해 자동으로 복셀화됩니다: 비동기로, 그리고 에셋별로 캐시되어 한 번만 일어납니다;
  • 부력은 프레임마다 물리적으로 계산됩니다: 밀어낸 부피를 물의 밀도에 대해. 민물과 소금물은 실제로 다릅니다(소금물이 더 밀도가 높아, 같은 상자가 호수보다 바다에서 더 높이 뜹니다);
  • 뜨거나-가라앉는지는 밀도에서 나옵니다, 질량 나누기 프록시 부피: 기본값으로 "이게 떠야 하나?" 체크박스는 없습니다. 기본값이 바로 물리이기 때문입니다;
  • 안정성은 나타납니다: 프록시의 부피가 어떻게 분포되는가로부터. 위가 무거운 상자는 뒤집히고, 용골에 무게를 둔 선체는 스스로 바로 서고, 널빤지는 평평하게 눕습니다;
  • 떠 있는 물체는 표면으로 되먹임됩니다: 잔물결, 항적, 물선의 거품 고리, 그리고 충돌 시 물보라 효과로.

액터에는 오버라이드용 작은 패널이 있습니다(뜨기 강제, 가라앉기 강제, 감쇠 슬라이더, 항적·물보라 토글). 하지만 오버라이드는 물리를 대체하는 대신 물리를 스케일합니다. 바위를 뜨도록 강제해도 여전히 올바른 주기로 까딱이고 올바른 항적을 남깁니다; 그저 더 가벼운 것처럼 행동할 뿐입니다. 이 구분이 중요합니다: 솔버를 무시한 강제 결과는 평면에 붙인 프롭 처럼 보이고, 플레이어는 즉시 알아챕니다.

디자인 목표는 단도직입적이고, 라이브로 실행할 수 있기를 바라는 데모입니다: 누군가 무작위 프롭 스무 개를 바다로 끌어다 놓으면, 모든 것이 그냥 행동합니다. 먼저 설정 창을 하나도 열지 않고요. 그 데모에 튜토리얼이 필요하다면, 그 기능은 실패한 것입니다.

무엇을 다루는가

해안 근처 물, 열린 바다, 수중, 동굴 못이 모두 일급입니다: 너울과 교차 바다가 분리된 스펙트럼 기반 파도, 실제로 부서지는 파도에서의 거품, 수중 광선 기둥을 구동하는 코스틱, 그리고 시네마틱 효과 아래의 안정성이 그렇습니다.

물에 신경 쓴다면 중요한 세부:

  • 파도는 해양학적 스펙트럼에서 나옵니다(실제 바다를 기술하는 데 쓰이는 것과 같은 통계 모델), 방향성 확산과 독립적으로 제어 가능한 너울과 함께. 해상 상태는 날씨 결정이 됩니다("다가오는 폭풍, 서쪽에서 오는 긴 너울"), 폭풍처럼 보일 때까지 미는 서른 개의 연결 없는 슬라이더 대신에요.
  • 거품은 그린 마스크가 아닙니다. 파도가 실제로 부서지는 곳에서 생기고, 시간이 지나며 낡고, 바람 아래 줄무늬를 긋습니다. 그린 거품은 가짜 물의 가장 흔한 티입니다. 표현해야 할 물리와 함께 움직이지 않기 때문이죠.
  • 수중은 진짜 장소입니다. 깊이에 따른 올바른 색 흡수(빨강이 먼저, 다음 초록이 사라지고, 다이빙 영상에서 누구나 아는 깊은 파랑을 남김), 바닥을 밝히는 것과 같은 코스틱 필드에서 도출된 광선 기둥, 그리고 고전적인 딱딱한 아티팩트 띠 없는 물선에서의 통과.
  • 동굴 못은 자기만의 처리를 받습니다(고요하거나 거의 움직이지 않는 물, 물방울의 교란, 반쯤 어둠 속의 반사). 잔잔한 내부 못은 열린 바다와 다른 실패를 드러내기 때문입니다.
  • 시네마틱은 수용 기준이지 나중에 붙인 생각이 아닙니다. 표면은 피사계 심도, 모션 블러, 필름 그레인 아래에서 안정을 유지해야 합니다: 그레인을 적용해야 나타나는 스페큘러 fireflies 없음, 느린 카메라가 스트로빙으로 바꾸는 일렁임 없음이 그것입니다.

왜 부력이 모두가 건너뛰는 부분인가

외관은 좋은 셰이더로 흉내 낼 수 있지만 행동은 안 됩니다: 설득력 있는 뜨고-가라앉기에는 실시간 부피 추정과 안정된 솔버가 필요하고, 이는 정말 어렵기에 대부분의 시스템은 보트 프리팹을 내고 멈춥니다.

불편한 엔지니어링의 진실은, 아름다운 물 셰이더는 풀린 문제이고 범용 부력 솔버는 아니라는 것입니다. 파도의 외관을 흉내 내는 것은 텍스처와 노멀 문제; 임의의, 전에 본 적 없는 메시를 그 파도에 올바르게 앉히는 것은 프레임 속도로 돌고, 빠른 타임스텝을 살아남고, 천 개 삼각형 바위가 폭풍 너울을 만났을 때 폭발하지 않아야 하는 물리 문제입니다. 그 간극이 대부분의 엔진에서 "물"이 "상호작용할 수 없는 예쁜 평면"을 뜻하는 이유이고, 상호작용하는 부분이, 존재한다면, 손으로 만든 보트인 이유입니다.

그 간극을 닫는 것(행동을 외관만큼 자동으로 만드는 것)이 이 프로젝트가 존재하는 이유이고, 주말의 셰이더 작업이 아니라 참조 사진 규율에 진짜 솔버를 더해야 하는 이유입니다.

언제 쓸 수 있나?

Unreal Engine 확장으로 개발 중이며, 단계적 출시입니다: 키네마틱 부유 프리뷰가 완전한 물리 솔버보다 먼저 도착해, 씬을 일찍 채울 수 있습니다. 날짜는 발표하지 않습니다; 언제 끝나는지는 참조 이미지가 정합니다.

단계화는 의도적입니다. 키네마틱 프리뷰(물체가 완전한 힘 시뮬레이션 없이 파면을 따름)가 먼저 와서, 무거운 솔버가 아직 단단해지는 동안 아티스트가 메시를 떨어뜨려 바다를 채울 수 있습니다. 물리가 최종화되기 훨씬 전에 결과를 느낍니다. 완전한 솔버, 자동 프록시, 완전한 패널이 뒤따릅니다. 진행과 마일스톤은 공개 로드맵에 나타나며, 출시 당일의 깜짝이 아닙니다.

그것과 함께 출시될 툴킷(스캐터, 메시 블렌딩, 그리드, 측정)은 오늘 무료로 써볼 수 있습니다. 공개 물 빌드가 존재하는 순간 알림을 받고 싶다면, 사이트에서 링크된 Discord가 가장 먼저 발표되는 곳이며, 참조 이미지의 합격/불합격 비교가 일어나는 대로 게시되는 곳입니다.

미니 FAQ

Numivo의 다른 도구가 필요한가요? 아니요. 같은 계열의 확장이며, 홀로 서도록 설계되었습니다. 다만 같은 원칙을 공유합니다: 결과는 물리적으로 가능한 곳 어디서나 엔진 네이티브 데이터로 베이크되어, 여러분이 만든 것은 여러분의 것입니다.

어떤 엔진 버전? 현재 Unreal Engine 5 릴리스. 세부 사항은 확장이 공개 빌드에 가까워지면서 로드맵에 착지합니다. 지금 약속하고 나중에 수정하는 것이 아니라.

엔진 내장 물과 어떻게 다른가요? 내장 물 시스템은 외관에 강하고 범용 상호작용에 약합니다: 부력은 대개 별도의, 손으로 튜닝된 컴포넌트입니다. 여기서 핵심 전체는 외관과 행동이 하나의 물리적으로 근거한 시스템에서 나온다는 것이며, 참조 사진 게이트가 조명 전반에 걸쳐 외관을 정직하게 유지한다는 것입니다.

왜 출시 전에 발표하나요? 참조 사진 방법 자체가 핵심이기 때문입니다. 아무도 뜯어볼 수 없는 완성품을 공개하기보다, 잣대를 공개적으로 보여주고 그에 견주어 측정되는 편을 택합니다. 이 글이 글로 쓰인 그 잣대입니다. 그것으로 우리를 따져 물으세요.