5

glmatrix ( 1.x ) が 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, left, up ) で乗算 (スケーリング) されているように見えます。しかし、私はその理由を理解していません。また、なぜ 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 で十分ですか?

4

1 に答える 1

2

mat4.translate指定されたベクトル (vec3) で行列を変換します。これは、変換行列を掛けることと同じです。

それを見る別の方法は、mat4.translate = mat4.multiply(someMatrix, mat4.create_translate_matrix(someVec3))(疑似コード)と言うことです。

于 2013-01-14T15:47:33.870 に答える