2013-01-14 124 views
5

有谁知道为什么glmatrix(1.x中)定义了这样mat4.translate:有人可以从glMatrix中解释mat4.translate函数吗?

/** 
* Translates a matrix by the given vector 
* 
* @param {mat4} mat mat4 to translate 
* @param {vec3} vec vec3 specifying the translation 
* @param {mat4} [dest] mat4 receiving operation result. If not specified result is written to mat 
* 
* @returns {mat4} dest if specified, mat otherwise 
*/ 
mat4.translate = function (mat, vec, dest) { 
    var x = vec[0], y = vec[1], z = vec[2], 
     a00, a01, a02, a03, 
     a10, a11, a12, a13, 
     a20, a21, a22, a23; 

    if (!dest || mat === dest) { 
     mat[12] = mat[0] * x + mat[4] * y + mat[8] * z + mat[12]; 
     mat[13] = mat[1] * x + mat[5] * y + mat[9] * z + mat[13]; 
     mat[14] = mat[2] * x + mat[6] * y + mat[10] * z + mat[14]; 
     mat[15] = mat[3] * x + mat[7] * y + mat[11] * z + mat[15]; 
     return mat; 
    } 

    a00 = mat[0]; a01 = mat[1]; a02 = mat[2]; a03 = mat[3]; 
    a10 = mat[4]; a11 = mat[5]; a12 = mat[6]; a13 = mat[7]; 
    a20 = mat[8]; a21 = mat[9]; a22 = mat[10]; a23 = mat[11]; 

    dest[0] = a00; dest[1] = a01; dest[2] = a02; dest[3] = a03; 
    dest[4] = a10; dest[5] = a11; dest[6] = a12; dest[7] = a13; 
    dest[8] = a20; dest[9] = a21; dest[10] = a22; dest[11] = a23; 

    dest[12] = a00 * x + a10 * y + a20 * z + mat[12]; 
    dest[13] = a01 * x + a11 * y + a21 * z + mat[13]; 
    dest[14] = a02 * x + a12 * y + a22 * z + mat[14]; 
    dest[15] = a03 * x + a13 * y + a23 * z + mat[15]; 
    return dest; 
}; 

它看起来像矢量值相乘(按比例)由定向矢量(DIR,左,上)的矩阵。但我不明白为什么。此外为什么mat [15]分配。我认为应该始终为1 ...

我用这大部分的时间,我很高兴:

mat4.translate_alt = function (mat, vec, factor) { 
      factor = factor || 1; 
     mat[12] += vec[0]*factor; 
     mat[13] += vec[1]*factor; 
     mat[14] += vec[2]*factor; 
    } 

什么时候应该使用mat4.translate当是我mat4.translate_alt足够?

回答

2

mat4.translate翻译具有给定向量(vec3)的矩阵,这与乘以平移矩阵相同。

查看它的另一种方式是说mat4.translate = mat4.multiply(someMatrix, mat4.create_translate_matrix(someVec3))(伪代码)。

+0

你第一句话对我来说很有意义。但translate_alt不会创建翻译矩阵,它会更改现有矩阵的x,y和z值,这些矩阵也可能有旋转。使用原始翻译功能有什么好处?考虑它,在我看来,代码将转换应用到矩阵的局部坐标系中,其中我的函数将其应用于世界坐标系。 –

相关问题