Cubes in space

In this example below you will see how to do a Cubes in space with some HTML / CSS and Javascript

A bunch of cubes in space. Configure to create the cube field of your dreams!

Thumbnail
This awesome code was written by johnblazek, you can see more from this user in the personal repository.
You can find the original code on Codepen.io
Copyright johnblazek ©

Technologies

  • HTML
  • CSS
  • JavaScript
<!DOCTYPE html>
<html lang="en" >

<head>
  <meta charset="UTF-8">
  <title>Cubes in space</title>
  
  
  
      <link rel="stylesheet" href="css/style.css">

  
</head>

<body>

  <canvas id="scene"></canvas>
  <script src='https://cdnjs.cloudflare.com/ajax/libs/three.js/r71/three.min.js'></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/gsap/1.16.1/TweenMax.min.js'></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/dat-gui/0.5/dat.gui.min.js'></script>

  

    <script  src="js/index.js"></script>




</body>

</html>

/*Downloaded from https://www.codeseek.co/johnblazek/cubes-in-space-gbVppE */
body,html{width:100%;height:100%;padding:0;margin:0;overflow:hidden; background-color:#000;} 

/*Downloaded from https://www.codeseek.co/johnblazek/cubes-in-space-gbVppE */
var gui = new dat.GUI();
        var space = new Space();
       
        
        function Space()
        {
            this.ww = window.innerWidth;
            this.wh = window.innerHeight;
            this.numBoxes = 10;
            this.boxDistance = 250;
            this.numContainers = 8;
            this.cx = 30;
            this.cy = 30;
            this.cz = 60;
            this.cameraX = .25;
            this.cameraY = .25;
            this.lightX = .25;
            this.lightY = .25;
            this.lag = 2;
            this.tunnelSpeed = 30;
            this.cameraZ = 0;
            this.lightZ = 0;
            this.boxWidth = 50;
            
            this.colorScheme = 'random';
            
            this.colors = 
            [
		      new THREE.Color( 'rgb(1,35,69)' ),
		      new THREE.Color( 'rgb(18,52,86)' ),
		      new THREE.Color( 'rgb(35,69,103)'),
		      new THREE.Color( 'rgb(52,86,120)' ),
              new THREE.Color( 'rgb(69,103,137)' ),
              new THREE.Color( 'rgb(86,120,144)' ),
               
                
	        ];
            
            this.renderer;
            this.scene;
            this.camera;
            this.light;
            this.elements;
            this.r = getRandomInt(255);
            this.g = getRandomInt(255);
            this.b = getRandomInt(255);
            
            var _self = this;
            
            this.init = function()
            {
                /* WEBGL RENDERER */
                this.renderer = new THREE.WebGLRenderer({canvas : document.getElementById('scene')});
                this.renderer.setSize( this.ww, this.wh );

                this.scene = new THREE.Scene();

                this.camera = new THREE.PerspectiveCamera(50, this.ww/this.wh, 1, 10000 );
                this.scene.add( this.camera );

                this.light = new THREE.PointLight(0xffffff, 1, 1300);
            
                this.light.position.set( 0, 0, this.lightZ );
                this.scene.add(this.light);

                document.addEventListener( 'mousemove', _getPageValues );
                //console.log(this)
               
                _self.elements = new THREE.Object3D();
                for( var i = 0; i <= _self.numContainers; i++ ) _createBox(i, null);
                
                _self.farest = -_self.numBoxes * _self.boxDistance;
                _self.scene.add(_self.elements);
                
                _animate();
                
            };
            
            _getPageValues = function(e)
            {
                _self.cx = (_self.ww * .5) - e.pageX;
                _self.cy =  (_self.wh * .5) - e.pageY;
            }
            
            _createBox = function(i, $containerReference, $z)
            {              
	           
                var $boxSize = getRandomInt(_self.boxWidth) + 1;     
               var $geometry = new THREE.BoxGeometry($boxSize,$boxSize,$boxSize);
	           var $translate = new THREE.Matrix4().makeTranslation(0,0,0);

               var $container;
               if ( $containerReference == null )$container = new THREE.Object3D();
               else $container = $containerReference; 
                
                var $color = _returnColor(i);

                for(var j = 0; j < _self.numBoxes; j++ )
                {
                    var $material = new THREE.MeshLambertMaterial({color: $color });
                    var $cube = new THREE.Mesh($geometry, $material);
                    var $rotation =  new THREE.Matrix4().makeRotationZ(getRandomInt(360) );
                    $cube.applyMatrix( new THREE.Matrix4().multiplyMatrices( $rotation, $translate ) );
                    $cube.position.x = getRandomInt(_self.ww) - (_self.ww * .5);   
                    $cube.position.y = getRandomInt(_self.wh) - (_self.wh * .5);   
                    $container.add( $cube );

                }

                if ( $containerReference == null )
                {
                $container.position.z = -i * _self.boxDistance;
                _self.elements.add($container);
                }
                else $container.position.z = $z;
               
                
                   
               
            };
            
            _returnColor = function(i)
            {
                var $color;
                if ( _self.colorScheme == 'random' )
                {
                   _self.r = getRandomInt(255);
                   _self.g = getRandomInt(255);
                   _self.b = getRandomInt(255);
                    
                    $color = "rgb("+_self.r+","+_self.g+","+_self.b+")";
                }
                else if (_self.colorScheme == 'blue')
                {
                    $color = _self.colors[i%_self.colors.length]   
                }
                else
                {
                    _self.r+=3;
                    _self.g+=5;
                    _self.b++;                

                    if ( _self.r >= 256 ) _self.r = getRandomInt(255);
                    if ( _self.g >= 256 ) _self.g = getRandomInt(255);
                    if ( _self.b >= 256 ) _self.b = getRandomInt(255);
                    
                    $color = "rgb("+_self.r+","+_self.g+","+_self.b+")";
                }
                
                console.log( _self.r+","+_self.g+","+_self.b )
                
                return $color;
            }
            
            _animate = function()
            {
                requestAnimationFrame( _animate );

                for( var i = 0; i <= _self.numContainers; i++ )
                {
                    var $container = _self.elements.children[i];
                    if( _self.camera.position.z <= $container.position.z )
                    {                    
                        for(var j = 0; j < $container.children.length; j++ )$container.remove($container.children[j]);
                        
                        _self.farest -= _self.boxDistance;
                        _createBox(i, $container, _self.farest);
                    };
                };
                
                _self.cz -= _self.tunnelSpeed - Math.abs( _self.cy * .05);
                
               
                TweenMax.to( _self.light.rotation, _self.lag, {x:_self.cy * -.5, y:_self.cx * -.5, z:_self.cy * .1, ease:Quint.easeOut } )
                
                TweenMax.to( _self.light.position, _self.lag, {z:_self.cz-_self.lightZ, x:_self.cx * _self.lightX, y:_self.cy * -_self.lightY,  ease:Quint.easeOut } )
                TweenMax.to( _self.camera.position, _self.lag, {z:_self.cz - _self.cameraZ, x:_self.cx * _self.cameraX, y:_self.cy * -_self.cameraY, ease:Quint.easeOut } )
                
                
                _self.renderer.render( _self.scene, _self.camera );
            }
        };
        
        function getRandomInt( $n )
		{
			return Math.floor((Math.random()*$n)+1);	
		}
        
        
        space.init();
        
        
        gui.add( space, 'tunnelSpeed', 10, 100 );
        gui.add( space, 'lag', 0, 5 );
        
        gui.add( space, 'lightX', 0, 1 );
        gui.add( space, 'lightY', 0, 1 );
        gui.add( space, 'lightZ', -2000, 2000 );
        gui.add( space, 'cameraX', 0, 1 );
        gui.add( space, 'cameraY', 0, 1 );
        
        gui.add( space, 'cameraZ', -2000, 2000 );
        
        gui.add( space, 'numBoxes', 3, 50 ).step(1);
        gui.add(space, 'boxWidth', 1, 100);
        
        gui.add( space, 'boxDistance', 10, 500 );
        gui.add( space, 'colorScheme', [ 'random', 'sequenced', 'blue' ] );

Comments