ThreeJS rotating icosahedron with images on vertices

ThreeJS rotating icosahedron with images on vertices

Simple clone of the Stripe element @ https://stripe.com/radar

I had some fun replicating the rotating icosahedron of the Stripe page, and in the end, it came out pretty good.

I know that on Stripe they have created their own solid using Cinema 4d.

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
</head>
<body>
   
   <div id="container">
      <canvas id="c"></canvas>
      <div class="vert" id="v1">
         <img src="https://unsplash.it/500"/>
      </div>
      <div class="vert" id="v2">
         <img src="https://unsplash.it/501"/>
      </div>
            <div class="vert" id="v3">
         <img src="https://unsplash.it/502"/>
      </div>
            <div class="vert" id="v4">
         <img src="https://unsplash.it/504"/>
      </div>
                  <div class="vert" id="v5">
         <img src="https://unsplash.it/505"/>
      </div>
   </div>
   
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r72/three.min.js"></script>

</body>
</html>
*{
   font-family:Helvetica
}
#container{   
   
   position:absolute;
   background:black;
}

#c{
   background:black;
}

.vert{
   transform: translateX(-50) translateY(-50%);
   transition:opacity 0.2s;
   /* border: 1px solid #555;
   background:white;
   padding:0.5em 1em; */
         
   position: absolute;
}

img{
   min-width:60px;
   max-width:100px;   
   border-radius: 50%;
}


var c = document.getElementById("c")
c.width = 400;
c.height=400
var renderer = new THREE.WebGLRenderer({
   canvas: c
});
renderer.setSize(c.width, c.height);
document.body.appendChild(renderer.domElement);

var camera = new THREE.PerspectiveCamera(45, c.width / c.height, 1, 500);
camera.position.set(0, 0, 100);
camera.lookAt(new THREE.Vector3(0, 0, 0));

var scene = new THREE.Scene();
var light = new THREE.AmbientLight( 0x666666 ); // soft white light
scene.add( light );
var dirLight = new THREE.DirectionalLight(0xffffff, 1);
var dirLight2 = new THREE.DirectionalLight(0xffffff, 2);
dirLight.position.set(10, 10, 10);
dirLight2.position.set(-10, -10, 50);
scene.add(dirLight);
scene.add(dirLight2);

var material = new THREE.MeshLambertMaterial({color: 0xff4444})
var geometry = new THREE.IcosahedronGeometry(30);
var I = new THREE.Mesh(geometry, material);
var speedx = speedy = 0
renderer.setClearColor( 0xffffff );
var offsetX=170;
var offsetY=150;
scene.add(I)

// var v2 = document.getElementById("v2");

function createVert(id, vnum){
   var v1 = document.getElementById(id);  
   var vector = I.geometry.vertices[vnum].clone();
   vector.applyMatrix4( I.matrixWorld );
   v1.style.top= ((-vector.y*5.5)+ offsetY) +"px";
   v1.style.left=((vector.x*5) + offsetX) +"px";
   v1.style.opacity= (vector.z<5) ? "0" : "1"
}

setInterval(()=>{
   I.rotation.y = speedx+=0.05
   I.rotation.x = speedy+=0.005
   renderer.render(scene, camera);
   
   createVert("v1", 2)
   createVert("v2", 4)
   createVert("v3", 5)
   createVert("v4", 6)
   createVert("v5", 7)
  
},30)