JSFiddle - React, Tailwind, and code Playground

HTML

<script src="http://frontier.lincoln.ac.uk/3d/development/Stage3/THREE_54/examples/js/controls/TrackballControls.js"></script>
<script src="http://threejs.org/build/three.min.js"></script>
<script src="http://threejs.org/examples/js/controls/TrackballControls.js"></script>
<body onLoad="init()"></body>

CSS

body {
    font-family: Monospace;
    background-color: #a8ddf8;
    margin: 0px;
    overflow: hidden;
}

JavaScript

var controls, scene, camera, box, spline, counter = 0;

var tangent = new THREE.Vector3();
var axis = new THREE.Vector3();
var up = new THREE.Vector3(0, 1, 0);

function init() {
    renderer = new THREE.WebGLRenderer();
    renderer.setSize(window.innerWidth, window.innerHeight);
    document.body.appendChild(renderer.domElement);
    camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 5000);
    camera.position.set(0, 0, 600);
    camera.lookAt(new THREE.Vector3(0, 100, 0));
    scene = new THREE.Scene();
    controls = new THREE.TrackballControls(camera, render.domElement);

    var numPoints = 50;

    spline = new THREE.SplineCurve3([
    new THREE.Vector3(0, 0, 0),
    new THREE.Vector3(0, 200, 0),
    new THREE.Vector3(150, 150, 0),
    new THREE.Vector3(150, 50, 0),
    new THREE.Vector3(250, 100, 0),
    new THREE.Vector3(250, 300, 0)]);

    var material = new THREE.LineBasicMaterial({
        color: 0xff00f0,
    });

    var geometry = new THREE.Geometry();
    var splinePoints = spline.getPoints(numPoints);

    for (var i = 0; i < splinePoints.length; i++) {
        geometry.vertices.push(splinePoints[i]);
    }

    var line = new THREE.Line(geometry, material);
    scene.add(line);

    geometry = new THREE.BoxGeometry(5, 40, 4);
    material = new THREE.MeshBasicMaterial({
        color: 0xff0000
    });

    box = new THREE.Mesh(geometry, material);
    scene.add(box);

    animate();

    setInterval(moveBox, 100);
}

function moveBox() {
    if (counter <= 1) {
        box.position.copy( spline.getPointAt(counter) );

        tangent = spline.getTangentAt(counter).normalize();

        axis.crossVectors(up, tangent).normalize();

        var radians = Math.acos(up.dot(tangent));

        box.quaternion.setFromAxisAngle(axis, radians);

        counter += 0.005
    } else {
        counter = 0;
    }
}

function animate() {
    requestAnimationFrame(animate);
    render();
}

function render() {
   ...