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。