|
<!DOCTYPE html> |
|
<html> |
|
<head> |
|
<meta charset="utf-8"> |
|
<title>Recursive Polygons in 3D with Snowflakes</title> |
|
<script src="https://aframe.io/releases/1.2.0/aframe.min.js"></script> |
|
<script src="https://unpkg.com/aframe-environment-component/dist/aframe-environment-component.min.js"></script> |
|
<style> |
|
#canvas { |
|
height: 500px; |
|
width: 800px; |
|
} |
|
</style> |
|
</head> |
|
<body> |
|
<a-scene> |
|
<a-entity environment="preset: forest"></a-entity> |
|
|
|
|
|
|
|
|
|
|
|
<a-entity id="snowflakes"></a-entity> |
|
|
|
<a-entity camera position="0 1.6 0" look-controls wasd-controls></a-entity> |
|
</a-scene> |
|
|
|
<script> |
|
AFRAME.registerComponent('snowflake', { |
|
init: function() { |
|
this.el.setAttribute('geometry', { |
|
primitive: 'sphere', |
|
radius: 0.05 |
|
}); |
|
this.el.setAttribute('material', { color: '#FFF' }); |
|
|
|
|
|
this.el.object3D.position.set( |
|
(Math.random() - 0.5) * 20, |
|
5 + Math.random() * 5, |
|
(Math.random() - 0.5) * 20 |
|
); |
|
|
|
|
|
this.velocity = new THREE.Vector3(0, -0.05, 0); |
|
}, |
|
tick: function() { |
|
this.el.object3D.position.add(this.velocity); |
|
if (this.el.object3D.position.y <= 0) { |
|
this.el.parentNode.removeChild(this.el); |
|
} |
|
} |
|
}); |
|
|
|
|
|
setInterval(() => { |
|
let sceneEl = document.querySelector('a-scene'); |
|
let snowflakeEl = document.createElement('a-entity'); |
|
snowflakeEl.setAttribute('snowflake', ''); |
|
sceneEl.appendChild(snowflakeEl); |
|
}, 100); |
|
</script> |
|
</body> |
|
</html> |