NgtpWater
import { ChangeDetectionStrategy, Component } from '@angular/core';import { PostprocessingWrapper } from '@postprocessing/wrapper.ts';import { NgtCanvas, provideNgtRenderer } from 'angular-three/dom';import { SceneGraph } from './scene-graph';
@Component({ selector: 'app-water', template: ` <ngt-canvas [camera]="{ position: [0, 0, 5], fov: 50 }"> <app-postprocessing-wrapper *canvasContent [lights]="true"> <app-scene-graph /> </app-postprocessing-wrapper> </ngt-canvas> `, changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'water-demo relative block h-full' }, imports: [NgtCanvas, PostprocessingWrapper, SceneGraph],})export default class Water { static clientProviders = [provideNgtRenderer()];}import { ChangeDetectionStrategy, Component, CUSTOM_ELEMENTS_SCHEMA, ElementRef, viewChild } from '@angular/core';import { beforeRender, NgtArgs } from 'angular-three';import { NgtpEffectComposer, NgtpHueSaturation, NgtpVignette, NgtpWater } from 'angular-three-postprocessing';import * as THREE from 'three';
@Component({ selector: 'app-scene-graph', template: ` <ngt-mesh #mesh> <ngt-icosahedron-geometry *args="[1.2, 2]" /> <ngt-mesh-standard-material color="#1abc9c" /> </ngt-mesh>
<ngtp-effect-composer> <ngtp-water [options]="{ factor: 0.4 }" /> <!-- Blue tint for underwater feel --> <ngtp-hue-saturation [options]="{ hue: 0.3, saturation: 0.2 }" /> <ngtp-vignette [options]="{ darkness: 0.5 }" /> </ngtp-effect-composer> `, schemas: [CUSTOM_ELEMENTS_SCHEMA], changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgtArgs, NgtpEffectComposer, NgtpWater, NgtpHueSaturation, NgtpVignette],})export class SceneGraph { private meshRef = viewChild.required<ElementRef<THREE.Mesh>>('mesh');
constructor() { beforeRender(({ delta }) => { const mesh = this.meshRef().nativeElement; mesh.rotation.x += delta * 0.2; mesh.rotation.y += delta * 0.3; }); }}The water effect creates animated underwater-like distortion, simulating the visual effect of looking through water or heat haze.
import { NgtpEffectComposer, NgtpWater } from 'angular-three-postprocessing';
@Component({ template: ` <ngtp-effect-composer> <ngtp-water [options]="{ factor: 0.5 }" /> </ngtp-effect-composer> `, imports: [NgtpEffectComposer, NgtpWater],})export class SceneGraph {}Options
Section titled “Options”| Property | Type | Default | Description |
|---|---|---|---|
factor | number | 0 | Distortion intensity (0 = no effect) |
Example: Heat Haze
Section titled “Example: Heat Haze”@Component({ template: ` <ngt-mesh [position]="[0, 0, -5]"> <ngt-plane-geometry *args="[10, 10]" /> <ngt-mesh-standard-material color="orange" /> </ngt-mesh>
<ngtp-effect-composer> <!-- Subtle distortion for heat haze effect --> <ngtp-water [options]="{ factor: 0.1 }" /> </ngtp-effect-composer> `, imports: [NgtpEffectComposer, NgtpWater, NgtArgs], schemas: [CUSTOM_ELEMENTS_SCHEMA],})export class SceneGraph {}factor: 0disables the effect completely- Higher values create more pronounced ripple distortion
- The effect is animated automatically
- Combine with blue color grading for underwater scenes
- Use subtle values (0.05-0.15) for heat haze effects
- Works well with
NgtpChromaticAberrationfor enhanced underwater look