UnityGame/Library/PackageCache/com.unity.mathematics/Documentation~/4x4-matrices.md
2024-10-27 10:53:47 +03:00

48 lines
2.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 4×4 matrices
To create a 4×4 transformation matrix, use the constructors in [`float4x4`](xref:Unity.Mathematics.float4x4) to assign one value to all elements of the matrix, or individually set all 16 elements directly:
```c#
// Unity Mathematics example
void Build4x4UnityMathematics()
{
var c0 = new float4(1.0f, 0.0f, 0.0f, 0.0f);
var c1 = new float4(0.0f, 1.0f, 0.0f, 0.0f);
var c2 = new float4(0.0f, 0.0f, 1.0f, 0.0f);
var c3 = new float4(0.0f, 0.0f, 0.0f, 1.0f);
var m = new float4x4(c0, c1, c2, c3);
}
```
## Multiplying a 4×4 matrix
Unity Mathematics and `UnityEngine` define the `*` operator differently. The `*` operator for [`float4x4`](xref:Unity.Mathematics.float4x4) implements componentwise multiplication. If you multiply a `float4x4` of all 1s with 0.5 on the diagonal, you get back the half identity because the upper and lower triangles of the matrix are multiplied by the respective zero entries from `f4x4_HalfIdentity`:
```c#
// Unity Mathematics example
void OperatorMultiply4x4UnityMathematics()
{
float4x4 result = f4x4_Ones * f4x4_HalfIdentity;
// result:
// 0.5, 0.0, 0.0, 0.0,
// 0.0, 0.5, 0.0, 0.0,
// 0.0, 0.0, 0.5, 0.0,
// 0.0, 0.0, 0.0, 0.5
}
```
## Multiplying a 4×4 matrix and a 4D vector
Use the [`math.mul`](xref:Unity.Mathematics.math.mul*) method to multiply a 4×4 matrix and a 4D vector. If you supply a `float4x4` as the first parameter and a `float4` as the second, it performs a 4×4 matrix multiplication with a 4×1 column vector, which returns a 4×1 column vector as a `float4`.
`math.mul` can also multiply a 1×4 row vector by a 4×4 matrix to produce a 1×4 row vector by taking a `float4` as the first parameter and a `float4×4` as the second. Unity Mathematics stores the row vector in a `float4` and it isn't treated as a separate type.
```c#
// Unity Mathematics example
void Multiply4x4AndVector4UnityMathematics()
{
float4 result1 = math.mul(f4x4, f4); // 4x4 * 4x1 = 4x1
float4 result2 = math.mul(f4, f4x4); // 1x4 * 4x4 = 1x4
}
```