# matrix3x4_t

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

## Contents

`matrix3x4_t` represents a matrix: a mathematical construct that allows Vectors to be transformed.

Matrices are chiefly used to rotate vectors, since vector addition and multiplication respectively take care of translation and scaling. A single matrix can store a transformation in all three modes however, making it powerful in calculation-heavy areas like vertex rendering and 3D view set-up.

## Usage

### Generation

Matrix generation is best left to Source's pre-existing functions:

```void AngleMatrix( QAngle angle, matrix_3x4_t& out ); // Rotation; can also use Quaternions or Radians
void PositionMatrix( Vector position, matrix3x4_t& out ); // Translation
void AngleMatrix( QAngle angle, Vector position, matrix3x4_t& out ); // Rotation + translation
void SetScaleMatrix( float scale, matrix3x4_t& out ); // Scale
```

### Application Tip:Unless re-using an existing matrix you are better off rotating a vector with `VectorRotate()`, which accepts angles directly.

The mathematical notation for a matrix transformation is (vector * matrix). Source does not support that syntax, though it would be trivial to add, and instead it offers these functions:

```void VectorTransform( Vector in1, matrix3x4_t in2, Vector out );
void VectorITransform( Vector in1, matrix3x4_t in2, Vector out ); // 'Inverse' of the above
```

There is an overload of `VectorRotate()` that accepts a `matrix3x4_t`. It seems to behave in the same way as `VectorTransform()`.

### Utility

`void MatrixAngles()`
`void MatrixPosition()`
`void MatrixVectors()`
Extract angles and vectors from a matrix. `MatrixAngles()` has many overloads. There is no way to extract a scale.
`void MatrixMultiply(matrix3x4_t in1, matrix3x4_t in2, matrix3x4_t out)`
Combines two matrices into one.
`void MatrixTranspose()`
Transposes a matrix. To do: What this is good for.
`void MatrixInvert()`
Reverses a matrix, making it transform in the opposite direction(s). You could also use `VectorITransform()` to apply the matrix.
`bool MatricesAreEqual()`
Instead of (matrix1 == matrix2).
`void MatrixCopy()` Confirm:Instead of (matrix1 = matrix2).

## See also

• `Vector`
• `QAngle`
• `Quaternion`
• `RadianEuler`