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* off, float4* limit); API 级别 24 中引入
void rsExtractFrustumPlanes(const rs_Matrix4x4* viewProj, float4* left, float4* right, float4* top, float4* bottom, float4* off, float4* limit); API 级别 24 及更高级别中移除
参数
ViewProj用于从中提取平面的矩阵。
左侧左侧平面。
向右右侧平面。
上半场顶部平面。
下半场底部平面。
在飞机附近。
远平面。
提醒

根据视图投影矩阵计算 6 个视锥平面

rsIsSphereInFrustum :检查球体是否在视锥平面内

bool rsIsSphereInFrustum(float4* sphere, float4* left, float4* right, float4* top, float4* bottom, float4* close, float4* limit);
参数
球体代表球面的 float4。
左侧左侧平面。
向右右侧平面。
上半场顶部平面。
下半场底部平面。
在飞机附近。
远平面。

如果球面位于 6 个视锥平面内,则返回 true。

rsMatrixGet :获取一个元素

float rsMatrixGet(const rs_Matrix2x2* m, uint32_t col, uint32_trow);
float rsMatrixGet(const rs_Matrix3x3* m, uint32_t col, uint32_trow);
float rsMatrixGet(const rs_Matrix4x4* m, uint32_t col, uint32_trow);
参数
分钟要从中提取元素的矩阵。
要提取的元素的列(从零开始)。
要提取的元素的行(从零开始)。

返回矩阵的一个元素。

警告:列和行参数的顺序可能不符合预期。

rsMatrixInverse :原位反转矩阵

bool rsMatrixInverse(rs_Matrix4x4* m);
参数
分钟要反转的矩阵。

如果矩阵已成功反转,则返回 true。

rsMatrixInverseTranspose :对矩阵进行反转和转置

bool rsMatrixInverseTranspose(rs_Matrix4x4* 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);
参数
目的地要设置的矩阵。
数组要为矩阵设置的值数组。这些数组的长度应为 4、9 或 16 个浮点数,具体取决于矩阵大小。
源颜色源矩阵。

通过浮点数组或其他矩阵设置矩阵的元素。

如果从数组加载,浮点数应按行主要顺序加载,即 row 0, column 0 应排在最前面,后跟 row 0, column 1 处的元素,依此类推。

如果从矩阵加载且来源小于目的地,则目的地的其余部分填充单位矩阵的元素。例如,如果将 rs_Matrix2x2 加载到 rs_Matrix4x4 中,将会得到以下结果:

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, floatleft, float right, float bottom, float top, float 动态更新, float fun);
参数
分钟要设置的矩阵。
左侧
向右
下半场
上半场

构造一个视锥投影矩阵,对由六个裁剪平面 left, right, bottom, top, near, far 标识的框进行转换。

如需将此投影应用于向量,请使用 rsMatrixMultiply() 将该向量乘以创建的矩阵。

rsMatrixLoadIdentity :加载单位矩阵

void rsMatrixLoadIdentity(rs_Matrix2x2* m);
void rsMatrixLoadIdentity(rs_Matrix3x3* m);
void rsMatrixLoadIdentity(rs_Matrix4x4* 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);
参数
分钟要设置的矩阵。
公升产品的左矩阵。
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 动态更新, float fun);
参数
分钟要设置的矩阵。
左侧
向右
下半场
上半场

构造正交投影矩阵,将由六个裁剪平面 left, right, bottom, top, near, far 标识的框转换为一个单位立方体,其角为 (-1, -1, -1),另一角为 (1, 1, 1)

如需将此投影应用于向量,请使用 rsMatrixMultiply() 将该向量乘以创建的矩阵。

请参阅 https://zh.wikipedia.org/wiki/Orthographic_projection。

rsMatrixLoadPerspective :加载透视投影矩阵

void rsMatrixLoadPerspective(rs_Matrix4x4* m, float fovy, float landscape, float nearby, float fun);
参数
分钟要设置的矩阵。
迷幻沿 Y 轴的视野(以度为单位)。
切面x / y 比率。
靠近裁剪平面。
远裁剪平面。

构造一个透视投影矩阵,假设一个对称的视野。

如需将此投影应用于向量,请使用 rsMatrixMultiply() 将该向量乘以创建的矩阵。

rsMatrixLoadRotate :加载旋转矩阵

