c++ - glm::translate - 它是否从 vector 构建矩阵?

标签 c++ opengl matrix glm-math coordinate-transformation

glm::translate 函数接受 2 个参数(矩阵 M, vector V)。我的假设是否正确:

  1. 它将 M 乘以 V
  2. 制作一个新的单位矩阵
  3. 将 vector 的元素放在单位矩阵中的正确位置
  4. 返回结果矩阵

最佳答案

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

  1. 它创建一个 4x4 同质平移矩阵 T,它具有通过 vector 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        /
    
  2. 它将 T 乘以 M 并返回结果:M' = M * T

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

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

请注意,如果知道其中一个操作数是平移矩阵,则可以简化一般矩阵乘法方案。在后乘法 T 的情况下,这与首先将 V 转换为 M 的效果相同,然后将生成的 vector 添加到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 添加 到翻译部分。

关于c++ - glm::translate - 它是否从 vector 构建矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47990765/

相关文章:

c++ - 未在递归函数中创建调用堆栈

c++ - 这几行代码作为C++中的一个小测试框架有什么用呢?

c++ - 最小无窗口 OpenGL 上下文初始化

opengl - 关于低于 GL 3.2 的 GLFW 行为的问题

c++ - GLUT 纹理人工制品

java - DMatrixRMaj : get data in matrix form

c - 初始化结构的矩阵(双指针)成员

arrays - 在matlab中使用逐元素加法将值添加到矩阵的对角线

c++ - int main(int argc,char* argv[]) 为什么argc给出2个参数?

c++:如何将数据插入结构成员(位于 vector 中的结构)