Last active
February 17, 2016 19:53
-
-
Save oberhamsi/31093e5d3d3dff7597a7 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<html lang="en"> | |
<head> | |
<title>three.js webgl - equirectangular video panorama demo</title> | |
<meta charset="utf-8"> | |
<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0"> | |
<style> | |
body { | |
background-color: #000000; | |
margin: 0px; | |
overflow: hidden; | |
} | |
#info { | |
position: absolute; | |
top: 0px; width: 100%; | |
color: #ffffff; | |
padding: 5px; | |
font-family:Monospace; | |
font-size:13px; | |
font-weight: bold; | |
text-align:center; | |
} | |
a { | |
color: #ffffff; | |
} | |
</style> | |
</head> | |
<body> | |
<div id="container"></div> | |
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r74/three.min.js"></script> | |
<script> | |
var camera, scene, renderer; | |
var texture_placeholder, | |
isUserInteracting = false, | |
onMouseDownMouseX = 0, onMouseDownMouseY = 0, | |
lon = 0, onMouseDownLon = 0, | |
lat = 0, onMouseDownLat = 0, | |
phi = 0, theta = 0; | |
init(); | |
animate(); | |
function init() { | |
var container, mesh; | |
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(); | |
var geometry = new THREE.SphereGeometry( 500, 60, 40 ); | |
geometry.scale( - 1, 1, 1 ); | |
var video = document.createElement( 'video' ); | |
video.width = 640; | |
video.height = 360; | |
video.autoplay = true; | |
video.loop = true; | |
video.src = "./pano.webm"; | |
var texture = new THREE.VideoTexture( video ); | |
texture.minFilter = THREE.LinearFilter; | |
var material = new THREE.MeshBasicMaterial( { map : texture } ); | |
mesh = new THREE.Mesh( geometry, material ); | |
scene.add( mesh ); | |
renderer = new THREE.WebGLRenderer(); | |
renderer.setPixelRatio( window.devicePixelRatio ); | |
renderer.setSize( window.innerWidth, window.innerHeight ); | |
container.appendChild( renderer.domElement ); | |
document.addEventListener( 'mousedown', onDocumentMouseDown, false ); | |
document.addEventListener( 'mousemove', onDocumentMouseMove, false ); | |
document.addEventListener( 'mouseup', onDocumentMouseUp, false ); | |
document.addEventListener( 'mousewheel', onDocumentMouseWheel, false ); | |
document.addEventListener( 'MozMousePixelScroll', onDocumentMouseWheel, false); | |
// | |
window.addEventListener( 'resize', onWindowResize, false ); | |
} | |
function onWindowResize() { | |
camera.aspect = window.innerWidth / window.innerHeight; | |
camera.updateProjectionMatrix(); | |
renderer.setSize( window.innerWidth, window.innerHeight ); | |
} | |
function onDocumentMouseDown( event ) { | |
event.preventDefault(); | |
isUserInteracting = true; | |
onPointerDownPointerX = event.clientX; | |
onPointerDownPointerY = event.clientY; | |
onPointerDownLon = lon; | |
onPointerDownLat = lat; | |
} | |
function onDocumentMouseMove( event ) { | |
if ( isUserInteracting === true ) { | |
lon = ( onPointerDownPointerX - event.clientX ) * 0.1 + onPointerDownLon; | |
lat = ( event.clientY - onPointerDownPointerY ) * 0.1 + onPointerDownLat; | |
} | |
} | |
function onDocumentMouseUp( event ) { | |
isUserInteracting = false; | |
} | |
function onDocumentMouseWheel( event ) { | |
// WebKit | |
if ( event.wheelDeltaY ) { | |
camera.fov -= event.wheelDeltaY * 0.05; | |
// Opera / Explorer 9 | |
} else if ( event.wheelDelta ) { | |
camera.fov -= event.wheelDelta * 0.05; | |
// Firefox | |
} else if ( event.detail ) { | |
camera.fov += event.detail * 1.0; | |
} | |
camera.updateProjectionMatrix(); | |
} | |
function animate() { | |
requestAnimationFrame( animate ); | |
update(); | |
} | |
function update() { | |
lat = Math.max( - 85, Math.min( 85, lat ) ); | |
phi = THREE.Math.degToRad( 90 - lat ); | |
theta = THREE.Math.degToRad( lon ) | |
camera.target.x = 500 * Math.sin( phi ) * Math.cos( theta ); | |
camera.target.y = 500 * Math.cos( phi ); | |
camera.target.z = 500 * Math.sin( phi ) * Math.sin( theta ); | |
camera.lookAt( camera.target ); | |
/* | |
// distortion | |
camera.position.copy( camera.target ).negate(); | |
*/ | |
renderer.render( scene, camera ); | |
} | |
</script> | |
</body> | |
</html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment