Cubes move in formaiton,Mix,Line,Circle,Cube and Spiral.
using by Three.js and Tween.js.
A Pen by naoyashiga on CodePen.
<script type="text/javascript" src="http://jsdo.it/lib/three.js-r60/js"></script> | |
<script type="text/javascript" src="http://jsdo.it/naoyashiga/wuRc/js"></script> | |
<script type="text/javascript" src="http://jsdo.it/naoyashiga/vyn5/js"></script> |
var container; | |
var camera,scene,renderer; | |
var checker = 1; | |
init(); | |
animate(); | |
function init(){ | |
container = document.createElement("div"); | |
document.body.appendChild(container); | |
Perspective_Camera(); | |
scene = new THREE.Scene(); | |
var geometry = new THREE.CubeGeometry(10,10,10); | |
for(var i = 0;i < 125;i++){ | |
var material = new THREE.MeshBasicMaterial({ | |
color : Math.random() * 0xffffff, | |
opacity : 0.5 | |
}); | |
var object = new THREE.Mesh(geometry,material); | |
object.position.x = Math.random() * 800 - 400; | |
object.position.y = Math.random() * 800 - 400; | |
object.position.z = Math.random() * 800 - 400; | |
object.scale.x = Math.random() * 2 + 1; | |
object.scale.y = Math.random() * 2 + 1; | |
object.scale.z = Math.random() * 2 + 1; | |
object.rotation.x = Math.random() * 2 * Math.PI; | |
object.rotation.y = Math.random() * 2 * Math.PI; | |
object.rotation.z = Math.random() * 2 * Math.PI; | |
scene.add(object); | |
} | |
renderer = new THREE.CanvasRenderer(); | |
renderer.setSize(window.innerWidth,window.innerHeight); | |
container.appendChild(renderer.domElement); | |
/*GUI START | |
****************************************/ | |
var CubeControls = { | |
"formation" : "mix", | |
"cube colors" : "manyColors", | |
"background" : "#efefef" | |
}; | |
var gui = new dat.GUI(); | |
var cubeFormation = gui.add(CubeControls,"formation",["mix","line","circle","cube","spiral"]).listen(); | |
var cubeColor = gui.add(CubeControls,"cube colors",["manyColors","fourColors"]).listen(); | |
var backgroundColor = gui.addColor(CubeControls,"background"); | |
cubeFormation.onChange(function(value){ | |
chaos(750,value); | |
}); | |
cubeColor.onChange(function(value){ | |
if(value == "manyColors"){ | |
changeManyColors(); | |
}else if(value == "fourColors"){ | |
changeFourColors(); | |
} | |
}); | |
backgroundColor.onChange(function(value){ | |
$("body").css("background",value); | |
}); | |
gui.open(); | |
/*GUI END | |
****************************************/ | |
window.addEventListener("resize",onWindowResize,false); | |
} | |
function onWindowResize(){ | |
camera.aspect = window.innerWidth / window.innerHeight; | |
camera.updateProjectionMatrix(); | |
renderer.setSize(window.innerWidth,window.innerHeight); | |
} | |
/*----------------------------------- | |
SHUFFLE CUBES | |
-----------------------------------*/ | |
function chaos(animationTime,animationName){ | |
var delayTime = animationTime / 4; | |
var waitTime = animationTime * 3 + delayTime; | |
if(checker == 1 && animationName != "mix"){ | |
waitTime = 0; | |
checker = 0; | |
} | |
switch(animationName){ | |
case "line": | |
setTimeout(playLine,waitTime); | |
break; | |
case "circle": | |
setTimeout(playCircle,waitTime); | |
break; | |
case "cube": | |
setTimeout(playCube,waitTime); | |
break; | |
case "spiral": | |
setTimeout(playSpiral,waitTime); | |
break; | |
case "mix": | |
checker = 1; | |
break; | |
default: | |
break; | |
} | |
if(waitTime != 0){ | |
for(var i = 0;i < scene.children.length;i++){ | |
new TWEEN.Tween(scene.children[i].position).to({ | |
x : Math.random() * 800 - 400, | |
y : Math.random() * 800 - 400, | |
z : Math.random() * 800 - 400},animationTime ) | |
.easing( TWEEN.Easing.Elastic.Out).start(); | |
new TWEEN.Tween(scene.children[i].rotation).to({ | |
x : Math.random() * 2 * Math.PI, | |
y : Math.random() * 2 * Math.PI, | |
z : Math.random() * 2 * Math.PI},animationTime) | |
.delay(animationTime) | |
.easing( TWEEN.Easing.Elastic.Out).start(); | |
new TWEEN.Tween(scene.children[i].scale).to({ | |
x : Math.random() * 5 + 1, | |
y : Math.random() * 5 + 1, | |
z : Math.random() * 5 + 1,},animationTime) | |
.delay(animationTime * 2 + delayTime) | |
.easing( TWEEN.Easing.Elastic.Out).start(); | |
} | |
} | |
} | |
/*----------------------------------- | |
SET COLORFUL | |
-----------------------------------*/ | |
function changeManyColors(){ | |
var len = scene.children.length; | |
for(var i = 0;i < len;i++){ | |
new TWEEN.Tween(scene.children[i].material.color).to({ | |
b: Math.random(), | |
g : Math.random(), | |
r : Math.random()},1000) | |
.easing( TWEEN.Easing.Elastic.Out).start(); | |
} | |
} | |
/*----------------------------------- | |
SET GREEN,YELLOW,BULE and RED | |
-----------------------------------*/ | |
function changeFourColors(){ | |
var len = scene.children.length; | |
for(var i = 0;i < len;i++){ | |
switch(i%4){ | |
case 0://green | |
new TWEEN.Tween(scene.children[i].material.color).to({ | |
b: 0, | |
g : 0.84, | |
r : 0.18},1000) | |
.easing( TWEEN.Easing.Elastic.Out).start(); | |
break; | |
case 1://yellow | |
new TWEEN.Tween(scene.children[i].material.color).to({ | |
b: 0, | |
g : 1.0, | |
r : 1.0},1000) | |
.easing( TWEEN.Easing.Elastic.Out).start(); | |
break; | |
case 2://blue | |
new TWEEN.Tween(scene.children[i].material.color).to({ | |
b: 1.0, | |
g : 0, | |
r : 0},1000) | |
.easing( TWEEN.Easing.Elastic.Out).start(); | |
break; | |
case 3://red | |
new TWEEN.Tween(scene.children[i].material.color).to({ | |
b: 0, | |
g : 0, | |
r : 1.0},1000) | |
.easing( TWEEN.Easing.Elastic.Out).start(); | |
break; | |
default: | |
break; | |
} | |
} | |
} | |
/*----------------------------------- | |
CREATE LINE | |
-----------------------------------*/ | |
function playLine(){ | |
for(var i = 0;i < scene.children.length;i++){ | |
new TWEEN.Tween(scene.children[i].position).to({ | |
x : -500 + i * 30, | |
y : 0, | |
z : 0},1000) | |
.easing( TWEEN.Easing.Elastic.Out).start(); | |
new TWEEN.Tween(scene.children[i].rotation).to({ | |
x : 0, | |
y : 0, | |
z : 0},1000) | |
.delay(1000) | |
.easing( TWEEN.Easing.Elastic.Out).start(); | |
new TWEEN.Tween(scene.children[i].scale).to({ | |
x : 1, | |
y : 1, | |
z : 1},1000) | |
.delay(2250) | |
.easing( TWEEN.Easing.Elastic.Out).start(); | |
} | |
} | |
/*----------------------------------- | |
CREATE CIRCLE | |
-----------------------------------*/ | |
function playCircle(){ | |
var r = 300; | |
var len = scene.children.length; | |
var theta = 2 * Math.PI / len; | |
for(var i = 0;i < len;i++){ | |
new TWEEN.Tween(scene.children[i].position).to({ | |
x : r * Math.cos(theta * i), | |
y : r * Math.sin(theta * i), | |
z : 0},1000) | |
.easing( TWEEN.Easing.Elastic.Out).start(); | |
new TWEEN.Tween(scene.children[i].rotation).to({ | |
x : 0, | |
y : 0, | |
z : 0},1000) | |
.delay(1000) | |
.easing( TWEEN.Easing.Elastic.Out).start(); | |
new TWEEN.Tween(scene.children[i].scale).to({ | |
x : 0.8, | |
y : 0.8, | |
z : 0.8},1000) | |
.delay(2250) | |
.easing( TWEEN.Easing.Elastic.Out).start(); | |
} | |
} | |
/*----------------------------------- | |
CREATE CUBE | |
-----------------------------------*/ | |
function playCube(){ | |
//var len = Math.pow(scene.children.length,1.0/3.0); | |
var len = 5; | |
console.log(len); | |
for(var i = 0;i < len;i++){ | |
for(var j = 0;j < len;j++){ | |
for(var k = 0;k < len;k++){ | |
new TWEEN.Tween(scene.children[i * len * len + j * len + k].position).to({ | |
x : -100 + i * 60, | |
y : -100 + j * 60, | |
z : -100 + k * 60},1000) | |
.easing( TWEEN.Easing.Elastic.Out).start(); | |
new TWEEN.Tween(scene.children[i * len * len + j * len + k].rotation).to({ | |
x : 0, | |
y : 0, | |
z : 0},1000) | |
.delay(1000) | |
.easing( TWEEN.Easing.Elastic.Out).start(); | |
new TWEEN.Tween(scene.children[i * len * len + j * len + k].scale).to({ | |
x : 1, | |
y : 1, | |
z : 1},1000) | |
.delay(2250) | |
.easing( TWEEN.Easing.Elastic.Out).start(); | |
} | |
} | |
} | |
} | |
/*----------------------------------- | |
CREATE SPIRAL | |
-----------------------------------*/ | |
function playSpiral(){ | |
var r = 30; | |
var len = scene.children.length; | |
var theta = 2 * Math.PI / len; | |
theta *= 30; | |
for(var i = 0;i < len;i++){ | |
new TWEEN.Tween(scene.children[i].position).to({ | |
x : r * Math.cos(theta * i), | |
y : r * Math.sin(theta * i), | |
z : 10 * i},1000) | |
.easing( TWEEN.Easing.Elastic.Out).start(); | |
new TWEEN.Tween(scene.children[i].rotation).to({ | |
x : 0, | |
y : 0, | |
z : 0},1000) | |
.delay(1000) | |
.easing( TWEEN.Easing.Elastic.Out).start(); | |
new TWEEN.Tween(scene.children[i].scale).to({ | |
x : 0.8, | |
y : 0.8, | |
z : 0.8},1000) | |
.delay(2250) | |
.easing( TWEEN.Easing.Elastic.Out).start(); | |
} | |
} | |
/*----------------------------------- | |
CAMERA | |
-----------------------------------*/ | |
function Perspective_Camera(){ | |
var fov = 40; | |
var aspect = window.innerWidth / window.innerHeight; | |
var near = 1; | |
var far = 10000; | |
camera = new THREE.PerspectiveCamera(fov,aspect,near,far); | |
camera.position.set(0,300,500); | |
} | |
function animate(){ | |
requestAnimationFrame(animate); | |
render(); | |
} | |
var radius = 600; | |
var theta = 0; | |
function render(){ | |
TWEEN.update(); | |
theta += 0.1; | |
camera.position.x = radius * Math.sin(THREE.Math.degToRad(theta)); | |
camera.position.y = radius * Math.sin(THREE.Math.degToRad(theta)); | |
camera.position.z = radius * Math.cos(THREE.Math.degToRad(theta)); | |
camera.lookAt(scene.position); | |
renderer.render(scene,camera); | |
} | |
*{ | |
margin: 0; | |
padding: 0; | |
border: 0; | |
} | |
body { | |
background: #efefef; | |
font: 30px sans-serif; | |
} |
Cubes move in formaiton,Mix,Line,Circle,Cube and Spiral.
using by Three.js and Tween.js.
A Pen by naoyashiga on CodePen.