node package manager
Don’t reinvent the wheel. Reuse code within your team. Create a free org »



manipulate voxel-physical objects using a state object. implements basic FPS controls. is a through stream of sorts -- it relies on voxel-engine to call control.tick(dt) to start producing events. it will buffer events when paused.


// default values are in terms of 1 voxel width 
{ speed: Number(0.0032)                 // starting speed 
, walkMaxSpeed: Number(0.0056)          // max walking speed 
, runMaxSpeed: Number(0.0112)           // max running speed 
, jumpMaxSpeed: Number(0.016)           // max jump speed 
, jumpMaxTimer: Number(200)             // maximum amount of time jump will be applied in MS 
, jumpSpeed: Number(0.004)              // starting jump speed 
, jumpSpeedMove: Number(0.1)            // velocity modifier to use when moving laterally while in the middle of a jump 
, accelTimer: Number(200)               // time to reach full speed on X/Y 
, accelerationCurve: Function()         // function(current, max) -> [0-1] 
                                        // defaults to a sin curve. 
, airControl: Boolean(true)             // can player control direction without being on the ground? 
, fireRate: Number(0)                   // MS between firing 
, discreteFire: Boolean(false)          // does firing require mousedown -> mouseup, or can it be held? 
, onfire: Function()                    // function(state) -> undefined 
, rotationXMax: Number(33)              // maximum x rotation in a tick 
, rotationYMax: Number(33)              // maximum y rotation in a tick 
, rotationZMax: Number(33)              // maximum z rotation in a tick 
, rotationMax: Number(33)               // maximum rotation in a tick -- other  
                                        // rotation maximums fallback to this value 
, rotationXClamp: Number(Math.PI / 2)   // clamp x rotation to +/- this value 
, rotationYClamp: Number(Infinity)      // clamp y rotation to this value 
, rotationZClamp: Number(0)             // clamp z rotation to this value 
, rotationScale: Number(0.002) }        // constant scale of rotation events, applied during tick 


control(state, opts) -> Control

state is a state object (probably supplied by kb-controls).

opts is an object optionally containing any of the above.

Control#target(target?) -> target

target is the object to be manipulated. Assumed to have .acceleration, .velocity, and .atRestY() -> -1, 0, 1.

if a target is passed, set control to target that argument.

return the current target.

Control#tick(dt) -> undefined

advance the simulation. if there are any listeners for 'data', it will either buffer or emit a data event containing the control state at this tick.

interactStream.pipe(controls) -> controls

the interact module emits dx/dy/dz modifications from mouse movements / pointer lock; it can be piped to this stream.