JSFiddle - React, Tailwind, and code Playground

HTML

<div id="room"></div>
<script src="https://threejs.org/build/three.js"></script>
<script src="https://threejs.org/examples/js/controls/FirstPersonControls.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.5.1/gsap.min.js"></script>
<script>
  var room = document.getElementById('room');

  var camera, scene, renderer;

  var controls, clock = new THREE.Clock();
  var intersects;

  var windowWidth = window.innerWidth;
  var windowHeight = window.innerHeight;

  const targets = [];
  const raycaster = new THREE.Raycaster();
  const raycasterHover = new THREE.Raycaster();
  const mouse = new THREE.Vector2();
  const target = new THREE.Vector2();

  function init() {

    camera = new THREE.PerspectiveCamera( 45, windowWidth / windowHeight, 1, 10000 );
    camera.position.z = 2000;

    scene = new THREE.Scene();
    scene.background = new THREE.Color( 0x444444 );

    var geometry = new THREE.PlaneBufferGeometry( (windowWidth / 3), (windowHeight / 3) );
    var material = new THREE.MeshBasicMaterial( { color: 0xcccccc, wireframe: false } );

  for (let i = 0; i < 5; i++) {

    const panel = new THREE.Mesh( geometry, material );

    panel.position.x = windowHeight * ( i - Math.random() );
    panel.position.y = windowWidth * ( i - Math.random() );
    panel.position.z = 0;

    scene.add( panel );
    targets.push( panel );

  }

    renderer = new THREE.WebGLRenderer( { antialias: true } );
    renderer.setPixelRatio( window.devicePixelRatio );
    renderer.setSize( windowWidth, windowHeight );
    room.appendChild( renderer.domElement );

    controls = new THREE.FirstPersonControls( camera, renderer.domElement );
    controls.movementSpeed = 1000;
    controls.rollSpeed = Math.PI / 10 ;

    renderer.domElement.addEventListener( 'mousedown', mousedown, false );

  }

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

  function render() {

    controls.update( clock.getDelta() );
    for ( var i = 1, l =...

CSS

* {
	  margin: 0;
}
#room {
  overflow: hidden;
  height: 100vh;
  width: 100vw;
}

JavaScript

function mousedown( event ) {
	
  mouse.x = ( event.clientX / windowWidth ) * 2 - 1;
  mouse.y = - ( event.clientY / windowHeight ) * 2 + 1;
  raycaster.setFromCamera( mouse, camera );
  intersects = raycaster.intersectObjects( targets );

  if ( intersects.length > 0 ) {

    // stop controls
    controls.enabled = false;

    var targetOrientation = intersects[0].object.quaternion.normalize();
    gsap.to({}, 1, { 
      onUpdate: function() {
        camera.quaternion.slerp( targetOrientation , this.progress() );
      },
      onComplete: function() {
        controls.lookAt( intersects[0].object.position );
        controls.enabled = true;
      }
    });
	}
}

init();
animate();