js实现蒲公英飞舞动画效果代码

代码语言:html

所属分类:粒子

代码描述:js实现蒲公英飞舞动画效果代码

代码标签: 飞舞 动画 效果

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

    <style type="text/css">
        .custom-background{
            height: 100vh;
            width: 100vw;
        	background-image:url('//repo.bfw.wiki/bfwrepo/image/5e44fafbdc615.png');
        	background-size:cover;
        	background-repeat:no-repeat;
        
        }
    </style>

    <script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/jquery-3.2.1.min.js"></script>
</head>

<body class="custom-background">

    <div class="snow-container" style="position:fixed;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:100001;"></div>

    <script type="text/javascript">
        // snow
    var THREE = THREE || {};
    if (!self.Int32Array) self.Int32Array = Array, self.Float32Array = Array;
    THREE.Color = function(a) {
        a !== void 0 && this.setHex(a);
        return this
    };
    THREE.Color.prototype = {
        constructor: THREE.Color,
        r: 1,
        g: 1,
        b: 1,
        copy: function(a) {
            this.r = a.r;
            this.g = a.g;
            this.b = a.b;
            return this
        },
        copyGammaToLinear: function(a) {
            this.r = a.r * a.r;
            this.g = a.g * a.g;
            this.b = a.b * a.b;
            return this
        },
        copyLinearToGamma: function(a) {
            this.r = Math.sqrt(a.r);
            this.g = Math.sqrt(a.g);
            this.b = Math.sqrt(a.b);
            return this
        },
        setRGB: function(a, b, c) {
            this.r = a;
            this.g = b;
            this.b = c;
            return this
        },
        setHSV: function(a, b, c) {
            var d, f, e;
            if (c === 0) this.r = this.g = this.b = 0;
            else switch (d = Math.floor(a * 6), f = a * 6 - d, a = c * (1 - b), e = c * (1 - b * f), b = c * (1 - b * (1 - f)), d) {
                case 1:
                    this.r = e;
                    this.g = c;
                    this.b = a;
                    break;
                case 2:
                    this.r = a;
                    this.g = c;
                    this.b = b;
                    break;
                case 3:
                    this.r = a;
                    this.g = e;
                    this.b = c;
                    break;
                case 4:
                    this.r = b;
                    this.g = a;
                    this.b = c;
                    break;
                case 5:
                    this.r = c;
                    this.g = a;
                    this.b = e;
                    break;
                case 6:
                case 0:
                    this.r = c, this.g = b, this.b = a
            }
            return this
        },
        setHex: function(a) {
            a = Math.floor(a);
            this.r = (a >> 16 & 255) / 255;
            this.g = (a >> 8 & 255) / 255;
            this.b = (a & 255) / 255;
            return this
        },
        getHex: function() {
            return ~~(this.r * 255) << 16 ^ ~~(this.g * 255) << 8 ^ ~~(this.b * 255)
        },
        getContextStyle: function() {
            return "rgb(" + Math.floor(this.r * 255) + "," + Math.floor(this.g * 255) + "," + Math.floor(this.b * 255) + ")"
        },
        clone: function() {
            return (new THREE.Color).setRGB(this.r, this.g, this.b)
        }
    };
    THREE.Vector2 = function(a, b) {
        this.x = a || 0;
        this.y = b || 0
    };
    THREE.Vector2.prototype = {
        constructor: THREE.Vector2,
        set: function(a, b) {
            this.x = a;
            this.y = b;
            return this
        },
        copy: function(a) {
            this.x = a.x;
            this.y = a.y;
            return this
        },
        clone: function() {
            return new THREE.Vector2(this.x, this.y)
        },
        add: function(a, b) {
            this.x = a.x + b.x;
            this.y = a.y + b.y;
            return this
        },
        addSelf: function(a) {
            this.x += a.x;
            this.y += a.y;
            return this
        },
        sub: function(a, b) {
            this.x = a.x - b.x;
            this.y = a.y - b.y;
            return this
        },
        subSelf: function(a) {
            this.x -= a.x;
            this.y -= a.y;
            return this
        },
        multiplyScalar: function(a) {
            this.x *= a;
            this.y *= a;
            return this
        },
        divideScalar: function(a) {
            a ? (this.x /= a, this.y /= a) : this.set(0, 0);
            return this
        },
        negate: function() {
            return this.multiplyScalar(-1)
        },
        dot: function(a) {
            return this.x * a.x + this.y * a.y
        },
        lengthSq: function() {
            return this.x * this.x + this.y * this.y
        },
        length: function() {
            return Math.sqrt(this.lengthSq())
        },
        normalize: function() {
            return this.divideScalar(this.length())
        },
        distanceTo: function(a) {
            return Math.sqrt(this.distanceToSquared(a))
        },
        distanceToSquared: function(a) {
            var b = this.x - a.x,
                a = this.y - a.y;
            return b * b + a * a
        },
        setLength: function(a) {
            return this.normalize().multiplyScalar(a)
        },
        equals: function(a) {
            return a.x === this.x && a.y === this.y
        }
    };
    THREE.Vector3 = function(a, b, c) {
        this.x = a || 0;
        this.y = b || 0;
        this.z = c || 0
    };
    THREE.Vector3.prototype = {
        constructor: THREE.Vector3,
        set: function(a, b, c) {
            this.x = a;
            this.y = b;
            this.z = c;
            return this
        },
        setX: function(a) {
            this.x = a;
            return this
        },
        setY: function(a) {
            this.y = a;
            return this
        },
        setZ: function(a) {
            this.z = a;
            return this
        },
        copy: function(a) {
            this.x = a.x;
            this.y = a.y;
            this.z = a.z;
            return this
        },
        clone: function() {
            return new THREE.Vector3(this.x, this.y, this.z)
        },
        add: function(a, b) {
            this.x = a.x + b.x;
            this.y = a.y + b.y;
            this.z = a.z + b.z;
            return this
        },
        addSelf: function(a) {
            this.x += a.x;
            this.y += a.y;
            this.z += a.z;
            return this
        },
        addScalar: function(a) {
            this.x += a;
            this.y += a;
            this.z += a;
            return this
        },
        sub: function(a, b) {
            this.x = a.x - b.x;
            this.y = a.y - b.y;
            this.z = a.z - b.z;
            return this
        },
        subSelf: function(a) {
            this.x -= a.x;
            this.y -= a.y;
            this.z -= a.z;
            return this
        },
        multiply: function(a, b) {
            this.x = a.x * b.x;
            this.y = a.y * b.y;
            this.z = a.z * b.z;
            return this
        },
        multiplySelf: function(a) {
            this.x *= a.x;
            this.y *= a.y;
            this.z *= a.z;
            return this
        },
        multiplyScalar: function(a) {
            this.x *= a;
            this.y *= a;
            this.z *= a;
            return this
        },
        divideSelf: function(a) {
            this.x /= a.x;
            this.y /= a.y;
            this.z /= a.z;
            return this
        },
        divideScalar: function(a) {
            a ? (this.x /= a, this.y /= a, this.z /= a) : this.z = this.y = this.x = 0;
            return this
        },
        negate: function() {
            return this.multiplyScalar(-1)
        },
        dot: function(a) {
            return this.x * a.x + this.y * a.y + this.z * a.z
        },
        lengthSq: function() {
            return this.x * this.x + this.y * this.y + this.z * this.z
        },
        length: function() {
            return Math.sqrt(this.lengthSq())
        },
        lengthManhattan: function() {
            return this.x + this.y + this.z
        },
        normalize: function() {
            return this.divideScalar(this.length())
        },
        setLength: function(a) {
            return this.normalize().multiplyScalar(a)
        },
        cross: function(a, b) {
            this.x = a.y * b.z - a.z * b.y;
            this.y = a.z * b.x - a.x * b.z;
            this.z = a.x * b.y - a.y * b.x;
            return this
        },
        crossSelf: function(a) {
            var b = this.x,
                c = this.y,
                d = this.z;
            this.x = c * a.z - d * a.y;
            this.y = d * a.x - b * a.z;
            this.z = b * a.y - c * a.x;
            return this
        },
        distanceTo: function(a) {
            return Math.sqrt(this.distanceToSquared(a))
        },
        distanceToSquared: function(a) {
            return (new THREE.Vector3).sub(this, a).lengthSq()
        },
        setPositionFromMatrix: function(a) {
            this.x = a.n14;
            this.y = a.n24;
            this.z = a.n34
        },
        setRotationFromMatrix: function(a) {
            var b = Math.cos(this.y);
            this.y = Math.asin(a.n13);
            Math.abs(b) > 1.0E-5 ? (this.x = Math.atan2(-a.n23 / b, a.n33 / b), this.z = Math.atan2(-a.n12 / b, a.n11 / b)) : (this.x = 0, this.z = Math.atan2(a.n21, a.n22))
        },
        isZero: function() {
            return this.lengthSq() < 1.0E-4
        }
    };
    THREE.Vector4 = function(a, b, c, d) {
        this.x = a || 0;
        this.y = b || 0;
        this.z = c || 0;
        this.w = d !== void 0 ? d : 1
    };
    THREE.Vector4.prototype = {
        constructor: THREE.Vector4,
        set: function(a, b, c, d) {
            this.x = a;
            this.y = b;
            this.z = c;
            this.w = d;
            return this
        },
        copy: function(a) {
            this.x = a.x;
            this.y = a.y;
            this.z = a.z;
            this.w = a.w !== void 0 ? a.w : 1
        },
        clone: function() {
            return new THREE.Vector4(this.x, this.y, this.z, this.w)
        },
        add: function(a, b) {
            this.x = a.x + b.x;
            this.y = a.y + b.y;
            this.z = a.z + b.z;
            this.w = a.w + b.w;
            return this
        },
        addSelf: function(a) {
            this.x += a.x;
            this.y += a.y;
            this.z += a.z;
            this.w += a.w;
            return this
        },
        sub: function(a, b) {
            this.x = a.x - b.x;
            this.y = a.y - b.y;
            this.z = a.z - b.z;
            this.w = a.w - b.w;
            return this
        },
        subSelf: function(a) {
            this.x -= a.x;
            this.y -= a.y;
            this.z -= a.z;
            this.w -= a.w;
            return this
        },
        multiplyScalar: function(a) {
            this.x *= a;
            this.y *= a;
            this.z *= a;
            this.w *= a;
            return this
        },
        divideScalar: function(a) {
            a ? (this.x /= a, this.y /= a, this.z /= a, this.w /= a) : (this.z = this.y = this.x = 0, this.w = 1);
            return this
        },
        negate: function() {
            return this.multiplyScalar(-1)
        },
        dot: function(a) {
            return this.x * a.x + this.y * a.y + this.z * a.z + this.w * a.w
        },
        lengthSq: function() {
            return this.dot(this)
        },
        length: function() {
            return Math.sqrt(this.lengthSq())
        },
        normalize: function() {
            return this.divideScalar(this.length())
        },
        setLength: function(a) {
            return this.normalize().multiplyScalar(a)
        },
        lerpSelf: function(a, b) {
            this.x += (a.x - this.x) * b;
            this.y += (a.y - this.y) * b;
            this.z += (a.z - this.z) * b;
            this.w += (a.w - this.w) * b;
            return this
        }
    };
    THREE.Ray = function(a, b) {
        function c(a, b, c) {
            i.sub(c, a);
            p = i.dot(b);
            if (p <= 0) return null;
            k = n.add(a, o.copy(b).multiplyScalar(p));
            return s = c.distanceTo(k)
        }

        function d(a, b, c, d) {
            i.sub(d, b);
            n.sub(c, b);
            o.sub(a, b);
            K = i.dot(i);
            C = i.dot(n);
            Q = i.dot(o);
            O = n.dot(n);
            w = n.dot(o);
            F = 1 / (K * O - C * C);
            z = (O * Q - C * w) * F;
            D = (K * w - C * Q) * F;
            return z >= 0 && D >= 0 && z + D < 1
        }
        this.origin = a || new THREE.Vector3;
        this.direction = b || new THREE.Vector3;
        this.intersectScene = function(a) {
            return this.intersectObjects(a.children)
        };
        this.intersectObjects = function(a) {
            var b, c, d = [];
            b = 0;
            for (c = a.length; b < c; b++) Array.prototype.push.apply(d, this.intersectObject(a[b]));
            d.sort(function(a, b) {
                return a.distance - b.distance
            });
            return d
        };
        var f = new THREE.Vector3,
            e = new THREE.Vector3,
            g = new THREE.Vector3,
            h = new THREE.Vector3,
            a = new THREE.Vector3,
            b = new THREE.Vector3,
            m = new THREE.Vector3,
            l = new THREE.Vector3,
            j = new THREE.Vector3;
        this.intersectObject = function(k) {
            for (var i, o = [], n = 0, W = k.children.length; n < W; n++) Array.prototype.push.apply(o, this.intersectObject(k.children[n]));
            if (k instanceof THREE.Particle) {
                n = c(this.origin, this.direction, k.matrixWorld.getPosition());
                if (n === null || n > k.scale.x) return [];
                i = {
                    distance: n,
                    point: k.position,
                    face: null,
                    object: k
                };
                o.push(i)
            } else if (k instanceof THREE.Mesh) {
                n = c(this.origin, this.direction, k.matrixWorld.getPosition());
                if (n === null || n > k.geometry.boundingSphere.radius * Math.max(k.scale.x, Math.max(k.scale.y, k.scale.z))) return o;
                var p, G = k.geometry,
                    H = G.vertices,
                    I;
                k.matrixRotationWorld.extractRotation(k.matrixWorld);
                n = 0;
                for (W = G.faces.length; n < W; n++)
                    if (i = G.faces[n], a.copy(this.origin), b.copy(this.direction), I = k.matrixWorld, m = I.multiplyVector3(m.copy(i.centroid)).subSelf(a), p = m.dot(b), !(p <= 0) && (f = I.multiplyVector3(f.copy(H[i.a].position)), e = I.multiplyVector3(e.copy(H[i.b].position)), g = I.multiplyVector3(g.copy(H[i.c].position)), i instanceof THREE.Face4 && (h = I.multiplyVector3(h.copy(H[i.d].position))), l = k.matrixRotationWorld.multiplyVector3(l.copy(i.normal)), p = b.dot(l), k.doubleSided || (k.flipSided ? p > 0 : p < 0)))
                        if (p = l.dot(m.sub(f, a)) / p, j.add(a, b.multiplyScalar(p)), i instanceof THREE.Face3) d(j, f, e, g) && (i = {
                            distance: a.distanceTo(j),
                            point: j.clone(),
                            face: i,
                            object: k
                        }, o.push(i));
                        else if (i instanceof THREE.Face4 && (d(j, f, e, h) || d(j, e, g, h))) i = {
                    distance: a.distanceTo(j),
                    point: j.clone(),
                    face: i,
                    object: k
                }, o.push(i)
            }
            return o
        };
        var i = new THREE.Vector3,
            n = new THREE.Vector3,
            o = new THREE.Vector3,
            p, k, s, K, C, Q, O, w, F, z, D
    };
    THREE.Rectangle = function() {
        function a() {
            e = d - b;
            g = f - c
        }
        var b, c, d, f, e, g, h = !0;
        this.getX = function() {
            return b
        };
        this.getY = function() {
            return c
        };
        this.getWidth = function() {
            return e
        };
        this.getHeight = function() {
            return g
        };
        this.getLeft = function() {
            return b
        };
        this.getTop = function() {
            return c
        };
        this.getRight = function() {
            return d
        };
        this.getBottom = function() {
            return f
        };
        this.set = function(e, g, j, i) {
            h = !1;
            b = e;
            c = g;
            d = j;
            f = i;
            a()
        };
        this.addPoint = function(e, g) {
            h ? (h = !1, b = e, c = g, d = e, f = g) : (b = b < e ? b : e, c = c < g ? c : g, d = d > e ? d : e, f = f > g ? f : g);
            a()
        };
        this.add3Points = function(e, g, j, i, n, o) {
            h ? (h = !1, b = e < j ? e < n ? e : n : j < n ? j : n, c = g < i ? g < o ? g : o : i < o ? i : o, d = e > j ? e > n ? e : n : j > n ? j : n, f = g > i ? g > o ? g : o : i > o ? i : o) : (b = e < j ? e < n ? e < b ? e : b : n < b ? n : b : j < n ? j < b ? j : b : n < b ? n : b, c = g < i ? g < o ? g < c ? g : c : o < c ? o : c : i < o ? i < c ? i : c : o < c ? o : c, d = e > j ? e > n ? e > d ? e : d : n > d ? n : d : j > n ? j > d ? j : d : n > d ? n : d, f = g > i ? g > o ? g > f ? g : f : o > f ? o : f : i > o ? i > f ? i : f : o > f ? o : f);
            a()
        };
        this.addRectangle = function(e) {
            h ? (h = !1, b = e.getLeft(), c = e.getTop(), d = e.getRight(), f = e.getBottom()) : (b = b < e.getLeft() ? b : e.getLeft(), c = c < e.getTop() ? c : e.getTop(), d = d > e.getRight() ? d : e.getRight(), f = f > e.getBottom() ? f : e.getBottom());
            a()
        };
        this.inflate = function(e) {
            b -= e;
            c -= e;
            d += e;
            f += e;
            a()
        };
        this.minSelf = function(e) {
            b = b > e.getLeft() ? b : e.getLeft();
            c = c > e.getTop() ? c : e.getTop();
            d = d < e.getRight() ? d : e.getRight();
            f = f < e.getBottom() ? f : e.getBottom();
            a()
        };
        this.intersects = function(a) {
            return Math.min(d, a.getRight()) - Math.max(b, a.getLeft()) >= 0 && Math.min(f, a.getBottom()) - Math.max(c, a.getTop()) >= 0
        };
        this.empty = function() {
            h = !0;
            f = d = c = b = 0;
            a()
        };
        this.isEmpty = function() {
            return h
        }
    };
    THREE.Math = {
        clamp: function(a, b, c) {
            return a < b ? b : a > c ? c : a
        },
        clampBottom: function(a, b) {
            return a < b ? b : a
        },
        mapLinear: function(a, b, c, d, f) {
            return d + (a - b) * (f - d) / (c - b)
        },
        random16: function() {
            return (65280 * Math.random() + 255 * Math.random()) / 65535
        }
    };
    THREE.Matrix3 = function() {
        this.m = []
    };
    THREE.Matrix3.prototype = {
        constructor: THREE.Matrix3,
        transpose: function() {
            var a, b = this.m;
            a = b[1];
            b[1] = b[3];
            b[3] = a;
            a = b[2];
            b[2] = b[6];
            b[6] = a;
            a = b[5];
            b[5] = b[7];
            b[7] = a;
            return this
        },
        transposeIntoArray: function(a) {
            var b = this.m;
            a[0] = b[0];
            a[1] = b[3];
            a[2] = b[6];
            a[3] = b[1];
            a[4] = b[4];
            a[5] = b[7];
            a[6] = b[2];
            a[7] = b[5];
            a[8] = b[8];
            return this
        }
    };
    THREE.Matrix4 = function(a, b, c, d, f, e, g, h, m, l, j, i, n, o, p, k) {
        this.set(a !== void 0 ? a : 1, b || 0, c || 0, d || 0, f || 0, e !== void 0 ? e : 1, g || 0, h || 0, m || 0, l || 0, j !== void 0 ? j : 1, i || 0, n || 0, o || 0, p || 0, k !== void 0 ? k : 1);
        this.flat = Array(16);
        this.m33 = new THREE.Matrix3
    };
    THREE.Matrix4.prototype = {
        constructor: THREE.Matrix4,
        set: function(a, b, c, d, f, e, g, h, m, l, j, i, n, o, p, k) {
            this.n11 = a;
            this.n12 = b;
            this.n13 = c;
            this.n14 = d;
            this.n21 = f;
            this.n22 = e;
            this.n23 = g;
            this.n24 = h;
            this.n31 = m;
            this.n32 = l;
            this.n33 = j;
            this.n34 = i;
            this.n41 = n;
            this.n42 = o;
            this.n43 = p;
            this.n44 = k;
            return this
        },
        identity: function() {
            this.set(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
            return this
        },
        copy: function(a) {
            this.set(a.n11, a.n12, a.n13, a.n14, a.n21, a.n22, a.n23, a.n24, a.n31, a.n32, a.n33, a.n34, a.n41, a.n42, a.n43, a.n44);
            return this
        },
        lookAt: function(a, b, c) {
            var d = THREE.Matrix4.__v1,
                f = THREE.Matrix4.__v2,
                e = THREE.Matrix4.__v3;
            e.sub(a, b).normalize();
            if (e.length() === 0) e.z = 1;
            d.cross(c, e).normalize();
            d.length() === 0 && (e.x += 1.0E-4, d.cross(c, e).normalize());
            f.cross(e, d).normalize();
            this.n11 = d.x;
            this.n12 = f.x;
            this.n13 = e.x;
            this.n21 = d.y;
            this.n22 = f.y;
            this.n23 = e.y;
            this.n31 = d.z;
            this.n32 = f.z;
            this.n33 = e.z;
            return this
        },
        multiply: function(a, b) {
            var c = a.n11,
                d = a.n12,
                f = a.n13,
                e = a.n14,
                g = a.n21,
                h = a.n22,
                m = a.n23,
                l = a.n24,
                j = a.n31,
                i = a.n32,
                n = a.n33,
                o = a.n34,
                p = a.n41,
                k = a.n42,
                s = a.n43,
                K = a.n44,
                C = b.n11,
                Q = b.n12,
                O = b.n13,
                w = b.n14,
                F = b.n21,
                z = b.n22,
                D = b.n23,
                u = b.n24,
                r = b.n31,
                E = b.n32,
                N = b.n33,
                W = b.n34,
                da = b.n41,
                G = b.n42,
                H = b.n43,
                I = b.n44;
            this.n11 = c * C + d * F + f * r + e * da;
            this.n12 = c * Q + d * z + f * E + e * G;
            this.n13 = c * O + d * D + f * N + e * H;
            this.n14 = c * w + d * u + f * W + e * I;
            this.n21 = g * C + h * F + m * r + l * da;
            this.n22 = g * Q + h * z + m * E + l * G;
            this.n23 = g * O + h * D + m * N + l * H;
            this.n24 = g * w + h * u + m * W + l * I;
            this.n31 = j * C + i * F + n * r + o * da;
            this.n32 = j * Q + i * z + n * E + o * G;
            this.n33 = j * O + i * D + n * N + o * H;
            this.n34 = j * w + i * u + n * W + o * I;
            this.n41 = p * C + k * F + s * r + K * da;
            this.n42 = p * Q + k * z + s * E + K * G;
            this.n43 = p * O + k * D + s * N + K * H;
            this.n44 = p * w + k * u + s * W + K * I;
            return this
        },
        multiplySelf: function(a) {
            return this.multiply(this, a)
        },
        multiplyToArray: function(a, b, c) {
            this.multiply(a, b);
            c[0] = this.n11;
            c[1] = this.n21;
            c[2] = this.n31;
            c[3] = this.n41;
            c[4] = this.n12;
            c[5] = this.n22;
            c[6] = this.n32;
            c[7] = this.n42;
            c[8] = this.n13;
            c[9] = this.n23;
            c[10] = this.n33;
            c[11] = this.n43;
            c[12] = this.n14;
            c[13] = this.n24;
            c[14] = this.n34;
            c[15] = this.n44;
            return this
        },
        multiplyScalar: function(a) {
            this.n11 *= a;
            this.n12 *= a;
            this.n13 *= a;
            this.n14 *= a;
            this.n21 *= a;
            this.n22 *= a;
            this.n23 *= a;
            this.n24 *= a;
            this.n31 *= a;
            this.n32 *= a;
            this.n33 *= a;
            this.n34 *= a;
            this.n41 *= a;
            this.n42 *= a;
            this.n43 *= a;
            this.n44 *= a;
            return this
        },
        multiplyVector3: function(a) {
            var b = a.x,
                c = a.y,
                d = a.z,
                f = 1 / (this.n41 * b + this.n42 * c + this.n43 * d + this.n44);
            a.x = (this.n11 * b + this.n12 * c + this.n13 * d + this.n14) * f;
            a.y = (this.n21 * b + this.n22 * c + this.n23 * d + this.n24) * f;
            a.z = (this.n31 * b + this.n32 * c + this.n33 * d + this.n34) * f;
            return a
        },
        multiplyVector4: function(a) {
            var b = a.x,
                c = a.y,
                d = a.z,
                f = a.w;
            a.x = this.n11 * b + this.n12 * c + this.n13 * d + this.n14 * f;
            a.y = this.n21 * b + this.n22 * c + this.n23 * d + this.n24 * f;
            a.z = this.n31 * b + this.n32 * c + this.n33 * d + this.n34 * f;
            a.w = this.n41 * b + this.n42 * c + this.n43 * d + this.n44 * f;
            return a
        },
        rotateAxis: function(a) {
            var b = a.x,
                c = a.y,
                d = a.z;
            a.x = b * this.n11 + c * this.n12 + d * this.n13;
            a.y = b * this.n21 + c * this.n22 + d * this.n23;
            a.z = b * this.n31 + c * this.n32 + d * this.n33;
            a.normalize();
            return a
        },
        crossVector: function(a) {
            var b = new THREE.Vector4;
            b.x = this.n11 * a.x + this.n12 * a.y + this.n13 * a.z + this.n14 * a.w;
            b.y = this.n21 * a.x + this.n22 * a.y + this.n23 * a.z + this.n24 * a.w;
            b.z = this.n31 * a.x + this.n32 * a.y + this.n33 * a.z + this.n34 * a.w;
            b.w = a.w ? this.n41 * a.x + this.n42 * a.y + this.n43 * a.z + this.n44 * a.w : 1;
            return b
        },
        determinant: function() {
            var a = this.n11,
                b = this.n12,
                c = this.n13,
                d = this.n14,
                f = this.n21,
                e = this.n22,
                g = this.n23,
                h = this.n24,
                m = this.n31,
                l = this.n32,
                j = this.n33,
                i = this.n34,
                n = this.n41,
                o = this.n42,
                p = this.n43,
                k = this.n44;
            return d * g * l * n - c * h * l * n - d * e * j * n + b * h * j * n + c * e * i * n - b * g * i * n - d * g * m * o + c * h * m * o + d * f * j * o - a * h * j * o - c * f * i * o + a * g * i * o + d * e * m * p - b * h * m * p - d * f * l * p + a * h * l * p + b * f * i * p - a * e * i * p - c * e * m * k + b * g * m * k + c * f * l * k - a * g * l * k - b * f * j * k + a * e * j * k
        },
        transpose: function() {
            var a;
            a = this.n21;
            this.n21 = this.n12;
            this.n12 = a;
            a = this.n31;
            this.n31 = this.n13;
            this.n13 = a;
            a = this.n32;
            this.n32 = this.n23;
            this.n23 = a;
            a = this.n41;
            this.n41 = this.n14;
            this.n14 = a;
            a = this.n42;
            this.n42 = this.n24;
            this.n24 = a;
            a = this.n43;
            this.n43 = this.n34;
            this.n43 = a;
            return this
        },
        clone: function() {
            var a = new THREE.Matrix4;
            a.n11 = this.n11;
            a.n12 = this.n12;
            a.n13 = this.n13;
            a.n14 = this.n14;
            a.n21 = this.n21;
            a.n22 = this.n22;
            a.n23 = this.n23;
            a.n24 = this.n24;
            a.n31 = this.n31;
            a.n32 = this.n32;
            a.n33 = this.n33;
            a.n34 = this.n34;
            a.n41 = this.n41;
            a.n42 = this.n42;
            a.n43 = this.n43;
            a.n44 = this.n44;
            return a
        },
        flatten: function() {
            this.flat[0] = this.n11;
            this.flat[1] = this.n21;
            this.flat[2] = this.n31;
            this.flat[3] = this.n41;
            this.flat[4] = this.n12;
            this.flat[5] = this.n22;
            this.flat[6] = this.n32;
            this.flat[7] = this.n42;
            this.flat[8] = this.n13;
            this.flat[9] = this.n23;
            this.flat[10] = this.n33;
            this.flat[11] = this.n43;
            this.flat[12] = this.n14;
            this.flat[13] = this.n24;
            this.flat[14] = this.n34;
            this.flat[15] = this.n44;
            return this.flat
        },
        flattenToArray: function(a) {
            a[0] = this.n11;
            a[1] = this.n21;
            a[2] = this.n31;
            a[3] = this.n41;
            a[4] = this.n12;
            a[5] = this.n22;
            a[6] = this.n32;
            a[7] = this.n42;
            a[8] = this.n13;
            a[9] = this.n23;
            a[10] = this.n33;
            a[11] = this.n43;
            a[12] = this.n14;
            a[13] = this.n24;
            a[14] = this.n34;
            a[15] = this.n44;
            return a
        },
        flattenToArrayOffset: function(a, b) {
            a[b] = this.n11;
            a[b + 1] = this.n21;
            a[b + 2] = this.n31;
            a[b + 3] = this.n41;
            a[b + 4] = this.n12;
            a[b + 5] = this.n22;
            a[b + 6] = this.n32;
            a[b + 7] = this.n42;
            a[b + 8] = this.n13;
            a[b + 9] = this.n23;
            a[b + 10] = this.n33;
            a[b + 11] = this.n43;
            a[b + 12] = this.n14;
            a[b + 13] = this.n24;
            a[b + 14] = this.n34;
            a[b + 15] = this.n44;
            return a
        },
        setTranslation: function(a, b, c) {
            this.set(1, 0, 0, a, 0, 1, 0, b, 0, 0, 1, c, 0, 0, 0, 1);
            return this
        },
        setScale: function(a, b, c) {
            this.set(a, 0, 0, 0, 0, b, 0, 0, 0, 0, c, 0, 0, 0, 0, 1);
            return this
        },
        setRotationX: function(a) {
            var b = Math.cos(a),
                a = Math.sin(a);
            this.set(1, 0, 0, 0, 0, b, -a, 0, 0, a, b, 0, 0, 0, 0, 1);
            return this
        },
        setRotationY: function(a) {
            var b = Math.cos(a),
                a = Math.sin(a);
            this.set(b, 0, a, 0, 0, 1, 0, 0, -a, 0, b, 0, 0, 0, 0, 1);
            return this
        },
        setRotationZ: function(a) {
            var b = Math.cos(a),
                a = Math.sin(a);
            this.set(b, -a, 0, 0, a, b, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
            return this
        },
        setRotationAxis: function(a, b) {
            var c = Math.cos(b),
                d = Math.sin(b),
                f = 1 - c,
                e = a.x,
                g = a.y,
                h = a.z,
                m = f * e,
                l = f * g;
            this.set(m * e + c, m * g - d * h, m * h + d * g, 0, m * g + d * h, l * g + c, l * h - d * e, 0, m * h - d * g, l * h + d * e, f * h * h + c, 0, 0, 0, 0, 1);
            return this
        },
        setPosition: function(a) {
            this.n14 = a.x;
            this.n24 = a.y;
            this.n34 = a.z;
            return this
        },
        getPosition: function() {
            return THREE.Matrix4.__v1.set(this.n14, this.n24, this.n34)
        },
        getColumnX: function() {
            return THREE.Matrix4.__v1.set(this.n11, this.n21, this.n31)
        },
        getColumnY: function() {
            return THREE.Matrix4.__v1.set(this.n12, this.n22, this.n32)
        },
        getColumnZ: function() {
            return THREE.Matrix4.__v1.set(this.n13, this.n23, this.n33)
        },
        getInverse: function(a) {
            var b = a.n11,
                c = a.n12,
                d = a.n13,
                f = a.n14,
                e = a.n21,
                g = a.n22,
                h = a.n23,
                m = a.n24,
                l = a.n31,
                j = a.n32,
                i = a.n33,
                n = a.n34,
                o = a.n41,
                p = a.n42,
                k = a.n43,
                s = a.n44;
            this.n11 = h * n * p - m * i * p + m * j * k - g * n * k - h * j * s + g * i * s;
            this.n12 = f * i * p - d * n * p - f * j * k + c * n * k + d * j * s - c * i * s;
            this.n13 = d * m * p - f * h * p + f * g * k - c * m * k - d * g * s + c * h * s;
            this.n14 = f * h * j - d * m * j - f * g * i + c * m * i + d * g * n - c * h * n;
            this.n21 = m * i * o - h * n * o - m * l * k + e * n * k + h * l * s - e * i * s;
            this.n22 = d * n * o - f * i * o + f * l * k - b * n * k - d * l * s + b * i * s;
            this.n23 = f * h * o - d * m * o - f * e * k + b * m * k + d * e * s - b * h * s;
            this.n24 = d * m * l - f * h * l + f * e * i - b * m * i - d * e * n + b * h * n;
            this.n31 = g * n * o - m * j * o + m * l * p - e * n * p - g * l * s + e * j * s;
            this.n32 = f * j * o - c * n * o - f * l * p + b * n * p + c * l * s - b * j * s;
            this.n33 = d * m * o - f * g * o + f * e * p - b * m * p - c * e * s + b * g * s;
            this.n34 = f * g * l - c * m * l - f * e * j + b * m * j + c * e * n - b * g * n;
            this.n41 = h * j * o - g * i * o - h * l * p + e * i * p + g * l * k - e * j * k;
            this.n42 = c * i * o - d * j * o + d * l * p - b * i * p - c * l * k + b * j * k;
            this.n43 = d * g * o - c * h * o - d * e * p + b * h * p + c * e * k - b * g * k;
            this.n44 = c * h * l - d * g * l + d * e * j - b * h * j - c * e * i + b * g * i;
            this.multiplyScalar(1 / a.determinant());
            return this
        },
        setRotationFromEuler: function(a, b) {
            var c = a.x,
                d = a.y,
                f = a.z,
                e = Math.cos(c),
                c = Math.sin(c),
                g = Math.cos(d),
                d = Math.sin(d),
                h = Math.cos(f),
                f = Math.sin(f);
            switch (b) {
                case "YXZ":
                    var m = g * h,
                        l = g * f,
                        j = d * h,
                        i = d * f;
                    this.n11 = m + i * c;
                    this.n12 = j * c - l;
                    this.n13 = e * d;
                    this.n21 = e * f;
                    this.n22 = e * h;
                    this.n23 = -c;
                    this.n31 = l * c - j;
                    this.n32 = i + m * c;
                    this.n33 = e * g;
                    break;
                case "ZXY":
                    m = g * h;
                    l = g * f;
                    j = d * h;
                    i = d * f;
                    this.n11 = m - i * c;
                    this.n12 = -e * f;
                    this.n13 = j + l * c;
                    this.n21 = l + j * c;
                    this.n22 = e * h;
                    this.n23 = i - m * c;
                    this.n31 = -e * d;
                    this.n32 = c;
                    this.n33 = e * g;
                    break;
                case "ZYX":
                    m = e * h;
                    l = e * f;
                    j = c * h;
                    i = c * f;
                    this.n11 = g * h;
                    this.n12 = j * d - l;
                    this.n13 = m * d + i;
                    this.n21 = g * f;
                    this.n22 = i * d + m;
                    this.n23 = l * d - j;
                    this.n31 = -d;
                    this.n32 = c * g;
                    this.n33 = e * g;
                    break;
                case "YZX":
                    m = e * g;
                    l = e * d;
                    j = c * g;
                    i = c * d;
                    this.n11 = g * h;
                    this.n12 = i - m * f;
                    this.n13 = j * f + l;
                    this.n21 = f;
                    this.n22 = e * h;
                    this.n23 = -c * h;
                    this.n31 = -d * h;
                    this.n32 = l * f + j;
                    this.n33 = m - i * f;
                    break;
                case "XZY":
                    m = e * g;
                    l = e * d;
                    j = c * g;
                    i = c * d;
                    this.n11 = g * h;
                    this.n12 = -f;
                    this.n13 = d * h;
                    this.n21 = m * f + i;
                    this.n22 = e * h;
                    this.n23 = l * f - j;
                    this.n31 = j * f - l;
                    this.n32 = c * h;
                    this.n33 = i * f + m;
                    break;
                default:
                    m = e * h, l = e * f, j = c * h, i = c * f, this.n11 = g * h, this.n12 = -g * f, this.n13 = d, this.n21 = l + j * d, this.n22 = m - i * d, this.n23 = -c * g, this.n31 = i - m * d, this.n32 = j + l * d, this.n33 = e * g
            }
            return this
        },
        setRotationFromQuaternion: function(a) {
            var b = a.x,
                c = a.y,
                d = a.z,
                f = a.w,
                e = b + b,
                g = c + c,
                h = d + d,
                a = b * e,
                m = b * g;
            b *= h;
            var l = c * g;
            c *= h;
            d *= h;
            e *= f;
            g *= f;
            f *= h;
            this.n11 = 1 - (l + d);
            this.n12 = m - f;
            this.n13 = b + g;
            this.n21 = m + f;
            this.n22 = 1 - (a + d);
            this.n23 = c - e;
            this.n31 = b - g;
            this.n32 = c + e;
            this.n33 = 1 - (a + l);
            return this
        },
        scale: function(a) {
            var b = a.x,
                c = a.y,
                a = a.z;
            this.n11 *= b;
            this.n12 *= c;
            this.n13 *= a;
            this.n21 *= b;
            this.n22 *= c;
            this.n23 *= a;
            this.n31 *= b;
            this.n32 *= c;
            this.n33 *= a;
            this.n41 *= b;
            this.n42 *= c;
            this.n43 *= a;
            return this
        },
        compose: function(a, b, c) {
            var d = THREE.Matrix4.__m1,
                f = THREE.Matrix4.__m2;
            d.identity();
            d.setRotationFromQuaternion(b);
            f.setScale(c.x, c.y, c.z);
            this.multiply(d, f);
            this.n14 = a.x;
            this.n24 = a.y;
            this.n34 = a.z;
            return this
        },
        decompose: function(a, b, c) {
            var d = THREE.Matrix4.__v1,
                f = THREE.Matrix4.__v2,
                e = THREE.Matrix4.__v3;
            d.set(this.n11, this.n21, this.n31);
            f.set(this.n12, this.n22, this.n32);
            e.set(this.n13, this.n23, this.n33);
            a = a instanceof THREE.Vector3 ? a : new THREE.Vector3;
            b = b instanceof THREE.Quaternion ? b : new THREE.Quaternion;
            c = c instanceof THREE.Vector3 ? c : new THREE.Vector3;
            c.x = d.length();
            c.y = f.length();
            c.z = e.length();
            a.x = this.n14;
            a.y = this.n24;
            a.z = this.n34;
            d = THREE.Matrix4.__m1;
            d.copy(this);
            d.n11 /= c.x;
            d.n21 /= c.x;
            d.n31 /= c.x;
            d.n12 /= c.y;
            d.n22 /= c.y;
            d.n32 /= c.y;
            d.n13 /= c.z;
            d.n23 /= c.z;
            d.n33 /= c.z;
            b.setFromRotationMatrix(d);
            return [a, b, c]
        },
        extractPosition: function(a) {
            this.n14 = a.n14;
            this.n24 = a.n24;
            this.n34 = a.n34;
            return this
        },
        extractRotation: function(a) {
            var b = THREE.Matrix4.__v1,
                c = 1 / b.set(a.n11, a.n21, a.n31).length(),
                d = 1 / b.set(a.n12, a.n22, a.n32).length(),
                b = 1 / b.set(a.n13, a.n23, a.n33).length();
            this.n11 = a.n11 * c;
            this.n21 = a.n21 * c;
            this.n31 = a.n31 * c;
            this.n12 = a.n12 * d;
            this.n22 = a.n22 * d;
            this.n32 = a.n32 * d;
            this.n13 = a.n13 * b;
            this.n23 = a.n23 * b;
            this.n33 = a.n33 * b;
            return this
        }
    };
    THREE.Matrix4.makeInvert3x3 = function(a) {
        var b = a.m33,
            c = b.m,
            d = a.n33 * a.n22 - a.n32 * a.n23,
            f = -a.n33 * a.n21 + a.n31 * a.n23,
            e = a.n32 * a.n21 - a.n31 * a.n22,
            g = -a.n33 * a.n12 + a.n32 * a.n13,
            h = a.n33 * a.n11 - a.n31 * a.n13,
            m = -a.n32 * a.n11 + a.n31 * a.n12,
            l = a.n23 * a.n12 - a.n22 * a.n13,
            j = -a.n23 * a.n11 + a.n21 * a.n13,
            i = a.n22 * a.n11 - a.n21 * a.n12,
            a = a.n11 * d + a.n21 * g + a.n31 * l;
        a === 0 && console.error("THREE.Matrix4.makeInvert3x3: Matrix not invertible.");
        a = 1 / a;
        c[0] = a * d;
        c[1] = a * f;
        c[2] = a * e;
        c[3] = a * g;
        c[4] = a * h;
        c[5] = a * m;
        c[6] = a * l;
        c[7] = a * j;
        c[8] = a * i;
        return b
    };
    THREE.Matrix4.makeFrustum = function(a, b, c, d, f, e) {
        var g;
        g = new THREE.Matrix4;
        g.n11 = 2 * f / (b - a);
        g.n12 = 0;
        g.n13 = (b + a) / (b - a);
        g.n14 = 0;
        g.n21 = 0;
        g.n22 = 2 * f / (d - c);
        g.n23 = (d + c) / (d - c);
        g.n24 = 0;
        g.n31 = 0;
        g.n32 = 0;
        g.n33 = -(e + f) / (e - f);
        g.n34 = -2 * e * f / (e - f);
        g.n41 = 0;
        g.n42 = 0;
        g.n43 = -1;
        g.n44 = 0;
        return g
    };
    THREE.Matrix4.makePerspective = function(a, b, c, d) {
        var f, a = c * Math.tan(a * Math.PI / 360);
        f = -a;
        return THREE.Matrix4.makeFrustum(f * b, a * b, f, a, c, d)
    };
    THREE.Matrix4.makeOrtho = function(a, b, c, d, f, e) {
        var g, h, m, l;
        g = new THREE.Matrix4;
        h = b - a;
        m = c - d;
        l = e - f;
        g.n11 = 2 / h;
        g.n12 = 0;
        g.n13 = 0;
        g.n14 = -((b + a) / h);
        g.n21 = 0;
        g.n22 = 2 / m;
        g.n23 = 0;
        g.n24 = -((c + d) / m);
        g.n31 = 0;
        g.n32 = 0;
        g.n33 = -2 / l;
        g.n34 = -((e + f) / l);
        g.n41 = 0;
        g.n42 = 0;
        g.n43 = 0;
        g.n44 = 1;
        return g
    };
    THREE.Matrix4.__v1 = new THREE.Vector3;
    THREE.Matrix4.__v2 = new THREE.Vector3;
    THREE.Matrix4.__v3 = new THREE.Vector3;
    THREE.Matrix4.__m1 = new THREE.Matrix4;
    THREE.Matrix4.__m2 = new THREE.Matrix4;
    THREE.Object3D = function() {
        this.name = "";
        this.id = THREE.Object3DCount++;
        this.parent = void 0;
        this.children = [];
        this.up = new THREE.Vector3(0, 1, 0);
        this.position = new THREE.Vector3;
        this.rotation = new THREE.Vector3;
        this.eulerOrder = "XYZ";
        this.scale = new THREE.Vector3(1, 1, 1);
        this.flipSided = this.doubleSided = this.dynamic = !1;
        this.renderDepth = null;
        this.rotationAutoUpdate = !0;
        this.matrix = new THREE.Matrix4;
        this.matrixWorld = new THREE.Matrix4;
        this.matrixRotationWorld = new THREE.Matrix4;
        this.matrixWorldNeedsUpdate = this.matrixAutoUpdate = !0;
        this.quaternion = new THREE.Quaternion;
        this.useQuaternion = !1;
        this.boundRadius = 0;
        this.boundRadiusScale = 1;
        this.visible = !0;
        this.receiveShadow = this.castShadow = !1;
        this.frustumCulled = !0;
        this._vector = new THREE.Vector3
    };
    THREE.Object3D.prototype = {
        constructor: THREE.Object3D,
        translate: function(a, b) {
            this.matrix.rotateAxis(b);
            this.position.addSelf(b.multiplyScalar(a))
        },
        translateX: function(a) {
            this.translate(a, this._vector.set(1, 0, 0))
        },
        translateY: function(a) {
            this.translate(a, this._vector.set(0, 1, 0))
        },
        translateZ: function(a) {
            this.translate(a, this._vector.set(0, 0, 1))
        },
        lookAt: function(a) {
            this.matrix.lookAt(a, this.position, this.up);
            this.rotationAutoUpdate && this.rotation.setRotationFromMatrix(this.matrix)
        },
        add: function(a) {
            if (this.children.indexOf(a) === -1) {
                a.parent !== void 0 && a.parent.remove(a);
                a.parent = this;
                this.children.push(a);
                for (var b = this; b.parent !== void 0;) b = b.parent;
                b !== void 0 && b instanceof THREE.Scene && b.addObject(a)
            }
        },
        remove: function(a) {
            var b = this.children.indexOf(a);
            if (b !== -1) {
                a.parent = void 0;
                this.children.splice(b, 1);
                for (b = this; b.parent !== void 0;) b = b.parent;
                b !== void 0 && b instanceof THREE.Scene && b.removeObject(a)
            }
        },
        getChildByName: function(a, b) {
            var c, d, f;
            c = 0;
            for (d = this.children.length; c < d; c++) {
                f = this.children[c];
                if (f.name === a) return f;
                if (b && (f = f.getChildByName(a, b), f !== void 0)) return f
            }
        },
        updateMatrix: function() {
            this.matrix.setPosition(this.position);
            this.useQuaternion ? this.matrix.setRotationFromQuaternion(this.quaternion) : this.matrix.setRotationFromEuler(this.rotation, this.eulerOrder);
            if (this.scale.x !== 1 || this.scale.y !== 1 || this.scale.z !== 1) this.matrix.scale(this.scale), this.boundRadiusScale = Math.max(this.scale.x, Math.max(this.scale.y, this.scale.z));
            this.matrixWorldNeedsUpdate = !0
        },
        updateMatrixWorld: function(a) {
            this.matrixAutoUpdate && this.updateMatrix();
            if (this.matrixWorldNeedsUpdate || a) this.parent ? this.matrixWorld.multiply(this.parent.matrixWorld, this.matrix) : this.matrixWorld.copy(this.matrix), this.matrixWorldNeedsUpdate = !1, a = !0;
            for (var b = 0, c = this.children.length; b < c; b++) this.children[b].updateMatrixWorld(a)
        }
    };
    THREE.Object3DCount = 0;
    THREE.Projector = function() {
        function a() {
            var a = g[e] = g[e] || new THREE.RenderableObject;
            e++;
            return a
        }

        function b() {
            var a = l[m] = l[m] || new THREE.RenderableVertex;
            m++;
            return a
        }

        function c(a, b) {
            return b.z - a.z
        }

        function d(a, b) {
            var c = 0,
                d = 1,
                e = a.z + a.w,
                f = b.z + b.w,
                g = -a.z + a.w,
                h = -b.z + b.w;
            return e >= 0 && f >= 0 && g >= 0 && h >= 0 ? !0 : e < 0 && f < 0 || g < 0 && h < 0 ? !1 : (e < 0 ? c = Math.max(c, e / (e - f)) : f < 0 && (d = Math.min(d, e / (e - f))), g < 0 ? c = Math.max(c, g / (g - h)) : h < 0 && (d = Math.min(d, g / (g - h))), d < c ? !1 : (a.lerpSelf(b, c), b.lerpSelf(a, 1 - d), !0))
        }
        var f, e, g = [],
            h, m, l = [],
            j, i, n = [],
            o, p = [],
            k, s, K = [],
            C, Q, O = [],
            w = {
                objects: [],
                sprites: [],
                lights: [],
                elements: []
            },
            F = new THREE.Vector3,
            z = new THREE.Vector4,
            D = new THREE.Matrix4,
            u = new THREE.Matrix4,
            r = [new THREE.Vector4, new THREE.Vector4, new THREE.Vector4, new THREE.Vector4, new THREE.Vector4, new THREE.Vector4],
            E = new THREE.Vector4,
            N = new THREE.Vector4;
        this.computeFrustum = function(a) {
            r[0].set(a.n41 - a.n11, a.n42 - a.n12, a.n43 - a.n13, a.n44 - a.n14);
            r[1].set(a.n41 + a.n11, a.n42 + a.n12, a.n43 + a.n13, a.n44 + a.n14);
            r[2].set(a.n41 + a.n21, a.n42 + a.n22, a.n43 + a.n23, a.n44 + a.n24);
            r[3].set(a.n41 - a.n21, a.n42 - a.n22, a.n43 - a.n23, a.n44 - a.n24);
            r[4].set(a.n41 - a.n31, a.n42 - a.n32, a.n43 - a.n33, a.n44 - a.n34);
            r[5].set(a.n41 + a.n31, a.n42 + a.n32, a.n43 + a.n33, a.n44 + a.n34);
            for (a = 0; a < 6; a++) {
                var b = r[a];
                b.divideScalar(Math.sqrt(b.x * b.x + b.y * b.y + b.z * b.z))
            }
        };
        this.projectVector = function(a, b) {
            b.matrixWorldInverse.getInverse(b.matrixWorld);
            D.multiply(b.projectionMatrix, b.matrixWorldInverse);
            D.multiplyVector3(a);
            return a
        };
        this.unprojectVector = function(a, b) {
            b.projectionMatrixInverse.getInverse(b.projectionMatrix);
            D.multiply(b.matrixWorld, b.projectionMatrixInverse);
            D.multiplyVector3(a);
            return a
        };
        this.pickingRay = function(a, b) {
            var c;
            a.z = -1;
            c = new THREE.Vector3(a.x, a.y, 1);
            this.unprojectVector(a, b);
            this.unprojectVector(c, b);
            c.subSelf(a).normalize();
            return new THREE.Ray(a, c)
        };
        this.projectGraph = function(b, d) {
            e = 0;
            w.objects.length = 0;
            w.sprites.length = 0;
            w.lights.length = 0;
            var g = function(b) {
                if (b.visible !== !1) {
                    var c;
                    if (c = b instanceof THREE.Mesh || b instanceof THREE.Line)
                        if (!(c = b.frustumCulled === !1)) a: {
                            for (var d = b.matrixWorld, e = -b.geometry.boundingSphere.radius * Math.max(b.scale.x, Math.max(b.scale.y, b.scale.z)), h = 0; h < 6; h++)
                                if (c = r[h].x * d.n14 + r[h].y * d.n24 + r[h].z * d.n34 + r[h].w, c <= e) {
                                    c = !1;
                                    break a
                                }
                            c = !0
                        }
                    c ? (D.multiplyVector3(F.copy(b.position)), f = a(), f.object = b, f.z = F.z, w.objects.push(f)) : b instanceof THREE.Sprite || b instanceof THREE.Particle ? (D.multiplyVector3(F.copy(b.position)), f = a(), f.object = b, f.z = F.z, w.sprites.push(f)) : b instanceof THREE.Light && w.lights.push(b);
                    c = 0;
                    for (d = b.children.length; c < d; c++) g(b.children[c])
                }
            };
            g(b);
            d && w.objects.sort(c);
            return w
        };
        this.projectScene = function(a, e, f) {
            var g = e.near,
                r = e.far,
                F, L, B, S, v, R, P, V, J, t, A, x, y, M, la, fa;
            Q = s = o = i = 0;
            w.elements.length = 0;
            e.parent === void 0 && (console.warn("DEPRECATED: Camera hasn't been added to a Scene. Adding it..."), a.add(e));
            a.updateMatrixWorld();
            e.matrixWorldInverse.getInverse(e.matrixWorld);
            D.multiply(e.projectionMatrix, e.matrixWorldInverse);
            this.computeFrustum(D);
            w = this.projectGraph(a, !1);
            a = 0;
            for (F = w.objects.length; a < F; a++)
                if (J = w.objects[a].object, t = J.matrixWorld, x = J.material, m = 0, J instanceof THREE.Mesh) {
                    A = J.geometry;
                    y = J.geometry.materials;
                    S = A.vertices;
                    M = A.faces;
                    la = A.faceVertexUvs;
                    A = J.matrixRotationWorld.extractRotation(t);
                    L = 0;
                    for (B = S.length; L < B; L++) h = b(), h.positionWorld.copy(S[L].position), t.multiplyVector3(h.positionWorld), h.positionScreen.copy(h.positionWorld), D.multiplyVector4(h.positionScreen), h.positionScreen.x /= h.positionScreen.w, h.positionScreen.y /= h.positionScreen.w, h.visible = h.positionScreen.z > g && h.positionScreen.z < r;
                    S = 0;
                    for (L = M.length; S < L; S++) {
                        B = M[S];
                        if (B instanceof THREE.Face3)
                            if (v = l[B.a], R = l[B.b], P = l[B.c], v.visible && R.visible && P.visible && (J.doubleSided || J.flipSided != (P.positionScreen.x - v.positionScreen.x) * (R.positionScreen.y - v.positionScreen.y) - (P.positionScreen.y - v.positionScreen.y) * (R.positionScreen.x - v.positionScreen.x) < 0)) V = n[i] = n[i] || new THREE.RenderableFace3, i++, j = V, j.v1.copy(v), j.v2.copy(R), j.v3.copy(P);
                            else continue;
                        else if (B instanceof THREE.Face4)
                            if (v = l[B.a], R = l[B.b], P = l[B.c], V = l[B.d], v.visible && R.visible && P.visible && V.visible && (J.doubleSided || J.flipSided != ((V.positionScreen.x - v.positionScreen.x) * (R.positionScreen.y - v.positionScreen.y) - (V.positionScreen.y - v.positionScreen.y) * (R.positionScreen.x - v.positionScreen.x) < 0 || (R.positionScreen.x - P.positionScreen.x) * (V.positionScreen.y - P.positionScreen.y) - (R.positionScreen.y - P.positionScreen.y) * (V.positionScreen.x - P.positionScreen.x) < 0))) fa = p[o] = p[o] || new THREE.RenderableFace4, o++, j = fa, j.v1.copy(v), j.v2.copy(R), j.v3.copy(P), j.v4.copy(V);
                            else continue;
                        j.normalWorld.copy(B.normal);
                        A.multiplyVector3(j.normalWorld);
                        j.centroidWorld.copy(B.centroid);
                        t.multiplyVector3(j.centroidWorld);
                        j.centroidScreen.copy(j.centroidWorld);
                        D.multiplyVector3(j.centroidScreen);
                        P = B.vertexNormals;
                        v = 0;
                        for (R = P.length; v < R; v++) V = j.vertexNormalsWorld[v], V.copy(P[v]), A.multiplyVector3(V);
                        v = 0;
                        for (R = la.length; v < R; v++)
                            if (fa = la[v][S]) {
                                P = 0;
                                for (V = fa.length; P < V; P++) j.uvs[v][P] = fa[P]
                            }
                        j.material = x;
                        j.faceMaterial = B.materialIndex !== null ? y[B.materialIndex] : null;
                        j.z = j.centroidScreen.z;
                        w.elements.push(j)
                    }
                } else if (J instanceof THREE.Line) {
                u.multiply(D, t);
                S = J.geometry.vertices;
                v = b();
                v.positionScreen.copy(S[0].position);
                u.multiplyVector4(v.positionScreen);
                L = 1;
                for (B = S.length; L < B; L++)
                    if (v = b(), v.positionScreen.copy(S[L].position), u.multiplyVector4(v.positionScreen), R = l[m - 2], E.copy(v.positionScreen), N.copy(R.positionScreen), d(E, N)) E.multiplyScalar(1 / E.w), N.multiplyScalar(1 / N.w), J = K[s] = K[s] || new THREE.RenderableLine, s++, k = J, k.v1.positionScreen.copy(E), k.v2.positionScreen.copy(N), k.z = Math.max(E.z, N.z), k.material = x, w.elements.push(k)
            }
            a = 0;
            for (F = w.sprites.length; a < F; a++)
                if (J = w.sprites[a].object, t = J.matrixWorld, J instanceof THREE.Particle && (z.set(t.n14, t.n24, t.n34, 1), D.multiplyVector4(z), z.z /= z.w, z.z > 0 && z.z < 1)) g = O[Q] = O[Q] || new THREE.RenderableParticle, Q++, C = g, C.x = z.x / z.w, C.y = z.y / z.w, C.z = z.z, C.rotation = J.rotation.z, C.scale.x = J.scale.x * Math.abs(C.x - (z.x + e.projectionMatrix.n11) / (z.w + e.projectionMatrix.n14)), C.scale.y = J.scale.y * Math.abs(C.y - (z.y + e.projectionMatrix.n22) / (z.w + e.projectionMatrix.n24)), C.material = J.material, w.elements.push(C);
            f && w.elements.sort(c);
            return w
        }
    };
    THREE.Quaternion = function(a, b, c, d) {
        this.set(a || 0, b || 0, c || 0, d !== void 0 ? d : 1)
    };
    THREE.Quaternion.prototype = {
        constructor: THREE.Quaternion,
        set: function(a, b, c, d) {
            this.x = a;
            this.y = b;
            this.z = c;
            this.w = d;
            return this
        },
        copy: function(a) {
            this.x = a.x;
            this.y = a.y;
            this.z = a.z;
            this.w = a.w;
            return this
        },
        setFromEuler: function(a) {
            var b = Math.PI / 360,
                c = a.x * b,
                d = a.y * b,
                f = a.z * b,
                a = Math.cos(d),
                d = Math.sin(d),
                b = Math.cos(-f),
                f = Math.sin(-f),
                e = Math.cos(c),
                c = Math.sin(c),
                g = a * b,
                h = d * f;
            this.w = g * e - h * c;
            this.x = g * c + h * e;
            this.y = d * b * e + a * f * c;
            this.z = a * f * e - d * b * c;
            return this
        },
        setFromAxisAngle: function(a, b) {
            var c = b / 2,
                d = Math.sin(c);
            this.x = a.x * d;
            this.y = a.y * d;
            this.z = a.z * d;
            this.w = Math.cos(c);
            return this
        },
        setFromRotationMatrix: function(a) {
            var b = Math.pow(a.determinant(), 1 / 3);
            this.w = Math.sqrt(Math.max(0, b + a.n11 + a.n22 + a.n33)) / 2;
            this.x = Math.sqrt(Math.max(0, b + a.n11 - a.n22 - a.n33)) / 2;
            this.y = Math.sqrt(Math.max(0, b - a.n11 + a.n22 - a.n33)) / 2;
            this.z = Math.sqrt(Math.max(0, b - a.n11 - a.n22 + a.n33)) / 2;
            this.x = a.n32 - a.n23 < 0 ? -Math.abs(this.x) : Math.abs(this.x);
            this.y = a.n13 - a.n31 < 0 ? -Math.abs(this.y) : Math.abs(this.y);
            this.z = a.n21 - a.n12 < 0 ? -Math.abs(this.z) : Math.abs(this.z);
            this.normalize();
            return this
        },
        calculateW: function() {
            this.w = -Math.sqrt(Math.abs(1 - this.x * this.x - this.y * this.y - this.z * this.z));
            return this
        },
        inverse: function() {
            this.x *= -1;
            this.y *= -1;
            this.z *= -1;
            return this
        },
        length: function() {
            return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w)
        },
        normalize: function() {
            var a = Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w);
            a === 0 ? this.w = this.z = this.y = this.x = 0 : (a = 1 / a, this.x *= a, this.y *= a, this.z *= a, this.w *= a);
            return this
        },
        multiplySelf: function(a) {
            var b = this.x,
                c = this.y,
                d = this.z,
                f = this.w,
                e = a.x,
                g = a.y,
                h = a.z,
                a = a.w;
            this.x = b * a + f * e + c * h - d * g;
            this.y = c * a + f * g + d * e - b * h;
            this.z = d * a + f * h + b * g - c * e;
            this.w = f * a - b * e - c * g - d * h;
            return this
        },
        multiply: function(a, b) {
            this.x = a.x * b.w + a.y * b.z - a.z * b.y + a.w * b.x;
            this.y = -a.x * b.z + a.y * b.w + a.z * b.x + a.w * b.y;
            this.z = a.x * b.y - a.y * b.x + a.z * b.w + a.w * b.z;
            this.w = -a.x * b.x - a.y * b.y - a.z * b.z + a.w * b.w;
            return this
        },
        multiply.........完整代码请登录后点击上方下载按钮下载查看

网友评论0