# `tecs.gfx.camera3d`
A perspective camera maps a right-handed 3D world to one viewport.
World +X points right, +Y points up, and the default camera looks along -Z.
The camera orientation is a quaternion in `(x, y, z, w)` order that turns
camera-local coordinates into world coordinates. Position and orientation are
caller-writable fields:
```nupp
const camera = tecs.gfx.newCamera3D({
x = 0,
y = 2,
z = 6,
verticalFov = math.rad(60),
})
camera.rotationY = math.sin(math.rad(15) * 0.5)
camera.rotationW = math.cos(math.rad(15) * 0.5)
```
`matrix` writes a column-major world-to-clip matrix with depth in `[0, 1]`,
and `inverseMatrix` writes its clip-to-world inverse. `matrices` writes both
from one camera calculation for code that needs the pair. Each result uses a
separate camera-owned sixteen-float array and remains valid until that same
result is written again.
## Constructors
### `newCamera3D` _constructor_
```nupp
function newCamera3D(options: Options?): Camera3D
```
#### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `options` | `Options?` | |
#### Returns
| Type | Description |
| --- | --- |
| `Camera3D` | |
## Types
### `Camera3D` _record_
```nupp
record Camera3D
x: number = 0
y: number = 0
z: number = 0
rotationX: number = 0
rotationY: number = 0
rotationZ: number = 0
rotationW: number = 1
verticalFov: number = 1.0471975511965976
near: number = 0.1
far: number = 1000
matrix: function(exclusive self: Camera3D, width: number, height: number): {[integer]: number}
inverseMatrix: function(exclusive self: Camera3D, width: number, height: number): {[integer]: number}
matrices: function(
exclusive self: Camera3D,
width: number,
height: number
): ({[integer]: number}, {[integer]: number})
end
```
Represents one perspective view into a right-handed 3D world.
#### Methods
##### `matrix`
```nupp
matrix: function(exclusive self: Camera3D, width: number, height: number): {[integer]: number}
```
Writes the column-major world-to-clip matrix for a viewport.
The method normalizes the camera quaternion while calculating the view,
without modifying the caller's fields. Clip depth maps `near` to zero
and `far` to one.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `exclusive self` | `Camera3D` | |
| `width` | `number` | The positive viewport width in pixels. |
| `height` | `number` | The positive viewport height in pixels. |
###### Returns
| Type | Description |
| --- | --- |
| `{\[integer\]: number}` | The camera's own sixteen-float array, valid until the next call on this camera. |
##### `inverseMatrix`
```nupp
inverseMatrix: function(exclusive self: Camera3D, width: number, height: number): {[integer]: number}
```
Writes the column-major clip-to-world matrix for a viewport.
This is the exact inverse of `matrix` at the same dimensions. Clip x
and y range from negative one to one, clip z ranges from zero to one,
and the caller divides the resulting xyz by w.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `exclusive self` | `Camera3D` | |
| `width` | `number` | The positive viewport width in pixels. |
| `height` | `number` | The positive viewport height in pixels. |
###### Returns
| Type | Description |
| --- | --- |
| `{\[integer\]: number}` | The camera's own sixteen-float array, valid until the next call to `inverseMatrix` on this camera. |
##### `matrices`
```nupp
matrices: function(
exclusive self: Camera3D,
width: number,
height: number
): ({[integer]: number}, {[integer]: number})
```
Writes the world-to-clip matrix and its clip-to-world inverse.
This method normalizes the camera quaternion and derives the projection
once, then writes both arrays. Use it when both matrices describe the
same view.
###### Arguments
| Name | Type | Description |
| --- | --- | --- |
| `exclusive self` | `Camera3D` | |
| `width` | `number` | The positive viewport width in pixels. |
| `height` | `number` | The positive viewport height in pixels. |
###### Returns
| Type | Description |
| --- | --- |
| `{\[integer\]: number}` | The camera's own world-to-clip sixteen-float array, valid until the next call to `matrix` or `matrices` on this camera. |
| `{\[integer\]: number}` | The camera's own clip-to-world sixteen-float array, valid until the next call to `inverseMatrix` or `matrices` on this camera. |
#### Fields
##### `x`
```nupp
x: number
```
Caller-writable. Sets the world-space x coordinate.
##### `y`
```nupp
y: number
```
Caller-writable. Sets the world-space y coordinate.
##### `z`
```nupp
z: number
```
Caller-writable. Sets the world-space z coordinate.
##### `rotationX`
```nupp
rotationX: number
```
Caller-writable. Sets the local-to-world orientation quaternion x
component.
##### `rotationY`
```nupp
rotationY: number
```
Caller-writable. Sets the local-to-world orientation quaternion y
component.
##### `rotationZ`
```nupp
rotationZ: number
```
Caller-writable. Sets the local-to-world orientation quaternion z
component.
##### `rotationW`
```nupp
rotationW: number
```
Caller-writable. Sets the local-to-world orientation quaternion scalar
component.
##### `verticalFov`
```nupp
verticalFov: number
```
Caller-writable. Sets the vertical field of view in radians between
zero and pi.
##### `near`
```nupp
near: number
```
Caller-writable. Sets the positive near-plane distance.
##### `far`
```nupp
far: number
```
Caller-writable. Sets the far-plane distance, which must exceed `near`.
### `Options` _type_
```nupp
type Options = {
--- Caller-writable. Sets the world-space x coordinate and defaults to zero.
x: number?,
--- Caller-writable. Sets the world-space y coordinate and defaults to zero.
y: number?,
--- Caller-writable. Sets the world-space z coordinate and defaults to zero.
z: number?,
--- Caller-writable. Sets the orientation quaternion x component and
--- defaults to zero.
rotationX: number?,
--- Caller-writable. Sets the orientation quaternion y component and
--- defaults to zero.
rotationY: number?,
--- Caller-writable. Sets the orientation quaternion z component and
--- defaults to zero.
rotationZ: number?,
--- Caller-writable. Sets the orientation quaternion scalar component and
--- defaults to one.
rotationW: number?,
--- Caller-writable. Sets the vertical field of view in radians and
--- defaults to pi divided by three.
verticalFov: number?,
--- Caller-writable. Sets the positive near-plane distance and defaults to
--- 0.1 world units.
near: number?,
--- Caller-writable. Sets the far-plane distance and defaults to 1000 world units.
far: number?
}
```
Defines optional perspective-camera construction values.