pex-cam
Version:
Cameras models and controllers for 3D rendering in PEX.
404 lines (276 loc) • 15.3 kB
Markdown
# pex-cam
[](https://www.npmjs.com/package/pex-cam)
[](https://www.npmjs.com/package/pex-cam)
[](https://bundlephobia.com/package/pex-cam)
[](https://github.com/pex-gl/pex-cam/blob/main/package.json)
[](https://github.com/microsoft/TypeScript)
[](https://conventionalcommits.org)
[](https://github.com/prettier/prettier)
[](https://github.com/eslint/eslint)
[](https://github.com/pex-gl/pex-cam/blob/main/LICENSE.md)
Cameras models and controllers for 3D rendering in [PEX](https://pex.gl).

## Installation
```bash
npm install pex-cam
```
## Usage
```js
import {
perspective as createPerspectiveCamera,
orbiter as createOrbiter,
} from "pex-cam";
const perspectiveCamera = createPerspectiveCamera({
position: [2, 2, 2],
target: [0, -0.5, 0],
aspect: window.innerWidth / window.innerHeight,
});
const perspectiveOrbiter = createOrbiter({
camera: perspectiveCamera,
});
console.log(perspectiveCamera.projectionMatrix);
```
## API
<!-- api-start -->
## Modules
<dl>
<dt><a href="#module_pex-cam">pex-cam</a></dt>
<dd><p>Re-export classes and factory functions</p>
</dd>
</dl>
## Classes
<dl>
<dt><a href="#Camera">Camera</a></dt>
<dd><p>An interface for cameras to extend</p>
</dd>
<dt><a href="#OrbiterControls">OrbiterControls</a></dt>
<dd><p>Camera controls to orbit around a target</p>
</dd>
<dt><a href="#OrthographicCamera">OrthographicCamera</a> ⇐ <code><a href="#Camera">Camera</a></code></dt>
<dd><p>A class to create an orthographic camera</p>
</dd>
<dt><a href="#PerspectiveCamera">PerspectiveCamera</a> ⇐ <code><a href="#Camera">Camera</a></code></dt>
<dd><p>A class to create a perspective camera</p>
</dd>
</dl>
## Typedefs
<dl>
<dt><a href="#Radians">Radians</a> : <code>number</code></dt>
<dd></dd>
<dt><a href="#Degrees">Degrees</a> : <code>number</code></dt>
<dd></dd>
<dt><a href="#CameraView">CameraView</a> : <code>object</code></dt>
<dd></dd>
<dt><a href="#CameraOptions">CameraOptions</a> : <code>object</code></dt>
<dd></dd>
<dt><a href="#PerspectiveCameraOptions">PerspectiveCameraOptions</a> : <code>object</code></dt>
<dd></dd>
<dt><a href="#OrthographicCameraOptions">OrthographicCameraOptions</a> : <code>object</code></dt>
<dd></dd>
<dt><a href="#OrbiterControlsOptions">OrbiterControlsOptions</a> : <code>object</code></dt>
<dd></dd>
</dl>
<a name="module_pex-cam"></a>
## pex-cam
Re-export classes and factory functions
- [pex-cam](#module_pex-cam)
- [.perspective](#module_pex-cam.perspective) ⇒ [<code>PerspectiveCamera</code>](#PerspectiveCamera)
- [.orthographic](#module_pex-cam.orthographic) ⇒ [<code>OrthographicCamera</code>](#OrthographicCamera)
- [.orbiter](#module_pex-cam.orbiter) ⇒ [<code>OrbiterControls</code>](#OrbiterControls)
<a name="module_pex-cam.perspective"></a>
### pex-cam.perspective ⇒ [<code>PerspectiveCamera</code>](#PerspectiveCamera)
Factory function for perspective camera
**Kind**: static constant of [<code>pex-cam</code>](#module_pex-cam)
| Param | Type |
| ----- | ------------------------------------------------------------------------------------------------------------------ |
| opts | [<code>CameraOptions</code>](#CameraOptions) \| [<code>PerspectiveCameraOptions</code>](#PerspectiveCameraOptions) |
<a name="module_pex-cam.orthographic"></a>
### pex-cam.orthographic ⇒ [<code>OrthographicCamera</code>](#OrthographicCamera)
Factory function for orthographic camera
**Kind**: static constant of [<code>pex-cam</code>](#module_pex-cam)
| Param | Type |
| ----- | -------------------------------------------------------------------------------------------------------------------- |
| opts | [<code>CameraOptions</code>](#CameraOptions) \| [<code>OrthographicCameraOptions</code>](#OrthographicCameraOptions) |
<a name="module_pex-cam.orbiter"></a>
### pex-cam.orbiter ⇒ [<code>OrbiterControls</code>](#OrbiterControls)
Factory function for orbiter controls
**Kind**: static constant of [<code>pex-cam</code>](#module_pex-cam)
| Param | Type |
| ----- | -------------------------------------------------------------- |
| opts | [<code>OrbiterControlsOptions</code>](#OrbiterControlsOptions) |
<a name="Camera"></a>
## Camera
An interface for cameras to extend
**Kind**: global class
<a name="Camera+set"></a>
### camera.set(opts)
Update the camera
**Kind**: instance method of [<code>Camera</code>](#Camera)
| Param | Type |
| ----- | -------------------------------------------- |
| opts | [<code>CameraOptions</code>](#CameraOptions) |
<a name="OrbiterControls"></a>
## OrbiterControls
Camera controls to orbit around a target
**Kind**: global class
- [OrbiterControls](#OrbiterControls)
- [new OrbiterControls(opts)](#new_OrbiterControls_new)
- [.set(opts)](#OrbiterControls+set)
- [.dispose()](#OrbiterControls+dispose)
<a name="new_OrbiterControls_new"></a>
### new OrbiterControls(opts)
Create an instance of OrbiterControls
| Param | Type |
| ----- | -------------------------------------------------------------- |
| opts | [<code>OrbiterControlsOptions</code>](#OrbiterControlsOptions) |
<a name="OrbiterControls+set"></a>
### orbiterControls.set(opts)
Update the control
**Kind**: instance method of [<code>OrbiterControls</code>](#OrbiterControls)
| Param | Type |
| ----- | --------------------------- |
| opts | <code>OrbiterOptions</code> |
<a name="OrbiterControls+dispose"></a>
### orbiterControls.dispose()
Remove all event listeners
**Kind**: instance method of [<code>OrbiterControls</code>](#OrbiterControls)
<a name="OrthographicCamera"></a>
## OrthographicCamera ⇐ [<code>Camera</code>](#Camera)
A class to create an orthographic camera
**Kind**: global class
**Extends**: [<code>Camera</code>](#Camera)
- [OrthographicCamera](#OrthographicCamera) ⇐ [<code>Camera</code>](#Camera)
- [new OrthographicCamera(opts)](#new_OrthographicCamera_new)
- [.set(opts)](#OrthographicCamera+set)
<a name="new_OrthographicCamera_new"></a>
### new OrthographicCamera(opts)
Create an instance of PerspectiveCamera
| Param | Type |
| ----- | -------------------------------------------------------------------------------------------------------------------- |
| opts | [<code>CameraOptions</code>](#CameraOptions) \| [<code>OrthographicCameraOptions</code>](#OrthographicCameraOptions) |
<a name="OrthographicCamera+set"></a>
### orthographicCamera.set(opts)
Update the camera
**Kind**: instance method of [<code>OrthographicCamera</code>](#OrthographicCamera)
**Overrides**: [<code>set</code>](#Camera+set)
| Param | Type |
| ----- | -------------------------------------------------------------------------------------------------------------------- |
| opts | [<code>CameraOptions</code>](#CameraOptions) \| [<code>OrthographicCameraOptions</code>](#OrthographicCameraOptions) |
<a name="PerspectiveCamera"></a>
## PerspectiveCamera ⇐ [<code>Camera</code>](#Camera)
A class to create a perspective camera
**Kind**: global class
**Extends**: [<code>Camera</code>](#Camera)
- [PerspectiveCamera](#PerspectiveCamera) ⇐ [<code>Camera</code>](#Camera)
- [new PerspectiveCamera(opts)](#new_PerspectiveCamera_new)
- [.set(opts)](#PerspectiveCamera+set)
- [.getViewRay(x, y, windowWidth, windowHeight)](#PerspectiveCamera+getViewRay) ⇒ <code>module:pex-geom~ray</code>
- [.getWorldRay(x, y, windowWidth, windowHeight)](#PerspectiveCamera+getWorldRay) ⇒ <code>module:pex-geom~ray</code>
<a name="new_PerspectiveCamera_new"></a>
### new PerspectiveCamera(opts)
Create an instance of PerspectiveCamera
| Param | Type |
| ----- | ------------------------------------------------------------------------------------------------------------------ |
| opts | [<code>CameraOptions</code>](#CameraOptions) \| [<code>PerspectiveCameraOptions</code>](#PerspectiveCameraOptions) |
<a name="PerspectiveCamera+set"></a>
### perspectiveCamera.set(opts)
Update the camera
**Kind**: instance method of [<code>PerspectiveCamera</code>](#PerspectiveCamera)
**Overrides**: [<code>set</code>](#Camera+set)
| Param | Type |
| ----- | ------------------------------------------------------------------------------------------------------------------ |
| opts | [<code>CameraOptions</code>](#CameraOptions) \| [<code>PerspectiveCameraOptions</code>](#PerspectiveCameraOptions) |
<a name="PerspectiveCamera+getViewRay"></a>
### perspectiveCamera.getViewRay(x, y, windowWidth, windowHeight) ⇒ <code>module:pex-geom~ray</code>
Create a picking ray in view (camera) coordinates
**Kind**: instance method of [<code>PerspectiveCamera</code>](#PerspectiveCamera)
| Param | Type | Description |
| ------------ | ------------------- | ----------- |
| x | <code>number</code> | mouse x |
| y | <code>number</code> | mouse y |
| windowWidth | <code>number</code> | |
| windowHeight | <code>number</code> | |
<a name="PerspectiveCamera+getWorldRay"></a>
### perspectiveCamera.getWorldRay(x, y, windowWidth, windowHeight) ⇒ <code>module:pex-geom~ray</code>
Create a picking ray in world coordinates
**Kind**: instance method of [<code>PerspectiveCamera</code>](#PerspectiveCamera)
| Param | Type |
| ------------ | ------------------- |
| x | <code>number</code> |
| y | <code>number</code> |
| windowWidth | <code>number</code> |
| windowHeight | <code>number</code> |
<a name="Radians"></a>
## Radians : <code>number</code>
**Kind**: global typedef
<a name="Degrees"></a>
## Degrees : <code>number</code>
**Kind**: global typedef
<a name="CameraView"></a>
## CameraView : <code>object</code>
**Kind**: global typedef
**Properties**
| Name | Type |
| --------- | --------------------------------- |
| offset | <code>module:pex-math~vec2</code> |
| size | <code>module:pex-math~vec2</code> |
| totalSize | <code>module:pex-math~vec2</code> |
<a name="CameraOptions"></a>
## CameraOptions : <code>object</code>
**Kind**: global typedef
**Properties**
| Name | Type | Default |
| ------------------ | -------------------------------------- | -------------------------- |
| [projectionMatrix] | <code>module:pex-math~mat4</code> | <code>mat4.create()</code> |
| [invViewMatrix] | <code>module:pex-math~mat4</code> | <code>mat4.create()</code> |
| [viewMatrix] | <code>module:pex-math~mat4</code> | <code>mat4.create()</code> |
| [position] | <code>module:pex-math~vec3</code> | <code>[0, 0, 3]</code> |
| [target] | <code>module:pex-math~vec3</code> | <code>[0, 0, 0]</code> |
| [up] | <code>module:pex-math~vec3</code> | <code>[0, 1, 0]</code> |
| [aspect] | <code>number</code> | <code>1</code> |
| [near] | <code>number</code> | <code>0.1</code> |
| [far] | <code>number</code> | <code>100</code> |
| [view] | [<code>CameraView</code>](#CameraView) | <code></code> |
<a name="PerspectiveCameraOptions"></a>
## PerspectiveCameraOptions : <code>object</code>
**Kind**: global typedef
**Properties**
| Name | Type | Default |
| ----- | -------------------------------- | ------------------------ |
| [fov] | [<code>Radians</code>](#Radians) | <code>Math.PI / 3</code> |
<a name="OrthographicCameraOptions"></a>
## OrthographicCameraOptions : <code>object</code>
**Kind**: global typedef
**Properties**
| Name | Type | Default |
| -------- | ------------------- | --------------- |
| [left] | <code>number</code> | <code>-1</code> |
| [right] | <code>number</code> | <code>1</code> |
| [bottom] | <code>number</code> | <code>-1</code> |
| [top] | <code>number</code> | <code>1</code> |
| [zoom] | <code>number</code> | <code>1</code> |
<a name="OrbiterControlsOptions"></a>
## OrbiterControlsOptions : <code>object</code>
**Kind**: global typedef
**Properties**
| Name | Type | Default |
| -------------- | -------------------------------- | ---------------------- |
| camera | [<code>Camera</code>](#Camera) | |
| [element] | <code>HTMLElement</code> | <code>document</code> |
| [easing] | <code>number</code> | <code>0.1</code> |
| [zoom] | <code>boolean</code> | <code>true</code> |
| [pan] | <code>boolean</code> | <code>true</code> |
| [drag] | <code>boolean</code> | <code>true</code> |
| [minDistance] | <code>number</code> | <code>0.01</code> |
| [maxDistance] | <code>number</code> | <code>Infinity</code> |
| [minLat] | [<code>Degrees</code>](#Degrees) | <code>-89.5</code> |
| [maxLat] | [<code>Degrees</code>](#Degrees) | <code>89.5</code> |
| [minLon] | <code>number</code> | <code>-Infinity</code> |
| [maxLon] | <code>number</code> | <code>Infinity</code> |
| [panSlowdown] | <code>number</code> | <code>4</code> |
| [zoomSlowdown] | <code>number</code> | <code>400</code> |
| [dragSlowdown] | <code>number</code> | <code>4</code> |
| [autoUpdate] | <code>boolean</code> | <code>true</code> |
<!-- api-end -->
## License
MIT. See [license file](https://github.com/pex-gl/pex-cam/blob/main/LICENSE.md).