M4x4_rotate has logic error? Or WebGLArrays are not primitives...
GoogleCodeExporter opened this issue · comments
I had to "fix" M4x4_makeRotate as these lines (and those that followed) were
doing simple math against arrays and return NaN in my code
var c = Math.cos(angle);
var c1 = 1-c;
var s = Math.sin(angle);
I'm a noob to 3d maths so I don't know for sure I've done these right...
Al;
exports.M4x4_rotate = function (angle, axis, m, r) {
if (exports.MJS_DO_ASSERT) { MathUtils_assert(angle.length == 3, "angle.length == 3"); }
if (exports.MJS_DO_ASSERT) { MathUtils_assert(axis.length == 3, "axis.length == 3"); }
if (exports.MJS_DO_ASSERT) { MathUtils_assert(m.length == 16, "m.length == 16"); }
if (exports.MJS_DO_ASSERT) { MathUtils_assert(r == undefined || r.length == 16, "r == undefined || r.length == 16"); }
if (r == undefined)
r = new Array(16);
var a0 = axis[0], a1 = axis[1], a2 = axis[2];
var l = Math.sqrt(a0*a0 + a1*a1 + a2*a2);
var x = a0, y = a1, z = a2;
if (l != 1.0) {
var im = 1.0 / l;
x *= im;
y *= im;
z *= im;
}
var c = [ Math.cos(angle[0]), Math.cos(angle[1]), Math.cos(angle[2]) ];
var c1 = [ 1-c[0], 1-c[1], 1-c[2] ];
var s = [ Math.sin(angle[0]), Math.sin(angle[1]), Math.sin(angle[2]) ];
var xs = x*s[0];
var ys = y*s[1];
var zs = z*s[2];
var xyc1 = x * y * c1[0];
var xzc1 = x * z * c1[1];
var yzc1 = y * z * c1[2];
var m11 = m[0];
var m21 = m[1];
var m31 = m[2];
var m41 = m[3];
var m12 = m[4];
var m22 = m[5];
var m32 = m[6];
var m42 = m[7];
var m13 = m[8];
var m23 = m[9];
var m33 = m[10];
var m43 = m[11];
var t11 = x * x * c1[0] + c[0];
var t21 = xyc1 + zs;
var t31 = xzc1 - ys;
var t12 = xyc1 - zs;
var t22 = y * y * c1[1] + c[1];
var t32 = yzc1 + xs;
var t13 = xzc1 + ys;
var t23 = yzc1 - xs;
var t33 = z * z * c1[2] + c[2];
r[0] = m11 * t11 + m12 * t21 + m13 * t31;
r[1] = m21 * t11 + m22 * t21 + m23 * t31;
r[2] = m31 * t11 + m32 * t21 + m33 * t31;
r[3] = m41 * t11 + m42 * t21 + m43 * t31;
r[4] = m11 * t12 + m12 * t22 + m13 * t32;
r[5] = m21 * t12 + m22 * t22 + m23 * t32;
r[6] = m31 * t12 + m32 * t22 + m33 * t32;
r[7] = m41 * t12 + m42 * t22 + m43 * t32;
r[8] = m11 * t13 + m12 * t23 + m13 * t33;
r[9] = m21 * t13 + m22 * t23 + m23 * t33;
r[10] = m31 * t13 + m32 * t23 + m33 * t33;
r[11] = m41 * t13 + m42 * t23 + m43 * t33;
if (r != m) {
r[12] = m[12];
r[13] = m[13];
r[14] = m[14];
r[15] = m[15];
}
return r;
};
Original issue reported on code.google.com by allen.jo...@gmail.com
on 23 Apr 2011 at 11:42