JSFiddle - React, Tailwind, and code Playground

HTML

<script src="https://cdn.jsdelivr.net/npm/three@0.129.0/build/three.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/three@0.129.0/examples/js/loaders/GLTFLoader.js"></script>

CSS

body {
	  margin: 0;
}

JavaScript

let camera, scene, renderer, clock, model, target;

const rotationMatrix = new THREE.Matrix4();
const targetQuaternion = new THREE.Quaternion();
const speed = 2;

init();
animate();

function init() {

  camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.01, 20);
  camera.position.set(0, 3, 12);
  camera.lookAt(0, 1, 0);

  clock = new THREE.Clock();

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

  const light = new THREE.HemisphereLight(0xbbbbff, 0x444422);
  light.position.set(0, 1, 0);
  scene.add(light);

  const helper = new THREE.GridHelper();
  scene.add(helper);

  const loader = new THREE.GLTFLoader();
  loader.load('https://threejs.org/examples/models/gltf/Soldier.glb', function(gltf) {

    model = gltf.scene;
    model.children[0].rotation.z = Math.PI;
    scene.add(model);
    generateTarget();

  });

  const targetGeometry = new THREE.SphereGeometry(0.2);
  const targetMaterial = new THREE.MeshBasicMaterial({
    color: 0xff0000
  });
  target = new THREE.Mesh(targetGeometry, targetMaterial);
  scene.add(target);

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

}

function animate() {

  requestAnimationFrame(animate);

  const delta = clock.getDelta();

  if (model !== undefined && !model.quaternion.equals(targetQuaternion)) {

    const step = speed * delta;
    model.quaternion.rotateTowards(targetQuaternion, step);

  }

  renderer.render(scene, camera);

}

function generateTarget() {

  // generate a random point on a sphere

  target.position.x = -5 + (10 * Math.random());
  target.position.z = -5 + (10 * Math.random());

  // compute target rotation

  if (model !== undefined) {

    rotationMatrix.lookAt(target.position, model.position, model.up);
   ...