JSFiddle - React, Tailwind, and code Playground

by Michael Prosser

HTML

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<div class="stage">
<!--
  <div class="noob-shape" data-shape="cylinder">
    <div data-item="0"></div>
    <div data-item="1"></div>
    <div data-item="2"></div>
    <div data-item="3"></div>
    <div data-item="4"></div>
    <div data-item="5"></div>
    <div data-item="6"></div>
    <div data-item="7"></div>
    <div data-item="top"></div>
    <div data-item="bottom"></div>
  </div>
  -->
</div>

CSS

html{
  height:100%;
}
body{
  height:100%;
  margin:0px;
  perspective:500px;
  background-color:#000;
}
.stage{
  position:absolute;
  top:50%;
  left:50%;
  width:0px;
  height:0px;
  transform-style:preserve-3d;
}

.noob-shape {
    top: 50%;
    left: 50%;
    height: 0px;
    width: 0px;
    transform-style: preserve-3d;
    position: absolute;
    pointer-events: none;
    clip-path: none !important;
    transform:rotateX(30deg) rotateY(30deg);
    animation:spin 4s infinite linear;
}
@keyframes spin{
  0% { transform: rotateX(0deg) rotateY(0deg); }
  100% { transform: rotateX(360deg) rotateY(360deg); }
}
.noob-shape>div {
    position: absolute;
    backface-visibility: hidden;
    pointer-events: none;
    box-sizing: border-box;
}
.noob-shape>div {
    position: absolute;
    backface-visibility: hidden;
    pointer-events: none;
    box-sizing: border-box;
    height:100px;
    width:42px;
    background-color:#cccccc;
    margin-left:-21px;
    margin-top:-50px;
}

.noob-shape[data-shape="cylinder"]>div[data-item="0"]{
    transform:translateZ(50px);
}
.noob-shape[data-shape="cylinder"]>div[data-item="1"]{
    transform:translateZ(35px) translateX(-35px) rotateY(-45deg);
}
.noob-shape[data-shape="cylinder"]>div[data-item="2"]{
    transform:translateX(-50px) rotateY(-90deg);
}
.noob-shape[data-shape="cylinder"]>div[data-item="3"]{
    transform:translateZ(-35px) translateX(-35px) rotateY(-135deg);
}
.noob-shape[data-shape="cylinder"]>div[data-item="4"]{
    transform:translateZ(-50px) rotateY(180deg);
}
.noob-shape[data-shape="cylinder"]>div[data-item="5"]{
    transform:translateZ(-35px) translateX(35px) rotateY(-225deg);
}
.noob-shape[data-shape="cylinder"]>div[data-item="6"]{
    transform:translateX(50px) rotateY(90deg);
}
.noob-shape[data-shape="cylinder"]>div[data-item="7"]{
    transform:translateZ(35px) translateX(35px) rotateY(45deg);
}
.noob-shape[data-shape="cylinder"]>div[data-item="top"]{
    transform:translateY(-50px) rotateX(90deg);
  ...

JavaScript

// formula for cylinder generation
//
// r (Radius) = 50;
// h (Height) = 100;
// p (Positions) = Array({ x: 0, z: 50 },{ x: -35, z: 35 },{ x: -50, z: 0 },{ x: -35, z: -35 },{ x: 0, z: 50 },{ x: 35, z: -35 },{ x: 50, z: 0 },{ x: 35, z: 35 });
// 
// for 8 sided cylinder
// panel width = 42; OR r * .84
// panel height = 100; OR h
// offset_90 = 50; OR r
// offset_45 = 35; OR r * .7

function generate_cylinder(r,h,x,y){

	var offset_90 = r;
	var offset_45 = r * .7;
	var panel_width = r * .84;
  var panel_height = h;
  
	var panel_t_0_styles = 'transform:translateZ(' + offset_90 + 'px);';
	var panel_t_1_styles = 'transform:translateZ(' + offset_45 + 'px) translateX(' + (offset_45*-1) + 'px) rotateY(-45deg);';
	var panel_t_2_styles = 'transform:translateX(' + (offset_90*-1) + 'px) rotateY(-90deg);';
	var panel_t_3_styles = 'transform:translateZ(' + (offset_45*-1) + 'px) translateX(' + (offset_45*-1) + 'px) rotateY(-135deg);';
  var panel_t_4_styles = 'transform:translateZ(' + (offset_90*-1) + 'px) rotateY(180deg);';
  var panel_t_5_styles = 'transform:translateZ(' + (offset_45*-1) + 'px) translateX(' + offset_45 + 'px) rotateY(-225deg);';
  var panel_t_6_styles = 'transform:translateX(' + offset_90 + 'px) rotateY(90deg);';
  var panel_t_7_styles = 'transform:translateZ(' + offset_45 + 'px) translateX(' + offset_45 + 'px) rotateY(45deg);';
	
  var panel_t_top_styles = 'transform:translateY(' + ((h/2)*-1) + 'px) rotateX(90deg);';
	var panel_t_bottom_styles = 'transform:translateY(' + (h/2) + 'px) rotateX(-90deg);';
  
  var width_height_styles = 'width:' + panel_width + 'px;height:' + panel_height + 'px;margin-left:' + ((panel_width/2)*-1) + 'px;margin-top:' + ((panel_height/2)*-1) + 'px;'; 
	var top_bottom_width_height_styles = 'width:' + (r*2) + 'px;height:' + (r*2) + 'px;margin-left:' + (r*-1) + 'px;margin-top:' + (r*-1) + 'px;';

	$('.stage').append('<div class="noob-shape" data-shape="cylinder" style="margin-left:' + x + 'px;margin-top:' + y + 'px;"><div...