Нет описания

matrix.js 1.9KB

    var matrix = {}; matrix.multiply = function(a, dim_a, b, dim_b) { if (dim_a[1] != dim_b[0]) { throw new Error("cols a != rows b"); } else { var c = []; var s = dim_a[1]; var n = dim_a[0], m = dim_b[1]; for (var i = 0; i < n; i++) { for (var j = 0; j < m; j++) { var sum = 0; for (var k = 0; k < s; k++) { sum += a[i * s + k] * b[k * m + j]; } c[i * m + j] = sum; } } return c; } }; matrix.multiplyMany4x4 = function() { var m = arguments[0]; for(var i = 1; i < arguments.length; i++) { m = matrix.multiply(m, [4, 4], arguments[i], [4, 4]); } return m; } matrix.identity = function(dim) { var m = []; for(var i = 0; i < dim; i++) { for(var j = 0; j < dim; j++) { m[i * dim + j] = i == j ? 1.0 : 0.0; } } return m; } matrix.transpose = function(m, dim) { var t = []; for(var i = 0; i < dim[0]; i++) { for(var j = 0; j < dim[1]; j++) { t[j * dim[0] + i] = m[i * dim[1] + j]; } } return t; } matrix.translate = function(tx, ty, tz) { var tx = tx || 0.0, ty = ty || 0.0, tz = tz || 0.0; return [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, tx, ty, tz, 1 ]; } matrix.scale = function(sx, sy, sz) { var sx = sx || 1.0, sy = sy || 1.0, sz = sz || 1.0; return [ sx, 0, 0, 0, 0, sy, 0, 0, 0, 0, sz, 0, 0, 0, 0, 1 ]; } matrix.rotateX = function(angle) { var s = Math.sin(angle); var c = Math.cos(angle); return [ 1, 0, 0, 0, 0, c, s, 0, 0, -s, c, 0, 0, 0, 0, 1 ]; } matrix.rotateY = function(angle) { var s = Math.sin(angle); var c = Math.cos(angle); return [ c, 0, -s, 0, 0, 1, 0, 0, s, 0, c, 0, 0, 0, 0, 1 ]; } matrix.rotateZ = function(angle) { var s = Math.sin(angle); var c = Math.cos(angle); return [ c, s, 0, 0, -s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ]; } matrix.perspective = function(fov, aspect) { return [ Math.PI / 3 / aspect, 0, 0, 0, 0, Math.PI / 3, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1 ]; }