JSFiddle - React, Tailwind, and code Playground
HTML
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/88/three.min.js"></script>
<button id="btn">
start demo
</button>
<pre id="log"></pre>
JavaScript
btn.onclick = e => {
window.open('https://youtube.com', 'YouTube', 'width=1920,height=1080,scrollbars=no,status=0');
btn.remove();
log.textContent = "Please select 'YouTube' in opened prompt.";
requestStream();
}
function requestStream() {
navigator.mediaDevices
.getUserMedia({
video: {
mediaSource: 'window'
}
})
.then(streamToTexture)
.then(startRenderer)
.catch(e => log.textContent = 'failed to request window stream, be sure you are using latest Firefox.')
}
function streamToTexture(stream) {
const video = document.createElement('video');
video.srcObject = stream;
video.play();
videoTexture = new THREE.VideoTexture(video);
videoTexture.minFilter = THREE.LinearFilter;
videoTexture.magFilter = THREE.LinearFilter;
return videoTexture;
}
function startRenderer(videoTexture) {
var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera(50, 500 / 400, 0.1, 1000);
var renderer = new THREE.WebGLRenderer();
renderer.setSize(500, 400);
document.body.appendChild(renderer.domElement);
var geometry = new THREE.SphereGeometry(3, 50, 50, 0, Math.PI * 2, 0, Math.PI * 2);
var material = new THREE.MeshPhongMaterial({
map: videoTexture,
color: 0xffffff
});
var cube = new THREE.Mesh(geometry, material);
scene.add(cube);
var lights = [];
lights[0] = new THREE.PointLight(0xffffff, 1, 0);
lights[1] = new THREE.PointLight(0xffffff, 1, 0);
lights[2] = new THREE.PointLight(0xffffff, 1, 0);
lights[0].position.set(0, 200, 0);
lights[1].position.set(100, 200, 100);
lights[2].position.set(-100, -200, -100);
scene.add(lights[0]);
scene.add(lights[1]);
scene.add(lights[2]);
camera.position.z = 10;
var render = function() {
requestAnimationFrame(render);
cube.rotation.y += 0.01;
renderer.render(scene, camera);
};
render();
}