jquery实现canvas粒子流变换形状流动动画效果代码

代码语言:html

所属分类:粒子

代码描述:jquery实现canvas粒子流变换形状流动动画效果代码

代码标签: jquery canvas 粒子 变换 形状 流动 动画

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

<!doctype html>
<html>

<head>
    <meta charset="utf-8">
    <script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/jquery-3.2.1.min.js"></script>
    <style>
        html,body{
            width:100%;height:100%;margin:0;padding:0;background-color:#000000;
            
        }
        .container{
            width:100%;height:100%;margin:0;padding:0;background-color:#000000;
            
        }
    </style>
</head>

<body>
    <div id="jsi-particle-container" class="container"></div>
    <script>
        var RENDERER = {
         PARTICLE_COUNT: 1000,
         PARTICLE_RADIUS: 1,
         MAX_ROTATION_ANGLE: Math.PI / 60,
         TRANSLATION_COUNT: 500,
         init: function(strategy) {
             this.setParameters(strategy);
             this.createParticles();
             this.setupFigure();
             this.reconstructMethod();
             this.bindEvent();
             this.drawFigure();
         },
         setParameters: function(strategy) {
             this.$window = $(window);
             this.$container = $('#jsi-particle-container');
             this.width = this.$container.width();
             this.height = this.$container.height();
             this.$canvas = $('<canvas />').attr({
                 width: this.width,
                 height: this.height
             }).appendTo(this.$container);
             this.context = this.$canvas.get(0).getContext('2d');
             this.center = {
                 x: this.width / 2,
                 y: this.height / 2
             };
             this.rotationX = this.MAX_ROTATION_ANGLE;
             this.rotationY = this.MAX_ROTATION_ANGLE;
             this.strategyIndex = 0;
             this.translationCount = 0;
             this.theta = 0;
             this.strategies = strategy.getStrategies();
             this.particles = [];
         },
         createParticles: function() {
             for (var i = 0; i < this.PARTICLE_COUNT; i++) {
                 this.particles.push(new PARTICLE(this.center));
             }
         },
         reconstructMethod: function() {
             this.setupFigure = this.setupFigure.bind(this);
             this.drawFigure = this.drawFigure.bind(this);
             this.changeAngle = this.changeAngle.bind(this);
         },
         bindEvent: function() {
             this.$container.on('click', this.setupFigure);
             this.$container.on('mousemove', this.changeAngle);
         },
         changeAngle: function(event) {
             var offset = this.$container.offset(),
                 x = event.clientX - offset.left + this.$window.scrollLeft(),
                 y = event.clientY - offset.top + this.$window.scrollTop();
             this.rotationX = (this.center.y - y) / this.center.y * this.MAX_ROTATION_ANGLE;
             this.rotationY = (this.center.x - x) / this.center.x * this.MAX_ROTATION_ANGLE;
         },
         setupFigure: function() {
             for (var i = 0, length = this.particles.length; i < length; i++) {
                 this.particles[i].setAxis(this.strategies[this.strategyIndex]());
             }
             if (++this.strategyIndex == this.strategies.length) {
                 this.strategyIndex = 0;
             }
             this.translationCount = 0;
         },
         drawFigure: function() {
             requestAnimationFrame(this.drawFigure);
             this.context.fillStyle = 'rgba(0, 0, 0, 0.2)';
             this.context.fillRect(0, 0, this.width, this.height);
             for (var i = 0, length = this.particles.length; i < length; i++) {
                 var axis = this.particles[i].getAxis2D(this.theta);
                 this.context.beginPath();
                 this.context.fillStyle = axis.color;
                 this.context.arc(axis.x, axis.y, this.PARTICLE_RADIUS, 0, Math.PI * 2, false);
                 this.context.fill();
             }
             this.theta++;
             this.theta %= 360;
             for (var i = 0, length = this.particles.length; i < length; i++) {
                 this.particles[i].rotateX(this.rotationX);
                 this.particles[i].rotateY(this.rotationY);
             }
             this.translationCount++;
             this.translationCount %= this.TRANSLATION_COUNT;
             if (this.translationCount == 0) {
                 this.setupFigure();
             }
         }
     };
     var STRATEGY = {
         SCATTER_RADIUS: 150,
         CONE_ASPECT_RATIO: 1.5,
         RING_COUNT: 5,
         getStrategies: function() {
             var strategies = [];
             for (var i in this) {
                 if (this[i] == arguments.callee || typeof this[i] != 'function') {
                     continue;
                 }
                 strategies.push(this[i].bind(this));
             }
             return strategies;
         },
         createSphere: function() {
             var cosTheta = Math.random() * 2 - 1,
                 sinTheta = Math.sqrt(1 - cosTheta * cosTheta),
                .........完整代码请登录后点击上方下载按钮下载查看

网友评论0