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

时间:2017-12-27 10:43:58

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

函数glm::translate有2个参数(矩阵 M ,矢量 V )。我是否正确地承担以下事项:

  1. 它将 M V
  2. 相乘
  3. 制作新的身份矩阵
  4. 将向量的元素放在单位矩阵中的正确位置
  5. 返回结果矩阵

2 个答案:

答案 0 :(得分:1)

不完全是概念上的两件事:

  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 < / strong>将导致 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 ,anfd然后应用 M 中的任何内容:< / p>

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

  3. 注意,如果知道其中一个操作数是转换矩阵,则可以简化一般矩阵乘法方案。在后mulitplying 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 :(得分:1)

请参阅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;