UnityGame/Library/PackageCache/com.unity.mathematics/Documentation~/4x4-matrices.md

48 lines
2.0 KiB
Markdown
Raw Permalink Normal View History

2024-10-27 10:53:47 +03:00
# 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
}
```