JSFiddle - React, Tailwind, and code Playground

by dustinkerstein

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/92/three.min.js"></script>
<div id="container"></div>

CSS

.bar {
  position: absolute;
  left: 50%;
  top: 50%;
  -webkit-transform: translate(-50%, -50%);
  transform: translate(-50%, -50%);
}

JavaScript

var url, container, mesh, video, camera, scene, renderer, texture, material, videoInitialized = false,
  videoSeeked = false,
  isUserInteracting = false,
  myXHR = new XMLHttpRequest(),
  frameSkipper = 5;
  
url = 'https://files.panomoments.com/native_uhd.mp4';
container = document.getElementById('container');

camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 1, 1100);
camera.target = new THREE.Vector3(0, 0, 0);
scene = new THREE.Scene();

video = document.createElement('video');
video.muted = true;
video.autoplay = false;
video.crossOrigin = 'anonymous';
video.setAttribute('webkit-playsinline', 'webkit-playsinline');
video.src = url;
video.addEventListener("seeked", onSeeked);

texture = new THREE.Texture(video);
texture.minFilter = THREE.LinearFilter;
texture.format = THREE.RGBFormat;
scene.add(camera);
mesh = new THREE.Mesh(
  new THREE.PlaneGeometry(1920, 1080),
  new THREE.MeshBasicMaterial({
    map: texture
  }));
mesh.position.set(0, 0, -1000);
scene.add(mesh);
camera.add(mesh);

renderer = new THREE.WebGLRenderer();
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(window.innerWidth, window.innerHeight);
container.appendChild(renderer.domElement);

renderer.animate( () => {
  	animate();
} );

    video.currentTime = (video.currentTime + 1) % 360;
    
function onSeeked() {
    console.log("seeked. currentTime: " + video.currentTime);
    video.currentTime = (video.currentTime + 1) % 360;
    texture.needsUpdate = true;
}

function animate() {

  /* if (video.readyState > 1) {
    console.log("video.currentTime: " + video.currentTime);
    //video.play();
    //video.pause();
    video.currentTime = (video.currentTime + 1) % 360;
    texture.needsUpdate = true;
  } else {
    console.log("video.readyState: " + video.readyState);
  } */
  
  renderer.render(scene, camera);

}