Testing out aframe.io with d3.js.
Although a-frame has its animation method based on tween.js, we can use d3's transition method to animate the DOM.
Built with blockbuilder.org
forked from enjalot's block: aframe + d3 test
Testing out aframe.io with d3.js.
Although a-frame has its animation method based on tween.js, we can use d3's transition method to animate the DOM.
Built with blockbuilder.org
forked from enjalot's block: aframe + d3 test
| <!DOCTYPE html> | |
| <head> | |
| <meta charset="utf-8"> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js"></script> | |
| <script src="https://aframe.io/releases/latest/aframe.min.js"></script> | |
| <style> | |
| body { margin:0;position:fixed;top:0;right:0;bottom:0;left:0; } | |
| </style> | |
| </head> | |
| <body> | |
| <a-scene> | |
| <!-- Camera with customized cursor --> | |
| <a-camera position="0 1.8 0" cursor-visible="true" cursor-scale="2" cursor-color="#4CC3D9" cursor-offset="2" cursor-maxdistance="100" cursor-opacity="0.5" cursor-fuse="true"></a-camera> | |
| <a-light color="#FFF" position="-1 1 0" type="ambient"></a-light> | |
| <a-entity light="type: point; color: #FFF; intensity: 0.3" position="0 3 0"></a-entity> | |
| <!-- Sky --> | |
| <a-sky color="#00004d"></a-sky> | |
| </a-scene> | |
| <script> | |
| // random data | |
| var data = []; | |
| for (var i = 0; i < 50; i++) { | |
| data.push(Math.random()) | |
| } | |
| // Scale the height of bars | |
| var hScale = d3.scale.linear() | |
| .domain([d3.min(data), d3.max(data)]) | |
| .range([0, 10]) | |
| // Set color scale | |
| var colors = d3.scale.linear() | |
| .domain([0, data.length*.33, data.length*.66, data.length]) | |
| .range(['#B58929','#C61C6F', '#268BD2', '#85992C']) | |
| // Select the scene object just like an svg | |
| var scene = d3.select("a-scene") | |
| // Use d3's enter/update/exit pattern to draw and bind the dom elements | |
| var bars = scene.selectAll("a-cylinder.bar") | |
| .data(data) | |
| bars.enter() | |
| .append("a-cylinder") | |
| .classed("bar", true) | |
| // Set attributes on the cubes | |
| bars.attr({ | |
| position: function(d,i) { | |
| // cubes are positioned by their center so we | |
| // offset for their height | |
| var y = 1 + hScale(d)/2; | |
| // lets place the bars all around our camera | |
| var radius = 15; | |
| //var x = i - data.length/2; | |
| var x = radius * Math.cos(i/data.length * 2 * Math.PI); | |
| var z = radius * Math.sin(i/data.length * 2 * Math.PI); | |
| return x + " " + y + " " + z | |
| }, | |
| rotation: function(d,i) { | |
| var x = 0; | |
| var z = 0; | |
| var y = -(i/data.length)*360; | |
| return x + " " + y + " " + z | |
| }, | |
| width: function(d) { return 0.5}, | |
| depth: function(d) { return 0.9}, | |
| height: 0, | |
| color: function(d,i) { return colors(i);} | |
| }) | |
| .transition() | |
| .attr("height", function(d) { return hScale(d) }) | |
| .delay(function(d, i) { | |
| return i * 100; | |
| }) | |
| .duration(7000) | |
| .ease("elastic") | |
| </script> | |
| </body> |