void rsMatrixLoadRotate(rs_Matrix4x4* m, float rot, float x, float y, float z);
参数
分钟要设置的矩阵。
腐烂要旋转多少度(以度为单位)。
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);
参数
分钟要设置的矩阵。
x对 x 分量进行缩放的倍数。
y将 y 分量缩放的倍数。
z用于缩放 z 分量的倍数。

此函数会创建一个缩放矩阵,其中向量的每个分量都与一个数字相乘。此数值可以为负数。

要缩放向量,请使用 rsMatrixMultiply() 将向量乘以创建的矩阵。

rsMatrixLoadTranslate :加载翻译矩阵

void rsMatrixLoadTranslate(rs_Matrix4x4* m, float x, float y, float z);
参数
分钟要设置的矩阵。
x要添加到每个 x 分量的数字。
y要添加到每个 y 分量的数值。
z要添加到每个 z 分量的数值。

此函数会创建一个转换矩阵,其中向向量的每个元素都添加一个数字。

如需平移向量,请使用 rsMatrixMultiply() 将向量乘以创建的矩阵。

rsMatrixMultiply :将矩阵与向量或其他矩阵相乘

float2 rsMatrixMultiply(const rs_Matrix2x2* m, float2 in); API 级别 14 中引入
float2 rsMatrixMultiply(rs_Matrix2x2* m, float2 in); API 级别 14 及更高级别中移除
float3 rsMatrixMultiply(const rs_Matrix3x3* m, float2 in); API 级别 14 中引入
float3 rsMatrixMultiply(const rs_Matrix3x3* m, float3 in); API 级别 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 级别 14 中引入
float4 rsMatrixMultiply(const rs_Matrix4x4* m, float3 in); API 级别 14 中引入
float4 rsMatrixMultiply(const rs_Matrix4x4* m, float4 in); API 级别 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);
参数
分钟乘积的左矩阵和要设置的矩阵。
RHS产品的右侧矩阵。
英寸

对于“按矩阵变体”划分的矩阵,将 m 设置为矩阵乘积 m * rhs

使用此函数合并两个 4x4 转换矩阵时,生成的矩阵相当于先执行 rhs 转换,然后再执行原始 m 转换。

对于矢量变体的矩阵,返回矢量与矩阵的后乘,即m * in

将 float3 乘以 rs_Matrix4x4 时,向量会使用 (1) 展开。

将 float2 乘以 rs_Matrix4x4 时,向量会使用 (0, 1) 展开。

将 float2 乘以 rs_Matrix3x3 时,向量会使用 (0) 展开。

从 API 14 开始,此函数将常量矩阵作为第一个参数。

rsMatrixRotate :对转换矩阵应用旋转

void rsMatrixRotate(rs_Matrix4x4* m, float rot, float x, float y, float z);
参数
分钟要修改的矩阵。
腐烂要旋转多少度(以度为单位)。
x矢量的 X 分量,即旋转轴。
y矢量的 Y 分量,即旋转轴。
z矢量的 Z 分量,即旋转轴。

将矩阵 m 与旋转矩阵相乘。

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

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

rsMatrixScale :对转换矩阵应用缩放

void rsMatrixScale(rs_Matrix4x4* m, float x, float y, float z);
参数
分钟要修改的矩阵。
x对 x 分量进行缩放的倍数。
y将 y 分量缩放的倍数。
z用于缩放 z 分量的倍数。

将矩阵 m 与缩放矩阵相乘。

此函数会修改转换矩阵,以首先执行缩放。进行缩放时,矢量的每个分量都会乘以一个数字。此数值可以为负数。

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

rsMatrixSet :设置一个元素

void rsMatrixSet(rs_Matrix2x2* m, uint32_t col, uint32_trow, float v);
void rsMatrixSet(rs_Matrix3x3* m, uint32_t col, uint32_trow, float v);
void rsMatrixSet(rs_Matrix4x4* m, uint32_t col, uint32_trow, float v);
参数
分钟要修改的矩阵。
要设置的元素的列(从零开始)。
要设置的元素的行(从零开始)。
v要设置的值。

设置矩阵的元素。

警告:列和行参数的顺序可能不符合预期。

rsMatrixTranslate :将翻译应用于转换矩阵

void rsMatrixTranslate(rs_Matrix4x4* m, float x, float y, float z);
参数
分钟要修改的矩阵。
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。