概览
这些函数允许您操作 2x2、3x3 和 4x4 阶的方阵。它们特别适用于图形变换,并与 OpenGL 兼容。
我们对行和列使用从零开始的索引。例如,rs_matrix4x4 的最后一个元素位于 (3, 3)。
RenderScript 使用列主序矩阵和基于列的向量。向量变换通过后乘向量完成,例如 (matrix * vector),如 rsMatrixMultiply() 所提供。
要创建同时执行两个变换的变换矩阵,请将两个源矩阵相乘,其中第一个变换作为右参数。例如,要创建先应用变换 s1 再应用 s2 的变换矩阵,请调用 rsMatrixLoadMultiply(&combined, &s2, &s1)。这源自 s2 * (s1 * v),即 (s2 * s1) * v。
我们有两种风格的函数来创建变换矩阵:rsMatrixLoadTransformation 和 rsMatrixTransformation。前者只是将变换矩阵存储在第一个参数中。后者会修改一个预先存在的变换矩阵,使新的变换首先发生。例如,如果您在一个已经进行缩放的矩阵上调用 rsMatrixTranslate(),那么将结果矩阵应用于向量时,会首先进行平移,然后进行缩放。
摘要
| 函数 | |
|---|---|
| rsExtractFrustumPlanes | 计算视锥平面 |
| rsIsSphereInFrustum | 检查球体是否在视锥平面内 |
| rsMatrixGet | 获取一个元素 |
| rsMatrixInverse | 原地反转矩阵 |
| rsMatrixInverseTranspose | 原地反转并转置矩阵 |
| rsMatrixLoad | 加载或复制矩阵 |
| rsMatrixLoadFrustum | 加载视锥投影矩阵 |
| rsMatrixLoadIdentity | 加载单位矩阵 |
| rsMatrixLoadMultiply | 乘以两个矩阵 |
| rsMatrixLoadOrtho | 加载正交投影矩阵 |
| rsMatrixLoadPerspective | 加载透视投影矩阵 |
| rsMatrixLoadRotate | 加载旋转矩阵 |
| rsMatrixLoadScale | 加载缩放矩阵 |
| rsMatrixLoadTranslate | 加载平移矩阵 |
| rsMatrixMultiply | 矩阵乘以向量或另一个矩阵 |
| rsMatrixRotate | 对变换矩阵应用旋转 |
| rsMatrixScale | 对变换矩阵应用缩放 |
| rsMatrixSet | 设置一个元素 |
| rsMatrixTranslate | 对变换矩阵应用平移 |
| rsMatrixTranspose | 原地转置矩阵 |
函数
rsExtractFrustumPlanes : 计算视锥体平面
| void rsExtractFrustumPlanes(const rs_matrix4x4* viewProj, float4* left, float4* righ, float4* top, float4* bottom, float4* near, float4* far); | 添加于 API 级别 24 |
| void rsExtractFrustumPlanes(const rs_matrix4x4* viewProj, float4* left, float4* right, float4* top, float4* bottom, float4* near, float4* far); | 已从 API 级别 24 及更高版本移除 |
参数
| viewProj | 用于提取平面的矩阵。 |
|---|---|
| left | 左平面。 |
| right | 右平面。 |
| top | 顶平面。 |
| bottom | 底平面。 |
| near | 近平面。 |
| far | 远平面。 |
| righ |
从视图投影矩阵计算 6 个视锥体平面
rsIsSphereInFrustum : 检查球体是否在视锥体平面内
| bool rsIsSphereInFrustum(float4* sphere, float4* left, float4* right, float4* top, float4* bottom, float4* near, float4* far); |
参数
| sphere | 表示球体的 float4。 |
|---|---|
| left | 左平面。 |
| right | 右平面。 |
| top | 顶平面。 |
| bottom | 底平面。 |
| near | 近平面。 |
| far | 远平面。 |
如果球体在 6 个视锥体平面内,则返回 true。
rsMatrixGet : 获取一个元素
| float rsMatrixGet(const rs_matrix2x2* m, uint32_t col, uint32_t row); | |
| float rsMatrixGet(const rs_matrix3x3* m, uint32_t col, uint32_t row); | |
| float rsMatrixGet(const rs_matrix4x4* m, uint32_t col, uint32_t row); |
参数
| m | 用于提取元素的矩阵。 |
|---|---|
| col | 要提取元素的从零开始的列。 |
| row | 要提取元素的从零开始的行。 |
返回矩阵的一个元素。
警告:列和行参数的顺序可能出乎意料。
rsMatrixInverseTranspose : 就地求矩阵逆并转置
| bool rsMatrixInverseTranspose(rs_matrix4x4* m); |
参数
| m | 要修改的矩阵。 |
|---|
矩阵首先被求逆,然后转置。如果矩阵成功求逆,则返回 true。
rsMatrixLoad : 加载或复制矩阵
| void rsMatrixLoad(rs_matrix2x2* destination, const float* array); | |
| void rsMatrixLoad(rs_matrix2x2* destination, const rs_matrix2x2* source); | |
| void rsMatrixLoad(rs_matrix3x3* destination, const float* array); | |
| void rsMatrixLoad(rs_matrix3x3* destination, const rs_matrix3x3* source); | |
| void rsMatrixLoad(rs_matrix4x4* destination, const float* array); | |
| void rsMatrixLoad(rs_matrix4x4* destination, const rs_matrix2x2* source); | |
| void rsMatrixLoad(rs_matrix4x4* destination, const rs_matrix3x3* source); | |
| void rsMatrixLoad(rs_matrix4x4* destination, const rs_matrix4x4* source); |
参数
| destination | 要设置的矩阵。 |
|---|---|
| array | 用于设置矩阵的值数组。这些数组的长度应为 4、9 或 16 个浮点数,具体取决于矩阵大小。 |
| source | 源矩阵。 |
从浮点数数组或另一个矩阵设置矩阵的元素。
如果从数组加载,浮点数应按行主序排列,即 row 0, column 0 的元素应排在最前面,其次是 row 0, column 1 的元素,依此类推。
如果从矩阵加载,并且源矩阵小于目标矩阵,则目标矩阵的其余部分将用单位矩阵的元素填充。例如,将 rs_matrix2x2 加载到 rs_matrix4x4 中将得到
| m00 | m01 | 0.0 | 0.0 |
| m10 | m11 | 0.0 | 0.0 |
| 0.0 | 0.0 | 1.0 | 0.0 |
| 0.0 | 0.0 | 0.0 | 1.0 |
rsMatrixLoadFrustum : 加载视锥体投影矩阵
| void rsMatrixLoadFrustum(rs_matrix4x4* m, float left, float right, float bottom, float top, float near, float far); |
参数
| m | 要设置的矩阵。 |
|---|---|
| left | |
| right | |
| bottom | |
| top | |
| near | |
| far |
构建一个视锥体投影矩阵,变换由六个裁剪平面 left, right, bottom, top, near, far 标识的盒子。
要将此投影应用于向量,请使用 rsMatrixMultiply() 将向量乘以所创建的矩阵。
rsMatrixLoadIdentity : 加载单位矩阵
| void rsMatrixLoadIdentity(rs_matrix2x2* m); | |
| void rsMatrixLoadIdentity(rs_matrix3x3* m); | |
| void rsMatrixLoadIdentity(rs_matrix4x4* m); |
参数
| m | 要设置的矩阵。 |
|---|
将矩阵的元素设置为单位矩阵。
rsMatrixLoadMultiply : 乘以两个矩阵
| void rsMatrixLoadMultiply(rs_matrix2x2* m, const rs_matrix2x2* lhs, const rs_matrix2x2* rhs); | |
| void rsMatrixLoadMultiply(rs_matrix3x3* m, const rs_matrix3x3* lhs, const rs_matrix3x3* rhs); | |
| void rsMatrixLoadMultiply(rs_matrix4x4* m, const rs_matrix4x4* lhs, const rs_matrix4x4* rhs); |
参数
| m | 要设置的矩阵。 |
|---|---|
| lhs | 乘积的左矩阵。 |
| rhs | 乘积的右矩阵。 |
将 m 设置为 lhs * rhs 的矩阵乘积。
要使用此函数组合两个 4x4 变换矩阵,请将第二个变换矩阵乘以第一个变换矩阵。例如,要创建先应用变换 s1 再应用 s2 的变换矩阵,请调用 rsMatrixLoadMultiply(&combined, &s2, &s1)。
警告:在版本 21 之前,不支持将结果存回右矩阵,这会导致未定义行为。请改用 rsMatrixMulitply。例如,不要执行 rsMatrixLoadMultiply (&m2r, &m2r, &m2l),请使用 rsMatrixMultiply (&m2r, &m2l)。rsMatrixLoadMultiply (&m2l, &m2r, &m2l) 按预期工作。
rsMatrixLoadOrtho : 加载正交投影矩阵
| void rsMatrixLoadOrtho(rs_matrix4x4* m, float left, float right, float bottom, float top, float near, float far); |
参数
| m | 要设置的矩阵。 |
|---|---|
| left | |
| right | |
| bottom | |
| top | |
| near | |
| far |
构建一个正交投影矩阵,将由六个裁剪平面 left, right, bottom, top, near, far 标识的盒子变换为一个单位立方体,其一个角位于 (-1, -1, -1),另一个角位于 (1, 1, 1)。
要将此投影应用于向量,请使用 rsMatrixMultiply() 将向量乘以所创建的矩阵。
请参阅 https://en.wikipedia.org/wiki/Orthographic_projection 。
rsMatrixLoadPerspective : 加载透视投影矩阵
| void rsMatrixLoadPerspective(rs_matrix4x4* m, float fovy, float aspect, float near, float far); |
参数
| m | 要设置的矩阵。 |
|---|---|
| fovy | 沿 Y 轴的视场角(以度为单位)。 |
| aspect | x / y 的比率。 |
| near | 近裁剪平面。 |
| far | 远裁剪平面。 |
构建一个透视投影矩阵,假设视场角对称。
要将此投影应用于向量,请使用 rsMatrixMultiply() 将向量乘以所创建的矩阵。
rsMatrixLoadRotate : 加载旋转矩阵
| void rsMatrixLoadRotate(rs_matrix4x4* m, float rot, float x, float y, float z); |
参数
| m | 要设置的矩阵。 |
|---|---|
| rot | 旋转量,以度为单位。 |
| x | 旋转轴向量的 X 分量。 |
| y | 旋转轴向量的 Y 分量。 |
| z | 旋转轴向量的 Z 分量。 |
此函数创建旋转矩阵。旋转轴是 (x, y, z) 向量。
要旋转向量,请使用 rsMatrixMultiply() 将向量乘以所创建的矩阵。
请参阅 https://en.wikipedia.org/wiki/Rotation_matrix 。
rsMatrixLoadScale : 加载缩放矩阵
| void rsMatrixLoadScale(rs_matrix4x4* m, float x, float y, float z); |
参数
| m | 要设置的矩阵。 |
|---|---|
| x | 用于缩放 x 分量的乘数。 |
| y | 用于缩放 y 分量的乘数。 |
| z | 用于缩放 z 分量的乘数。 |
此函数创建一个缩放矩阵,其中向量的每个分量都乘以一个数。此数可以是负数。
要缩放向量,请使用 rsMatrixMultiply() 将向量乘以所创建的矩阵。
rsMatrixLoadTranslate : 加载平移矩阵
| void rsMatrixLoadTranslate(rs_matrix4x4* m, float x, float y, float z); |
参数
| m | 要设置的矩阵。 |
|---|---|
| x | 要添加到每个 x 分量的数。 |
| y | 要添加到每个 y 分量的数。 |
| z | 要添加到每个 z 分量的数。 |
此函数创建一个平移矩阵,其中一个数被添加到向量的每个元素中。
要平移向量,请使用 rsMatrixMultiply() 将向量乘以所创建的矩阵。
rsMatrixMultiply : 将矩阵乘以向量或另一个矩阵
| float2 rsMatrixMultiply(const rs_matrix2x2* m, float2 in); | 添加于 API level 14 |
| float2 rsMatrixMultiply(rs_matrix2x2* m, float2 in); | 已从 API 级别 14 及更高版本移除 |
| float3 rsMatrixMultiply(const rs_matrix3x3* m, float2 in); | 添加于 API level 14 |
| float3 rsMatrixMultiply(const rs_matrix3x3* m, float3 in); | 添加于 API level 14 |
| float3 rsMatrixMultiply(rs_matrix3x3* m, float2 in); | 已从 API 级别 14 及更高版本移除 |
| float3 rsMatrixMultiply(rs_matrix3x3* m, float3 in); | 已从 API 级别 14 及更高版本移除 |
| float4 rsMatrixMultiply(const rs_matrix4x4* m, float2 in); | 添加于 API level 14 |
| float4 rsMatrixMultiply(const rs_matrix4x4* m, float3 in); | 添加于 API level 14 |
| float4 rsMatrixMultiply(const rs_matrix4x4* m, float4 in); | 添加于 API level 14 |
| float4 rsMatrixMultiply(rs_matrix4x4* m, float2 in); | 已从 API 级别 14 及更高版本移除 |
| float4 rsMatrixMultiply(rs_matrix4x4* m, float3 in); | 已从 API 级别 14 及更高版本移除 |
| float4 rsMatrixMultiply(rs_matrix4x4* m, float4 in); | 已从 API 级别 14 及更高版本移除 |
| void rsMatrixMultiply(rs_matrix2x2* m, const rs_matrix2x2* rhs); | |
| void rsMatrixMultiply(rs_matrix3x3* m, const rs_matrix3x3* rhs); | |
| void rsMatrixMultiply(rs_matrix4x4* m, const rs_matrix4x4* rhs); |
参数
| m | 乘积的左矩阵以及要设置的矩阵。 |
|---|---|
| rhs | 乘积的右矩阵。 |
| in |
对于矩阵乘法变体,将 m 设置为矩阵乘积 m * rhs。
使用此函数组合两个 4x4 变换矩阵时,结果矩阵将对应于首先执行 rhs 变换,然后执行原始 m 变换。
对于矩阵乘以向量的变体,返回向量后乘矩阵的结果,即 m * in。
将 float3 乘以 rs_matrix4x4 时,向量会扩展 (1)。
将 float2 乘以 rs_matrix4x4 时,向量会扩展 (0, 1)。
将 float2 乘以 rs_matrix3x3 时,向量会扩展 (0)。
从 API 14 开始,此函数将 const 矩阵作为第一个参数。
rsMatrixRotate : 将旋转应用于变换矩阵
| void rsMatrixRotate(rs_matrix4x4* m, float rot, float x, float y, float z); |
参数
| m | 要修改的矩阵。 |
|---|---|
| rot | 旋转量,以度为单位。 |
| x | 旋转轴向量的 X 分量。 |
| y | 旋转轴向量的 Y 分量。 |
| z | 旋转轴向量的 Z 分量。 |
rsMatrixScale : 将缩放应用于变换矩阵
| void rsMatrixScale(rs_matrix4x4* m, float x, float y, float z); |
参数
| m | 要修改的矩阵。 |
|---|---|
| x | 用于缩放 x 分量的乘数。 |
| y | 用于缩放 y 分量的乘数。 |
| z | 用于缩放 z 分量的乘数。 |
将矩阵 m 乘以缩放矩阵。
此函数修改变换矩阵以首先执行缩放。缩放时,向量的每个分量都乘以一个数。此数可以是负数。
要将此组合变换应用于向量,请使用 rsMatrixMultiply() 将向量乘以所创建的矩阵。
rsMatrixSet : 设置一个元素
| void rsMatrixSet(rs_matrix2x2* m, uint32_t col, uint32_t row, float v); | |
| void rsMatrixSet(rs_matrix3x3* m, uint32_t col, uint32_t row, float v); | |
| void rsMatrixSet(rs_matrix4x4* m, uint32_t col, uint32_t row, float v); |
参数
| m | 将被修改的矩阵。 |
|---|---|
| col | 要设置元素的从零开始的列。 |
| row | 要设置元素的从零开始的行。 |
| v | 要设置的值。 |
设置矩阵的一个元素。
警告:列和行参数的顺序可能出乎意料。
rsMatrixTranslate : 将平移应用于变换矩阵
| void rsMatrixTranslate(rs_matrix4x4* m, float x, float y, float z); |
参数
| m | 要修改的矩阵。 |
|---|---|
| x | 要添加到每个 x 分量的数。 |
| y | 要添加到每个 y 分量的数。 |
| z | 要添加到每个 z 分量的数。 |
将矩阵 m 乘以平移矩阵。
此函数修改变换矩阵以首先执行平移。平移时,一个数被添加到向量的每个分量中。
要将此组合变换应用于向量,请使用 rsMatrixMultiply() 将向量乘以所创建的矩阵。
rsMatrixTranspose : 就地转置矩阵
| void rsMatrixTranspose(rs_matrix2x2* m); | |
| void rsMatrixTranspose(rs_matrix3x3* m); | |
| void rsMatrixTranspose(rs_matrix4x4* m); |
参数
| m | 要转置的矩阵。 |
|---|
就地转置矩阵 m。