概览
这些函数可让您操控 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); |
参数
分钟 | 要从中提取元素的矩阵。 |
---|---|
列 | 要提取的元素的列(从零开始)。 |
行 | 要提取的元素的行(从零开始)。 |
返回矩阵的一个元素。
警告:列和行参数的顺序可能不符合预期。
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。