A playground for learning about A-frame
Now, I’m going to work in data-02,
visualizing some data points with a scatterplot,
as we did in data-01.
But now, I will be using A-frame components
for the spheres and the axis.
We will follow the documentation in Writing a component
Writing an A-Frame component is easy: just produce a JavaScript object
which specifies how the component will be. For example, we
produce a component for visualizing a plot (sphere) in the scene.
The component is named datapoint, and produces the same result
as the plotDot function in data-01. The component is expressed
as a JavaScript object with two propierties: schema and update.
This object is passed as a parameter to AFRAME.registerComponent:
AFRAME.registerComponent('datapoint', {
schema: {
...
},
update: function () {
...
}
});
The first property, schema, defines the attributes that
can be used to instantiate the component:
schema: {
position: {type: 'vec3', default: {x:0, y:0, z:0}},
color: {type: 'string', default: 'red'},
size: {type: 'number', default: 1}
}
You can get more information about which types can be specified, and about the schema definition in general in the Schema section in the Component documentation.
The second property, update, is the code that will be run
whenever the component is updated in the DOM, including when it is
inserted in it for the first time:
update: function () {
var self = this;
self.sphere = document.createElement('a-sphere');
self.sphere.setAttribute('position', self.data.position);
self.sphere.setAttribute('color', self.data.color);
self.sphere.setAttribute('radius', self.data.size);
this.el.appendChild(self.sphere);
self.sphere.addEventListener('mouseenter', function () {
self.sphere.setAttribute('scale', {x: 1.3, y: 1.3, z: 1.3});
});
...
}
You can see how the data defined in the schema can be accessed
under this.data, and the element corresponding to the component
is this.el. Thus, in this case we’re including an sphere element in the
datapoint element.
Finally, we instantiate all the components. In this case, we instantiate the axis in the HTML file:
<a-entity id="axis" axis="color: red"></a-entity>
And the data points at the end of the JavaScript file,
in a listener that is fired when the DOM is ready.
The loop gets the data for each data point,
produces a datapoint component for each of them,
and inserts it in the scene:
for (let item of items) {
console.log(item);
var entity = document.createElement('a-entity');
entity.setAttribute('datapoint', {
'color': item['color'],
'size': item['size'],
'position': {x: item['x'], y: item['y'], z: item['z']}
});
scene.appendChild(entity);
};
As we saw in the previous section, the complete process to build the project is:
$ cd data-02
$ npm install
$ npm run start
This will build everything, you will only need a browser to see the resulting scene.
Check the resulting virtual reality scene.