글

IFFT 기반의 바다 시뮬레이션

이미지
IFFT을 통해 구현한 바다 컴퓨터 그래픽에서 바다를 구현하는 건 마냥 쉬운 일은 아닙니다. 시각적으로 그럴싸한 바다를 만드는 것 자체도 어렵지만, 사용자의 성능 또한 고려해야 한다면 더더욱 어려워지죠.  사인파 (Sine Wave) 가장 단순한 형태로 "바다"를 그린다면 어떤 모양일까요? 아마 사인파 (Sine Wave) 에서 출발하게 될 겁니다. 제가 이전에 구현했었던 Wave 아트워크  역시 이 사인파를 기반으로 만든 메쉬들을 이래저래 겹쳐 움직이도록 한 것이 전부입니다. 물론 이건 추상적인 형태로 바다를 그려낸 것이라 실제 바다에 가깝게 묘사했다고 보기엔 어려움이 있죠. 사인파로 바다를 구현한다고 했을 때에 눈에 띄는 문제점은, 사인파로는 단순히 상하 운동만 처리할 수 있다는 것입니다. 반면 실제 해수면의 물 입자는 단순히 위 아래로 흔들리는 것이 아니라 원형 궤도를 그리며 움직인다는 차이가 있죠.  거스트너 웨이브 (Gerstner Wave) 기존 사인파가 정점의 높이($y$ )만 변화시키는 것과 달리, 거스트너 웨이브는 정점을 파도의 진행방향 $x$와 $z$로도 함께 밀어냅니다. 그 결과 파도의 마루(Peak)는 뾰족해지고 골(Trough)은 넓고 평평해지는 바다 특유의 파형이 만들어집니다. $i$번째 파도가 정점을 얼마나 이동시키는지를 나타내는 변위 벡터  $\Delta \mathbf{P}_i(\mathbf{p}_0, t)$는 아래와 같이 간략하게 나타낼 수 있습니다. $$\Delta \mathbf{P}_i(\mathbf{p}_0, t) = \begin{pmatrix} d_{i,x} \, a_i \cos(f_i) \\ a_i \sin(f_i) \\ d_{i,z} \, a_i \cos(f_i) \end{pmatrix}$$ 여기서 $d_i$는 파도의 진행 방향 , $a_i$ 는 진폭 을 나타내며, $f_i$는 현재 정점 위치 및 시간에서의 위상각 (Phase Angle) 을 나타냅니다. 여기에 기반해서, 최종...