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...