Impulse
Fire an impulse from anywhere in your game, and every camera listening to it reacts. Impulses live in an ImpulseField. The shared impulseField is enough unless you want separate event streams:
import { impulseField, ImpulseShapes } from '@pmndrs/klipp';
function onExplosion(position: [number, number, number]) {
impulseField.generate({
position,
direction: [0, 0.5, 0],
shape: ImpulseShapes.explosion,
radius: 5,
dissipationDistance: 15,
});
}
A camera reacts once it has an ImpulseListener, a Noise.
Generating an impulse
Listener settings
Adding a rattle
An impulse on its own only pushes the camera. shake adds rotation and jitter that grows and fades with it. It's a BasicMultiChannelPerlin whose amplitudeGain follows the impulse strength.
Camera-relative impulses
By default direction is in world space, which suits explosions: the camera gets pushed away from where it happened. For recoil or a landing thump, use cameraSpace so the same direction always kicks the same way on screen.
Usage
import { ImpulseListenerNoise } from '@pmndrs/klipp';
camera.addNoise(new ImpulseListenerNoise());
Adding a rattle
import { BasicMultiChannelPerlinNoise } from '@pmndrs/klipp';
const shake = new BasicMultiChannelPerlinNoise({ positionAmplitude: [0.1, 0.1, 0.1], rotationAmplitude: [4, 4, 4] });
camera.addNoise(new ImpulseListenerNoise({ shake }));
Camera-relative
impulseField.generate({ position: [0, 0, 0], direction: [0, 0.3, 0.1], shape: ImpulseShapes.recoil });
camera.addNoise(new ImpulseListenerNoise({ cameraSpace: true }));
import { ImpulseListenerNoise } from '@pmndrs/klipp';
camera.addNoise(new ImpulseListenerNoise());
Adding a rattle
import { Vector3 } from 'three';
import { BasicMultiChannelPerlinNoiseThree } from '@pmndrs/klipp/three';
const shake = new BasicMultiChannelPerlinNoiseThree({ positionAmplitude: new Vector3(0.1, 0.1, 0.1), rotationAmplitude: new Vector3(4, 4, 4) });
camera.addNoise(new ImpulseListenerNoise({ shake }));
Camera-relative
impulseField.generate({ position: [0, 0, 0], direction: [0, 0.3, 0.1], shape: ImpulseShapes.recoil });
camera.addNoise(new ImpulseListenerNoise({ cameraSpace: true }));
import { Noise } from '@pmndrs/klipp/react';
<VirtualCamera name="follow" priority={10}>
<Body.Follow target={playerRef} offset={[0, 3, 8]} />
<Aim.HardLookAt target={playerRef} />
<Noise.ImpulseListener />
</VirtualCamera>
ref gives you the ImpulseListenerNoise.
With frameloop="demand", call invalidate() after generate(). See On-demand rendering.
Adding a rattle
shake takes the noise's settings instead of the noise itself:
<Noise.ImpulseListener shake={{ positionAmplitude: [0.1, 0.1, 0.1], rotationAmplitude: [4, 4, 4] }} />
Camera-relative
<Noise.ImpulseListener cameraSpace />