굴절 패스로 섬 주변이 실제로 보이게 되자 해안이 밋밋했습니다. 파도가 해변에 그냥 스며들었습니다.

부서지는 자리를 바다가 정합니다

처음 떠오르는 방법은 섬 둘레에 고리를 하나 그려 놓고 거기서 부서지게 하는 것입니다. 그러면 강풍일 때 모래 위에서 파도가 부서집니다.

파도는 자기 파고에 견줄 만한 수심에 오면 부서집니다. 그러니 그 선은 해변의 성질이 아니라 바다의 성질입니다. 파고를 0.78로 나눈 값의 수심 등고선으로 잡았습니다.

미풍이면 수심 1.5m 부근, 파고 6.2m의 강풍이면 8m까지 밀려 나옵니다. 날씨를 바꾸면 쇄파선이 저절로 따라 움직입니다.

그런데 한 번도 안 부서졌습니다

FFT 바다는 깊은 바다의 스펙트럼을 어디서나 같은 진폭으로 평가합니다. 실제 바다에서 얕은 곳에 오면 파도가 높아지는 천수 효과가 여기엔 없습니다.

그래서 쇄파선까지 온 마루의 높이가 0.612m였습니다. 부서지는 기준은 0.63m입니다. 아슬아슬하게 못 미쳐서 한 번도 안 부서졌습니다.

수심이 얕아질수록 파고가 커지는 관계식(Green의 법칙)을 적용했습니다. 다만 판정에만 씁니다. 실제로 그려지는 수면은 여전히 천수 보정이 안 되어 있으므로, 보정한 높이에 물보라를 만들면 물 위에 떠 버립니다.

물보라가 튀어 나가는 속도는 얕은 물에서의 파속을 씁니다. 그게 곧 부서지는 마루가 실제로 가진 물의 속도입니다.

배가 섬을 뚫고 지나갔습니다

지형 충돌이 아예 없었습니다. 섬이 보이는데 그냥 통과했습니다.

부력에 쓰는 것과 같은 프로브에 접촉을 걸었습니다. 이 프로브들은 이미 배 바닥의 모양을 서술하는 점들이라, 따로 충돌 모양을 만들 필요가 없습니다.

공짜로 딸려 오는 게 있습니다. 완만한 해변에는 뱃머리부터 얹히고, 한쪽 바닥 밑에만 바위가 있으면 그쪽으로 기웁니다. 접촉 규칙을 하나 걸었을 뿐인데 좌초의 자세가 지형에 따라 달라집니다.

실측으로 14노트로 돌진해 수심 0.8m에서 접지, 3.5초 만에 정지, 후진으로 빠져나옵니다.

항적은 현재 상태로 재구성되지 않습니다

배가 지나간 자리에 남는 V자 항적을 넣었습니다. 여기서 두 가지가 걸렸습니다.

포말 텍스처에 그리면 안 됩니다. 포말은 18m·96m·512m로 타일링되는 캐스케이드라, 거기에 항적을 넣으면 모든 타일에 복제됩니다. 바다 전체에 같은 항적이 격자로 깔립니다. 별도 버퍼를 두고 텍셀 단위로 스냅해 스크롤합니다.

V자는 이력에서 복원해야 합니다. 40m 뒤의 항적 위에 있는 점은 배가 거기 있었을 때 생겨서 계속 밀려난 것입니다. 지금의 위치와 속도만으로는 만들 수 없습니다. 항주 이력을 따라가며 복원합니다.

V자의 벌어진 각도는 임의로 정하지 않았습니다. 깊은 바다에서 파도의 속도가 파장에 따라 달라지는 관계에서 나오는 상수입니다.

여기서 한참 헤맨 건 훨씬 시시한 이유였습니다. 항적을 쌓는 패스에서 화면 지우기를 꺼야 하는데 켜 둬서, 매 프레임 누적분이 지워지고 있었습니다.

섬은 거리를 재기 전에 비틀어야 합니다

섬을 돔 모양에 노이즈를 곱해서 만들면 높이만 울퉁불퉁해지고 윤곽과 등심선은 원형으로 남습니다. 물속에서 보면 청록색 원반입니다.

거리를 재기 전에 좌표계 자체를 비틀었습니다. 그리고 반경과 경사 프로파일을 방향에 따라 달라지게 두니, 한 섬 안에 완만한 해변과 절벽이 같이 생깁니다. 실측 방위별 육지 반경 22~106m입니다.

야자수 잎도 다시 만들었습니다. 통짜 잎은 아무리 접어도 노처럼 보이고 하늘이 안 비칩니다. 잎줄기에 작은 잎 15쌍이 개별로 붙는 구조로 바꿨습니다.

안전장치 하나

굴절 패스가 실행 중에 바다와 하늘의 표시 여부, 그리고 톤맵 설정을 바꿉니다. 그런데 복구가 보장되어 있지 않았습니다.

실제로 중간에 끊겨서 바다도 하늘도 없이 톤맵이 꺼진 채 굳은 상태를 만들었습니다. 새로고침 말고는 돌아올 방법이 없었습니다. 무슨 일이 있어도 원상복구되도록 감쌌습니다.

전역 상태를 잠깐 바꾸는 코드는 그 되돌림을 예외 상황에서도 보장해야 합니다. 정상 경로에서만 되돌리면, 되돌리지 못하는 날이 정확히 가장 곤란한 날입니다.