概览
这些函数可用于处理 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 | 源矩阵。 |
从浮点数数组或另一个矩阵设置矩阵的元素。
如果从数组加载,浮点数应按行优先顺序排列,即 第 0 行,第 0 列 的元素应在前,后跟 第 0 行,第 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 之前,不支持将结果存储回右侧矩阵,这将导致未定义行为。请改用 rsMatrixMultiply。例如,不要执行 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() 将向量乘以创建的矩阵。
rsMatrixLoadPerspective :加载透视投影矩阵
| void rsMatrixLoadPerspective(rs_matrix4x4* m, float fovy, float aspect, float near, float far); |
参数
| m | 要设置的矩阵。 |
|---|---|
| fovy | 视野,沿 Y 轴的角度(以度为单位)。 |
| aspect | x / y 的比率。 |
| near | Near clipping plane. |
| far | Far clipping plane. |
构建透视投影矩阵,假设视野对称。
要将此投影应用于向量,请使用 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() 将向量乘以创建的矩阵。
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 级别 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); |
参数
| 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。