hokkoo / webgl-mjs

Automatically exported from code.google.com/p/webgl-mjs

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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