RenderScript 矩阵函数

概览

这些函数允许您操作 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要提取元素的从零开始的行。

返回矩阵的一个元素。

警告:列和行参数的顺序可能出乎意料。

rsMatrixInverse : 就地求矩阵逆

bool rsMatrixInverse(rs_matrix4x4* m);
参数
m要进行逆运算的矩阵。

如果矩阵成功求逆,则返回 true。

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 轴的视场角(以度为单位)。
aspectx / 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 分量。

将矩阵 m 乘以旋转矩阵。

此函数修改变换矩阵以首先执行旋转。旋转轴是 (x, y, z) 向量。

要将此组合变换应用于向量,请使用 rsMatrixMultiply() 将向量乘以所创建的矩阵。

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。