이번에 작성할 내용은 Material을 사용한 물 표현과 Water Plugin, Gerstner & Buoyancy 이다.
물을 표현하기 위해 다음과 같은 기능을 만들었다.
물 표면의 일렁임을 표현하기 위해 Panner Node를 사용했다.
Panner Node는 Texture의 UV 좌표를 시간에 따라 이동시키는 Node이다.
Normal Texture의 UV를 Panner Node를 사용하여 움직인다면 물이 이동하는 듯한 느낌을 줄 수 있다.

이때 BlendAngleCorrectedNormals Node를 사용하여 단일 Texture가 아닌 다른 Texture와 Blend하여 Normal로 적용하면 물 표면이 일렁거리는 듯한 느낌의 Material을 만들 수 있다.


물에 물체가 들어갔을 때 물체 주변으로 파동이 생긴다.
이를 위해 DistanceToNearestSurface Node를 사용하여 Material이 적용된 Plane에 특정 물체가 닿았을 때 파동이 생기는 기능을 만들었다.

DistanceToNearestSurface 값을 100으로 나눠 범위를 제한했고, Saturate를 통해 0~1 사이의 값으로 변환시켜주었다.
파동 형태로 나타나야하므로 Time과 Sine Node를 사용했다.
이 값을 Lerp의 Alpha 값으로 지정하여 물체에서 먼 곳은 항상 물 색상으로, 물체와 가까운 곳은 파동 형태로 나타나도록 했다.


SingleLayerWaterMaterial은 아래와 같다.

Scatter와 Absorption은 간단하게 만들었다.

Coefficient 값을 조절하여 마음에 드는 물 색상을 정하면 된다.

PhaseG는 간단하게 테스트해보고 넘어갔다.
ColorScaleBehindWater는 수면 아래의 색상을 조절하는 값이지만 Texture를 추가하여 Water Caustic을 표현할 수 있다.


SingleLayerWaterMaterial은 이렇게 설정하면 되고, 미세한 값을 임의로 조절하여 마음에 드는 색상을 만들면 된다.
이후 위에서 만들었던 조건을 이 Material에 추가하면 된다.
먼저, 2번 조건에서 만든 파동을 Refraction에 추가하면 다음과 같이 표현된다.

물체 주변에 물의 파동이 나타나고 있다.
다음으로, 1번 조건을 Normal에 적용하면 다음과 같이 표현된다.

3가지를 모두 적용하니 제법 그럴싸한 Water Material이 만들어졌다.
여기에 추가로 Opacity에 Texture를 적용하여 거품 표현도 할 수 있다.


지금은 Texture로 인해 이상하게 보일 수 있지만 적절한 Texture를 찾으면 자연스러운 거품처럼 표현될 것이다.
DistanceToNearestSurface을 사용하면 물체 주변에만 거품이 생기도록 할 수도 있다.


위 모든 효과를 적용한 Material은 아래와 같다.
BehindWater 적용 | BehindWater 미적용 |
|---|
개인적으로 BehindWater를 미적용한게 더 이쁜 것 같다.
다음은 Water Plugin이다.
Water Plugin은 Landscape 기반으로 작동하므로 Landscape를 생성한 후 Water Ocean을 Drag & Drop 하면 다음처럼 생성된다.



Landscape의 Landmass에서 다뤘던 것처럼 Spline을 조절하여 맵 모양을 조절할 수 있다.
또한 Ocean Lake, Ocean River, Ocean Island 등을 배치하여 맵을 디자인할 수 있다.

추가로 각 Water Instance의 Material과 Water Wave Asset의 값을 조절하여 마음에 드는 맵, 바다, 파도 등을 만들 수 있다.
Gerstner Wave는 실제 바다 표면의 파형을 매우 현실감 있게 재현하는 수학 모델이다.
Unreal Engine에서는 ComputeGerstnerWaves Node를 통해 값을 가져와서 사용할 수 있다.
ComputeGerstnerWaves를 World Position Offset에 연결하고 Material을 생성하여 Instance를 만든 후, UseFixedWaterDepth를 활성화하면 물체가 파도의 흐름에 맞춰 이동하는 듯한 연출을 볼 수 있다.

Buoyancy는 부력인데, Engine - Plugins - Water - Blueprint - BP_BuoyancyExample를 통해 살펴볼 수 있다.

이 Actor를 바다에 올려놓으면 실제 부력에 의해 물체가 흔들리고 바다에 떠다니는 듯한 모습을 볼 수 있다.

내가 원하는 Mesh에 위 효과를 적용하려면 Example Blueprint Class를 복사하고 이 내가 원하는 Mesh로 변경하면 된다.
이때 변경한 Mesh에 맞춰 부력 Point를 재지정해줘야 한다.
Blueprint Class를 열고 Viewport에서 Buoyancy Component를 클릭하고 Details를 보면 Buoyancy Data를 설정하는 곳이 있다.

이 Buoyancy Data의 각 Index는 부력이 작용하는 지점의 값을 설정할 수 있다.
위 사진에서 보이는 하얀 Cube는 부력 지점 눈으로 보고 설정하기 위해 임의로 배치한 것이다.
이렇게 부력 Point를 설정하고 나면 해당 Point를 기반으로 물체가 부력을 받는다.
