JSFiddle - React, Tailwind, and code Playground

by A A

HTML

<script src="//cdn.rawgit.com/mrdoob/three.js/master/build/three.min.js"></script>

CSS

body {
	  margin: 0;
}

JavaScript

var camera, scene, renderer;
var mesh, pivot;

init();
animate();

function init() {

    camera = new THREE.PerspectiveCamera( 70, window.innerWidth / window.innerHeight, 0.01, 10 );
    camera.position.z = 1;

    scene = new THREE.Scene();

    var geometry = new THREE.PlaneGeometry( 0.2, 0.5, 0.2 );
    var material = new THREE.MeshNormalMaterial();
    var material2 = new THREE.MeshBasicMaterial({
      color: 0xffff00
    });

    mesh = new THREE.Mesh( geometry, material );
    mesh.position.set(0, -.25, 0);
    scene.add( mesh );
    
    var geo2 = geometry.clone();
    geo2.rotateZ(THREE.Math.degToRad(90)); // ROTATE GEOMETRY SO IT'S IN THE CORRECT ORIENTATION
    var mesh2 = new THREE.Mesh( geo2, material2 );
    mesh2.position.set( 0, .25, 0 ); // MOVE THE GEOMOETRY UP BY HALF SO PIVOT IS AT THE BOTTOM OF THE GEO
    mesh2.rotation.set(0, 0, Math.PI / 2);
    mesh.add(mesh2);
    
    pivot = new THREE.Group();
    pivot.position.set( 0.0, 0, 0 ); // MOVE THE PIVOT BACK TO WORLD ORIGN
    mesh.add( pivot ); // THIS ADDS THE PIVOT TO THE CENTRE OF THE GEOMOETRY, WHICH WAS THEN ADDING MESH2 IN THE WRONG PLACE
    pivot.add( mesh2 );
    
    // VISUALISE PIVOT
    var pivotSphereGeo = new THREE.SphereGeometry( 0.01 );
    var pivotSphere = new THREE.Mesh(pivotSphereGeo);
    pivotSphere.position.set( 0,0,0 );
    pivotSphere.position.z = 0.1;
    scene.add( pivotSphere );
    
    scene.add( new THREE.AxesHelper() );

    renderer = new THREE.WebGLRenderer( { antialias: true } );
    renderer.setSize( window.innerWidth, window.innerHeight );
    document.body.appendChild( renderer.domElement );

}

function animate() {

    requestAnimationFrame( animate );

		pivot.rotation.z += 0.01;
		
    renderer.render( scene, camera );

}