﻿ Tinman 3D SDK | _Tinman.Core.Math.Vectors.Mat4D
TINMAN 3D / REALTIME TERRAIN
Software Development Kit - User Manual

# struct Mat4D in Tinman.Core.Math.Vectors

A 4x4 matrix with 64-bit floating-point precision.

 `struct` ``` Mat4D ``` `implements` ``` IEquatable```

## Remarks

```/                      \
|  M11  M12  M13  M14  |
|  M21  M22  M23  M24  |
|  M31  M32  M33  M34  |
|  M41  M42  M43  M44  |
\                      /```

## Public / Attributes

### Determinant

Returns the determinant of this matrix.

 ```public property``` ``` Determinant { get }``` `type` `float64` `value` The determinant value.

### Inverse

Returns the inverse of this matrix.

 ```public property``` ``` Inverse { get }``` `type` ``` Mat4D ``` `value` The inverse matrix.

### M11

Matrix component in first row, first column.

 ```public readonly field``` ``` M11 ``` `type` `float64`

### M12

Matrix component in first row, second column.

 ```public readonly field``` ``` M12 ``` `type` `float64`

### M13

Matrix component in first row, third column.

 ```public readonly field``` ``` M13 ``` `type` `float64`

### M14

Matrix component in first row, fourth column.

 ```public readonly field``` ``` M14 ``` `type` `float64`

### M21

Matrix component in second row, first column.

 ```public readonly field``` ``` M21 ``` `type` `float64`

### M22

Matrix component in second row, second column.

 ```public readonly field``` ``` M22 ``` `type` `float64`

### M23

Matrix component in second row, third column.

 ```public readonly field``` ``` M23 ``` `type` `float64`

### M24

Matrix component in second row, fourth column.

 ```public readonly field``` ``` M24 ``` `type` `float64`

### M31

Matrix component in third row, first column.

 ```public readonly field``` ``` M31 ``` `type` `float64`

### M32

Matrix component in third row, second column.

 ```public readonly field``` ``` M32 ``` `type` `float64`

### M33

Matrix component in third row, third column.

 ```public readonly field``` ``` M33 ``` `type` `float64`

### M34

Matrix component in third row, fourth column.

 ```public readonly field``` ``` M34 ``` `type` `float64`

### M41

Matrix component in fourth row, first column.

 ```public readonly field``` ``` M41 ``` `type` `float64`

### M42

Matrix component in fourth row, second column.

 ```public readonly field``` ``` M42 ``` `type` `float64`

### M43

Matrix component in fourth row, third column.

 ```public readonly field``` ``` M43 ``` `type` `float64`

### M44

Matrix component in fourth row, fourth column.

 ```public readonly field``` ``` M44 ``` `type` `float64`

### Transpose

Returns the transpose of this matrix.

 ```public property``` ``` Transpose { get }``` `type` ``` Mat4D ``` `value` The transposed matrix.

## Public / Constants

### Identity

The identity matrix.

 ```public static readonly field``` ``` Identity ``` `type` ``` Mat4D ```

### Zero

The zero matrix.

 ```public static readonly field``` ``` Zero ``` `type` ``` Mat4D ```

## Public / Constructors

### FromColumns

Creates a new instance of Mat4D.

 `[Pure]` ```public static method``` ``` FromColumns (Vec4D col1, Vec4D col2, Vec4D col3, Vec4D col4)``` `type` ``` Mat4D ``` `params` `col1` The first column vector. `col2` The second column vector. `col3` The third column vector. `col4` The fourth column vector. `returns` The matrix.

### FromRows

Creates a new instance of Mat4D.

 `[Pure]` ```public static method``` ``` FromRows (Vec4D row1, Vec4D row2, Vec4D row3, Vec4D row4)``` `type` ``` Mat4D ``` `params` `row1` The first row vector. `row2` The second row vector. `row3` The third row vector. `row4` The fourth row vector. `returns` The matrix.

### LookAt

