Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/mikolalysenko/orbiter
3D quaternion orbit camera with mouse input
https://github.com/mikolalysenko/orbiter
Last synced: about 2 months ago
JSON representation
3D quaternion orbit camera with mouse input
- Host: GitHub
- URL: https://github.com/mikolalysenko/orbiter
- Owner: mikolalysenko
- License: mit
- Created: 2015-03-14T18:37:30.000Z (almost 10 years ago)
- Default Branch: master
- Last Pushed: 2015-03-14T21:27:27.000Z (almost 10 years ago)
- Last Synced: 2024-10-20T14:27:40.351Z (2 months ago)
- Language: JavaScript
- Size: 101 KB
- Stars: 3
- Watchers: 3
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
orbiter
=======
An orbiting camera with mouse input bindings. This is similar to 3d-view-controls, except it doesn't do mode switching and fancy property syntactic sugar, making it much lighter weight.Default controls:
Button | Interaction
-------|------------
Left mouse | Rotate
Shift + left mouse *or* scroll horizontally | Roll
Right mouse | Pan
Middle mouse *or* scroll vertically | Zoom# Example
```javascript
var createCamera = require('../orbiter')
var bunny = require('bunny')
var perspective = require('gl-mat4/perspective')
var createMesh = require('gl-simplicial-complex')var canvas = document.createElement('canvas')
document.body.appendChild(canvas)
window.addEventListener('resize', require('canvas-fit')(canvas))var gl = canvas.getContext('webgl')
var camera = createCamera(canvas, {
eye: [50,0,0],
center: [0,0,0],
zoomMax: 500
})var mesh = createMesh(gl, {
cells: bunny.cells,
positions: bunny.positions,
colormap: 'jet'
})function render() {
requestAnimationFrame(render)
if(camera.tick()) {
gl.viewport(0, 0, canvas.width, canvas.height)
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)
gl.enable(gl.DEPTH_TEST)
mesh.draw({
projection: perspective([], Math.PI/4, canvas.width/canvas.height, 0.01, 1000),
view: camera.matrix
})
}
}
render()
```# Interface
## Constructor
#### `var camera = require('orbiter')(element[, options])`
Creates a new camera object.* `element` is a DOM node onto which the orbiter is attached
* `options` is an object with the following optional properties:
+ `eye` - the position of the camera in world coordinates (Default `[0,0,10]`)
+ `center` - the target of the camera in world coordinates (Default `[0,0,0]`)
+ `up` - the up vector of the camera (Default `[0,1,0]`)
+ `inputEnabled` if set to false, then disables input (Default `true`)
+ `delay` - amount to delay interactions by for interpolation in ms (Default `16`)
+ `rotateSpeed` - rotation scaling factor (Default `1`)
+ `zoomSpeed` - zoom scaling factor (Default `1`)
+ `translateSpeed` - translation/panning scale factor (Default `1`)
+ `flipX` - flip X axis for rotations (Default `false`)
+ `flipY` - flip Y axis for rotations (Default `false`)
+ `zoomMin` - minimum zoom distance (Default `0.01`)
+ `zoomMax` - maximum zoom distance (Default `Infinity`)## Geometric properties
#### `camera.matrix`
A 4x4 matrix encoded as a length 16 array representing the homogeneous transformation from world coordinates to view (camera) coordinates.#### `camera.eye`
The position of the camera in world coordinates#### `camera.up`
A vector pointing up in world coordinates#### `camera.center`
The target of the camera in world coordinates#### `camera.distance`
Euclidean distance from `eye` to `center`## Methods
#### `camera.tick()`
Updates the camera state. Call this before each frame is rendered to compute the current state of the camera.**Returns** `true` if the state of the camera has changed since the last call to `tick`
#### `camera.lookAt(center, eye, up)`
Sets the camera center/eye/up vector to look at a fixed target* `center` is the new center/target for the camera
* `eye` is the position of the camera in world coordinates
* `up` is a vector pointing up#### `camera.box(lo, hi)`
Targets the camera at a bounding box. This is a short cut for skipping some of the boilerplate associated with lookAt* `lo` is the lower bound on the box
* `hi` is the upper bound on the box#### `camera.rotate(yaw, pitch, roll)`
Applies an incremental rotation to the camera* `yaw` is the amount to rotate about the y-axis (in xz plane of camera)
* `pitch` is the amount to rotate about the x-axis (in yz plane of camera)
* `roll` is the amount to rotate about the forward axis (in xy plane of camera)#### `camera.pan(dx, dy, dz)`
Applies a relative motion to the camera, moving in view coordinates* `dx,dy,dz` are the components of the camera motion vector
#### `camera.translate(dx, dy, dz)`
Translates the camera in world coordinates* `dx,dy,dz` are the components of the translation vector
## Tuning parameters
#### `camera.distanceLimits`
A 2D array representing the `[lo,hi]` bounds on the zoom distance. Note that `0 < lo < hi`.#### `camera.flipX`
A flag controlling whether the camera rotation is flipped along the x-axis#### `camera.flipY`
A flag controlling whether the camera rotation is flipped along the y-axis#### `camera.delay`
The amount of delay on the interpolation of the camera state in ms#### `camera.rotateSpeed`
Camera rotation speed scaling factor#### `camera.zoomSpeed`
Camera zoom speed scaling factor#### `camera.translateSpeed`
Camera translation speed scaling factor#### `camera.element`
The DOM element the camera is attached to# License
(c) 2015 Mikola Lysenko. MIT License