glm::translate - 它是否从向量构建矩阵?
glm::translate - does it build matrix from a vector?
函数glm::translate
有两个参数(矩阵M,向量V)。我的假设是否正确:
- 它将 M 乘以 V
- 创建一个新的单位矩阵
- 将向量的元素放在单位矩阵中的正确位置
- Returns 结果矩阵
不完全是它在概念上做了两件事:
它创建了一个 4x4 同质平移矩阵 T 具有通过向量 V 偏移每个点的效果:
/ 1 0 0 Vx \
T = | 0 1 0 Vy |
| 0 0 1 Vz |
\ 0 0 1 1 /
所以对于每个点 p=(px,py,pz,1) p' = T * p 将导致 p' = p + V:
/ 1 0 0 Vx \ / px \ / px * 1 + 1 * Vx \
| 0 1 0 Vy | * | py | = | py * 1 + 1 * Vy |
| 0 0 1 Vz | | pz | | pz * 1 + 1 * Vz |
\ 0 0 1 1 / \ 1 / \ 1 /
它post-将T乘以M和returns结果: M' = M * T
这具有将 M' 应用于任何点的效果,将首先应用 T,然后应用 [=30] 中的任何内容=]M之前:
p' = M' * p = M * T * p = M * (T * p)
请注意,如果知道其中一个操作数是平移矩阵,则可以简化一般矩阵乘法方案。在 post-mulitplying T 的情况下,这与首先将 V 转换为 M[ 具有相同的效果=68=],然后将结果向量添加到 M.
的最后一列
/ m00 m01 m02 m03 \ / 1 0 0 Vx \ / m00 m01 m02 (m03 + m00 * Vx + m01 * Vy + m02 * Vz) \
| m10 m11 m12 m13 | * | 0 1 0 Vy | = | m10 m11 m12 (m13 + m10 * Vx + m11 * Vy + m12 * Vz) |
| m20 m21 m22 m23 | | 0 0 1 Vz | | m20 m21 m22 (m23 + m20 * Vx + m21 * Vy + m22 * Vz) |
\ m30 m31 m32 m33 / \ 0 0 1 1 / \ m30 m31 m32 (m33 + m30 * Vx + m31 * Vy + m32 * Vz) /
所以不,它不是 return 单位矩阵,其中翻译部分被替换为 M * V,它 returns M' 其中 M * V 添加了 到翻译部分。
见glm 0.9.8 API Documentation for glm::translate
:
glm::translate
GLM_FUNC_DECL tmat4x4<T, P> glm::translate(
tmat4x4< T, P > const & m,
tvec3< T, P > const & v
)
Builds a translation 4*4 matrix created from a vector of 3 components.
Parameters:
m
Input matrix multiplied by this translation matrix.
v
Coordinates of a translation vector.
这意味着一个变换矩阵由向量v
构成
glm::vec3 v;
glm::mat4 t(
1.0f, 0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f,
v.x, v.y, v.z, 1.0f );
结果是输入矩阵m
与平移矩阵t
相乘:
glm::mat4 m;
glm::mat4 result = m * t;
函数glm::translate
有两个参数(矩阵M,向量V)。我的假设是否正确:
- 它将 M 乘以 V
- 创建一个新的单位矩阵
- 将向量的元素放在单位矩阵中的正确位置
- Returns 结果矩阵
不完全是它在概念上做了两件事:
它创建了一个 4x4 同质平移矩阵 T 具有通过向量 V 偏移每个点的效果:
/ 1 0 0 Vx \ T = | 0 1 0 Vy | | 0 0 1 Vz | \ 0 0 1 1 /
所以对于每个点 p=(px,py,pz,1) p' = T * p 将导致 p' = p + V:
/ 1 0 0 Vx \ / px \ / px * 1 + 1 * Vx \ | 0 1 0 Vy | * | py | = | py * 1 + 1 * Vy | | 0 0 1 Vz | | pz | | pz * 1 + 1 * Vz | \ 0 0 1 1 / \ 1 / \ 1 /
它post-将T乘以M和returns结果: M' = M * T
这具有将 M' 应用于任何点的效果,将首先应用 T,然后应用 [=30] 中的任何内容=]M之前:
p' = M' * p = M * T * p = M * (T * p)
请注意,如果知道其中一个操作数是平移矩阵,则可以简化一般矩阵乘法方案。在 post-mulitplying T 的情况下,这与首先将 V 转换为 M[ 具有相同的效果=68=],然后将结果向量添加到 M.
的最后一列 / m00 m01 m02 m03 \ / 1 0 0 Vx \ / m00 m01 m02 (m03 + m00 * Vx + m01 * Vy + m02 * Vz) \
| m10 m11 m12 m13 | * | 0 1 0 Vy | = | m10 m11 m12 (m13 + m10 * Vx + m11 * Vy + m12 * Vz) |
| m20 m21 m22 m23 | | 0 0 1 Vz | | m20 m21 m22 (m23 + m20 * Vx + m21 * Vy + m22 * Vz) |
\ m30 m31 m32 m33 / \ 0 0 1 1 / \ m30 m31 m32 (m33 + m30 * Vx + m31 * Vy + m32 * Vz) /
所以不,它不是 return 单位矩阵,其中翻译部分被替换为 M * V,它 returns M' 其中 M * V 添加了 到翻译部分。
见glm 0.9.8 API Documentation for glm::translate
:
glm::translate
GLM_FUNC_DECL tmat4x4<T, P> glm::translate( tmat4x4< T, P > const & m, tvec3< T, P > const & v )
Builds a translation 4*4 matrix created from a vector of 3 components.
Parameters:
m
Input matrix multiplied by this translation matrix.v
Coordinates of a translation vector.
这意味着一个变换矩阵由向量v
glm::vec3 v;
glm::mat4 t(
1.0f, 0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f,
v.x, v.y, v.z, 1.0f );
结果是输入矩阵m
与平移矩阵t
相乘:
glm::mat4 m;
glm::mat4 result = m * t;