Creates a look-at transformation matrix.

 `[Pure]` ```public static method``` ``` LookAt (Vec3D origin, Vec3D target, Vec3D up, bool rightHanded)``` `type` ``` Mat4D ``` `params` `origin` The origin position. `target` The look-at position. `up` The up-direction vector. `rightHanded` `true` to create a right-handed coordinate system, `false` to create a left-handed one. `returns` The transformation matrix.

### Mat4D

Creates a new instance of Mat4D.

 ```public constructor``` ``` Mat4D (float64 m11, float64 m12, float64 m13, float64 m14, float64 m21, float64 m22, float64 m23, float64 m24, float64 m31, float64 m32, float64 m33, float64 m34, float64 m41, float64 m42, float64 m43, float64 m44)``` `params` `m11` Matrix component in first row, first column. `m12` Matrix component in first row, second column. `m13` Matrix component in first row, third column. `m14` Matrix component in first row, fourth column. `m21` Matrix component in second row, first column. `m22` Matrix component in second row, second column. `m23` Matrix component in second row, third column. `m24` Matrix component in second row, fourth column. `m31` Matrix component in third row, first column. `m32` Matrix component in third row, second column. `m33` Matrix component in third row, third column. `m34` Matrix component in third row, fourth column. `m41` Matrix component in fourth row, first column. `m42` Matrix component in fourth row, second column. `m43` Matrix component in fourth row, third column. `m44` Matrix component in fourth row, fourth column.

### Orthographic

Creates an orthographic projection matrix.

 `[Pure]` ```public static method``` ``` Orthographic (float64 left, float64 right, float64 top, float64 bottom, float64 zNear, float64 zFar, bool nearAtZero)``` `type` ``` Mat4D ``` `params` `left` The X-coordinate to map to `-1`. `right` The X-coordinate to map to `+1`. `top` The Y-coordinate to map to `-1`. `bottom` The Y-coordinate to map to `+1`. `zNear` The Z-coordinate to map to `0` resp. `-1`. `zFar` The Z-coordinate to map to `+1`. `nearAtZero` `true` to map zNear to `0`, `false` to map zNear to `-1`. `returns` The projection matrix.

### PerspectiveFov

Creates a perspective projection matrix.

 `[Pure]` ```public static method``` ``` PerspectiveFov (float64 fov, float64 aspect, float64 n, float64 f, bool nearAtZero, bool rightHanded)``` `type` ``` Mat4D ``` `params` `fov` The field-of-view along the viewport Y-axis, in radians. `aspect` The viewport aspect ratio (width divided by height). `n` Near clipping plane Z-value (will be mapped to `0` resp. `-1` in clip-space; see nearAtZero for details). `f` Far clipping plane Z-value (will be mapped to `1` in clip-space). `nearAtZero` When `true`, the near clipping plane will be mapped to `0` in clip-space (e.g. Direct3D); when `false` it will be mapped to `-1` (e.g. OpenGL). `rightHanded` Create projection matrix for a right-handed (`true`) or left-handed (`false`) coordinate system? `returns` The projection matrix.

### Rotate

Returns a rotation matrix (counter-clockwise around the given axis for right-handed coordinate system).

 `[Pure]` ```public static method``` ``` Rotate (Vec3D axis, float64 angle)``` `type` ``` Mat4D ``` `params` `axis` Unit-length rotation axis vector. `angle` The rotation angle, in radians. `returns` The resulting matrix.

Returns a rotation matrix (counter-clockwise around the given axis for right-handed coordinate system).

 `[Pure]` ```public static method``` ``` Rotate (float64 x, float64 y, float64 z, float64 angle)``` `type` ``` Mat4D ``` `params` `x` X-component of unit-length rotation axis vector. `y` Y-component of unit-length rotation axis vector. `z` Z-component of unit-length rotation axis vector. `angle` The rotation angle, in radians. `returns` The resulting matrix.

### RotateX

Returns a rotation matrix (counter-clockwise around X-axis for right-handed coordinate system).

 `[Pure]` ```public static method``` ``` RotateX (float64 angle)``` `type` ``` Mat4D ``` `params` `angle` The rotation angle, in radians. `returns` The resulting matrix.

