glm::translate - 它是不是从向量构建矩阵?

Posted

技术标签:

【中文标题】glm::translate - 它是不是从向量构建矩阵?【英文标题】:glm::translate - does it build matrix from a vector?glm::translate - 它是否从向量构建矩阵? 【发布时间】:2017-12-27 10:43:57 【问题描述】:

函数 glm::translate 有 2 个参数(矩阵 M ,向量 V)。我是否正确地假设以下内容:

    它将 MV 相乘 创建一个新的单位矩阵 将向量的元素放在单位矩阵中的正确位置 返回结果矩阵

【问题讨论】:

glm::translate 创建一个翻译矩阵,由V 翻译。然后将M 乘以翻译矩阵,这就是结果。 @Rabbid76 如果您想选择矩阵相乘的顺序会怎样?就像本地翻译或全局翻译之间的区别。这个函数是否只允许你以一种特定的方式相乘? 【参考方案1】:

不完全是它在概念上做了两件事:

    它创建了一个 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        /
    

    它将 T 后乘到 M 并返回结果:M' = M * T

    这具有将 M' 应用到任何点的效果,将首先应用 T,然后再应用之前 M 中的任何内容:

    p' = M' * p = M * T * p = M * (T * p)

请注意,如果知道操作数之一是平移矩阵,则可以简化通用矩阵乘法方案。在后乘 T 的情况下,这与首先将 V 转换为 M 的效果相同,然后将结果向量添加到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) /

所以不,它不会返回一个单位矩阵,其中翻译部分被 M * V 替换,它返回 M' 其中M * V添加到翻译部分。

【讨论】:

通过后乘翻译矩阵得到本地翻译,对吗?我只是在阅读你写的关于简化乘法的文章,我对此感兴趣以进行优化,但我并没有完全理解你。我知道如果你想在全局坐标而不是本地翻译,你可以将翻译向量添加到适当的列/行,但是如果你想在本地翻译,相当于这里所做的后乘,是否存在优化它的方法? 我明白你在说什么,好像翻译矩阵大部分是来自恒等式的 1 和 0,你可以跳过一大堆乘法。这是我的游戏引擎优化的一个非常巧妙的技巧。 @Zebrafish:还有另一种看待这些事情的方法:让 T(v) 是平移向量 v 的平移矩阵,M 是一些通用变换矩阵。如果你想在应用 M 之后翻译,你可以将它组合成一个矩阵 T(v) * M,它只是将 v 添加到 M 的最右边一列。如果你想先翻译,你得到 M * T( v),这与先进行 M 变换,然后通过 也变换 向量 v' = M v 进行平移相同,因此 M * T(v) = T( Mv) * M,即等于只将向量v'=M*v添加到M的平移列中。【参考方案2】:

见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 
)   

构建一个由 3 个分量组成的向量创建的平移 4*4 矩阵

参数:

m 输入矩阵乘以这个平移矩阵v 平移向量的坐标。

这意味着由向量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 - 它是不是从向量构建矩阵?的主要内容,如果未能解决你的问题,请参考以下文章

glm::translate 与本地空间

"glm::translate" 输出一个值不正确的矩阵

GLM 中的矩阵除法

一些opengl和glm解释

GL Math : GLM 旋转函数旋转整个坐标系

c ++在析构函数中删除向量类成员内存