webxr_vr_panorama_depth.html 3.8 KB
Newer Older
1 2 3
<!DOCTYPE html>
<html lang="en">
	<head>
4
		<title>three.js webxr - panorama with depth</title>
5 6 7 8 9 10 11 12 13 14
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
		<link type="text/css" rel="stylesheet" href="main.css">
		<!-- WebXR Device API (For Chrome M76+), expires 12/04/2019 -->
		<meta http-equiv="origin-trial" content="Aq9LklhCLNUveuCr7QTpGpqwCPG817cYHdVyQuJPOZYk47iRB390lUKa5edVmgS1pZSl8HPspElEC/91Fz55dwIAAABTeyJvcmlnaW4iOiJodHRwczovL3RocmVlanMub3JnOjQ0MyIsImZlYXR1cmUiOiJXZWJYUkRldmljZU03NiIsImV4cGlyeSI6MTU3NTQxNzU5OX0=">
	</head>
	<body>
		<div id="container"></div>

		<div id="info">
15
			<a href="http://threejs.org" target="_blank" rel="noopener">three.js</a> webxr - panorama with depth<br />
16 17 18 19 20 21 22 23
			Created by <a href="https://orfleisher.com" target="_blank" rel="noopener">@juniorxsound</a>. Panorama from <a href="https://krpano.com/examples/?depthmap" target="_blank" rel="noopener">krpano</a>.
		</div>

		<script src="js/vr/HelioWebXRPolyfill.js"></script>

		<script type="module">

			import * as THREE from '../build/three.module.js';
24
			import { VRButton } from './jsm/webxr/VRButton.js';
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

			var camera, scene, renderer, sphere, clock;

			init();
			animate();

			function init() {

				var container = document.getElementById( 'container' );

				clock = new THREE.Clock();

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

				var light = new THREE.AmbientLight( 0x404040, 10 );
				scene.add( light );

M
Mr.doob 已提交
43
				camera = new THREE.PerspectiveCamera( 70, window.innerWidth / window.innerHeight, 1, 2000 );
M
Mr.doob 已提交
44
				scene.add( camera );
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92

				// Create the panoramic sphere geometery
				var panoSphereGeo = new THREE.SphereBufferGeometry( 6, 256, 256 );

				// Create the panoramic sphere material
				var panoSphereMat = new THREE.MeshStandardMaterial( {
					side: THREE.BackSide,
					displacementScale: - 4.0
				} );

				// Create the panoramic sphere mesh
				sphere = new THREE.Mesh( panoSphereGeo, panoSphereMat );

				// Load and assign the texture and depth map
				var manager = new THREE.LoadingManager();
				var loader = new THREE.TextureLoader( manager );

				loader.load( './textures/kandao3.jpg', function ( texture ) {

					texture.minFilter = THREE.NearestFilter;
					texture.format = THREE.RGBFormat;
					texture.generateMipmaps = false;
					sphere.material.map = texture;

				} );

				loader.load( './textures/kandao3_depthmap.jpg', function ( depth ) {

					depth.minFilter = THREE.NearestFilter;
					depth.format = THREE.RGBFormat;
					depth.generateMipmaps = false;
					sphere.material.displacementMap = depth;

				} );

				// On load complete add the panoramic sphere to the scene
				manager.onLoad = function () {

					scene.add( sphere );

				};

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

93
				document.body.appendChild( VRButton.createButton( renderer, { referenceSpaceType: 'local' } ) );
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119

				//

				window.addEventListener( 'resize', onWindowResize, false );

			}

			function onWindowResize() {

				camera.aspect = window.innerWidth / window.innerHeight;
				camera.updateProjectionMatrix();

				renderer.setSize( window.innerWidth, window.innerHeight );

			}

			function animate() {

				renderer.setAnimationLoop( render );

			}

			function render() {

				// If we are not presenting move the camera a little so the effect is visible

M
Mr.doob 已提交
120
				if ( renderer.vr.isPresenting() === false ) {
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136

					var time = clock.getElapsedTime();

					sphere.rotation.y += 0.001;
					sphere.position.x = Math.sin( time ) * 0.2;
					sphere.position.z = Math.cos( time ) * 0.2;

				}

				renderer.render( scene, camera );

			}

		</script>
	</body>
</html>