### RotateY

Returns a rotation matrix (counter-clockwise around Y-axis for right-handed coordinate system).

 `[Pure]` ```public static method``` ``` RotateY (float64 angle)``` `type` ``` Mat4D ``` `params` `angle` The rotation angle, in radians. `returns` The resulting matrix.

### RotateZ

Returns a rotation matrix (counter-clockwise around Z-axis for right-handed coordinate system).

 `[Pure]` ```public static method``` ``` RotateZ (float64 angle)``` `type` ``` Mat4D ``` `params` `angle` The rotation angle, in radians. `returns` The resulting matrix.

### Scale

Returns a scaling matrix.

 `[Pure]` ```public static method``` ``` Scale (float64 f)``` `type` ``` Mat4D ``` `params` `f` The scale factor. `returns` The resulting matrix.

Returns a scaling matrix.

 `[Pure]` ```public static method``` ``` Scale (Vec4D f)``` `type` ``` Mat4D ``` `params` `f` The scale factors. `returns` The resulting matrix.

Returns a scaling matrix.

 `[Pure]` ```public static method``` ``` Scale (float64 fx, float64 fy, float64 fz, float64 fw)``` `type` ``` Mat4D ``` `params` `fx` The scale factor along the X-axis. `fy` The scale factor along the Y-axis. `fz` The scale factor along the Z-axis. `fw` The scale factor along the W-axis. `returns` The resulting matrix.

### Translate

Returns a translation matrix.

 `[Pure]` ```public static method``` ``` Translate (Vec3D v)``` `type` ``` Mat4D ``` `params` `v` The translation vector. `returns` The translation matrix.

Returns a translation matrix.

 `[Pure]` ```public static method``` ``` Translate (float64 x, float64 y, float64 z)``` `type` ``` Mat4D ``` `params` `x` X-component of translation vector. `y` Y-component of translation vector. `z` Z-component of translation vector. `returns` The translation matrix.

### Warp

Computes an invertible 3D homogeneous warp matrix that transforms the given source triangle onto the specified target triangle.

 `[Pure]` ```public static method``` ``` Warp (Vec3D a0, Vec3D b0, Vec3D c0, Vec3D a1, Vec3D b1, Vec3D c1)``` `type` ``` Mat4D ``` `params` `a0` First vertex of source triangle. `b0` Second vertex of source triangle. `c0` Third vertex of source triangle. `a1` First vertex of target triangle. `b1` Second vertex of target triangle. `c1` Third vertex of target triangle. `returns` The homogeneous 3D warp matrix.

Remarks:

The fourth row of the returned matrix will always be `(0,0,0,1)`, so it is not necessary to perform the homogeneous divide. Also all elements along the main diagonal will be `1`.

## Public / Methods

### DecomposeTranslation

Decomposes this matrix into a reduced matrix without translational components and an offset vector.

 `[Pure]` ```public method``` ``` DecomposeTranslation (out Mat4D reduced, out Vec3D offset)``` `params` `reduced` Output of reduced matrix. `offset` Output of transformed offset vector (see `O` above).

### Equals

Compares this object with the given one.

 `[Pure]` ```public method``` ``` Equals (Mat4D other)``` `type` `bool` `params` `other` The object to compare to. `returns` `true` if this object is equal to other, `false` if not.

### EqualsAlmost

Checks if this matrix and the given one are similar but necessarily equal.

 `[Pure]` ```public method``` ``` EqualsAlmost (Mat4D other)``` `type` `bool` `params` `other` The other matrix. `returns` `true` if both matrices are similar, `false` if they are not.

Maths.Similar

### GetColumn

Returns a column vector.

 `[Pure]` ```public method``` ``` GetColumn (int32 index)``` `type` ``` Vec4D ``` `params` `index` The zero-based column index. `returns` The column vector.

### GetRow

Returns a row vector.

 `[Pure]` ```public method``` ``` GetRow (int32 index)``` `type` ``` Vec4D ``` `params` `index` The zero-based row index. `returns` The row vector.

### Lerp

Performs a component-wise linear interpolation between this matrix and the given one.

 `[Pure]` ```public method``` ``` Lerp (Mat4D other, float64 factor)``` `type` ``` Mat4D ``` `params` `other` The other matrix. `factor` The interpolation factor (`0`: this, `1`: other). `returns` The resulting matrix.

### Mul

Multiplies this matrix (left-side) with the given one (right-side): ```result = this * m```.

 `[Pure]` ```public method``` ``` Mul (Mat4D m)``` `type` ``` Mat4D ``` `params` `m` The matrix. `returns` The resulting matrix.

### Mul3

Multiplies this matrix (left-side) with the given homogeneous 3D vector (right-side): ```result = this * v```.

 `[Pure]` ```public method``` ``` Mul3 (Vec3D v, float64 w)``` `type` ``` Vec3D ``` `params` `v` The vector. `w` The W-component to assume. `returns` The resulting vector, scaled by `1/result.W`.

Multiplies this matrix (left-side) with the given homogeneous 3D vector (right-side): ```result = this * v```.

 `[Pure]` ```public method``` ``` Mul3 (float64 x, float64 y, float64 z, float64 w)``` `type` ``` Vec3D ``` `params` `x` X-component of vector. `y` Y-component of vector. `z` Z-component of vector. `w` The W-component to assume. `returns` The resulting vector, scaled by `1/result.W`.

### Mul4

Multiplies this matrix (left-side) with the given 4D vector (right-side): ```result = this * v```.

 `[Pure]` ```public method``` ``` Mul4 (Vec4D v)``` `type` ``` Vec4D ``` `params` `v` The vector. `returns` The resulting vector.

Multiplies this matrix (left-side) with the given 4D vector (right-side): ```result = this * v```.

 `[Pure]` ```public method``` ``` Mul4 (float64 x, float64 y, float64 z, float64 w)``` `type` ``` Vec4D ``` `params` `x` X-component of vector. `y` Y-component of vector. `z` Z-component of vector. `w` W-component of vector. `returns` The resulting vector.

### PerspectiveRay

Computes a ray for a screen-pixel.

 `[Pure]` ```public method``` ``` PerspectiveRay (Vec3D translation, float64 pixelX, float64 pixelY, int32 screenWidth, int32 screenHeight, bool nearAtZero)``` `type` ``` Ray ``` `params` `translation` The translation components, if they have been omitted in the view projection, otherwise Zero. `pixelX` Pixel X-coordinate (see remarks). `pixelY` Pixel Y-coordinate (see remarks). `screenWidth` Screen width, in pixels. `screenHeight` Screen height, in pixels. `nearAtZero` When `true`, the near clipping plane will be mapped to `0` in clip-space (e.g. Direct3D); when `false` it will be mapped to `-1` (e.g. OpenGL). `returns` The ray

Remarks:

This matrix must be the inverse of a combined world-view-projection matrix (for example, PerspectiveFov). The pixel coordinates `(0,0)` refer to the top-left corner of the top-left screen pixel. The pixel coordinates `(w,h)` refer to the bottom-right corner of the bottom-right screen pixel (where `w` and `h` are the screen width resp. height). If you want to cast rays for pixel centers, you have to add an offset of `0.5` to the pixel coordinates.

### ToArray

Copies matrix elements to the given array.

 ```public method``` ``` ToArray ([] float64[] values, int32 offset = 0, int32 strideRow = 4, int32 strideCol = 1)``` `params` `values` `[not-null]` The output array. `offset` Offset into values to top-left matrix element. Defaults to `0`. `strideRow` Array index distance between matrix rows. Defaults to `4`. `strideCol` Array index distance between matrix columns. Defaults to `1`.

Remarks:

The method uses the following indexing scheme to write values to values:

`values[offset + (row - 1) * strideRow + (col - 1) * strideCol := matrix[row, col];`
where `row` and `col` depict the matrix row and column number (starting at `1`).

## Serialization

### Serializer

The serialization helper object for values of Mat4D.

 ```public static readonly field``` ``` Serializer ``` `type` ``` ITypeSerializer```