Explorar o código

Init 360 6DOF example 🚀

Or Fleisher %!s(int64=5) %!d(string=hai) anos
pai
achega
31925d2367
Modificáronse 3 ficheiros con 162 adicións e 0 borrados
  1. BIN=BIN
      examples/textures/kandao3.jpg
  2. BIN=BIN
      examples/textures/kandao3_depthmap.jpg
  3. 162 0
      examples/webvr_6dof_panorama.html

BIN=BIN
examples/textures/kandao3.jpg


BIN=BIN
examples/textures/kandao3_depthmap.jpg


+ 162 - 0
examples/webvr_6dof_panorama.html

@@ -0,0 +1,162 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<title>three.js webvr - 360 6DOF panorama</title>
+		<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">
+			<a href="http://threejs.org" target="_blank" rel="noopener">three.js</a> webvr - 360 6DOF panorama<br />
+			Written by <a href="https://orfleisher.com" target="_blank" rel="noopener">@juniorxsound</a>. Panorama from <a href="http://www.meryproject.com/" target="_blank" rel="noopener">reference panoramas</a>.
+        </div>
+        
+        <script type="x-shader/x-vertex" id="vertexshader">
+            varying vec2 vUv;
+
+            uniform sampler2D depth_map;
+            uniform float displacement;
+
+            void main() {
+
+                vUv = uv;
+                
+                float depth = texture2D(depth_map, uv).r;
+                float disp = displacement * depth;
+                vec3 offset = position + (-normal) * disp;
+            
+                gl_Position = projectionMatrix *
+                                modelViewMatrix *
+                                vec4(offset, 1.0);
+            }
+
+        </script>
+
+        <script type="x-shader/x-fragment" id="fragmentshader">
+
+            varying vec2 vUv;
+
+            uniform sampler2D texture;
+
+            void main() {
+
+                gl_FragColor = texture2D(texture, vUv);
+
+            }
+
+        </script>
+
+		<script src="js/vr/HelioWebXRPolyfill.js"></script>
+
+		<script type="module">
+
+			import * as THREE from '../build/three.module.js';
+			import { WEBVR } from './jsm/vr/WebVR.js';
+
+			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 );
+
+                camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 1, 2000 );
+                var cameraRig = new THREE.Object3D();
+                cameraRig.position.y = -1.6;
+                cameraRig.add( camera );
+                scene.add( cameraRig );
+
+                // Create the panoramic sphere with the custom shader material
+                var panoSphereGeo = new THREE.SphereBufferGeometry( 6, 256, 256 );
+                var panoSphereMat = new THREE.ShaderMaterial({
+                    uniforms: {
+                        texture: { value : null },
+                        depth_map: { value: null },
+                        displacement: { value: 4 }
+                    },
+                    vertexShader: document.getElementById( 'vertexshader' ).textContent,
+                    fragmentShader: document.getElementById( 'fragmentshader' ).textContent,
+                    side: THREE.BackSide
+                });
+                sphere = new THREE.Mesh( panoSphereGeo, panoSphereMat );
+                scene.add( sphere );
+
+                // Load and assign the texture and depth map
+                var loader = new THREE.TextureLoader();
+                loader.load('./textures/kandao3.jpg', function ( texture ) {
+                    texture.minFilter = THREE.NearestFilter
+                    texture.magFilter = THREE.LinearFilter
+                    texture.format = THREE.RGBFormat
+                    texture.generateMipmaps = false
+                    sphere.material.uniforms.texture.value = texture;
+                });
+
+                loader.load('./textures/kandao3_depthmap.jpg', function ( depth ) {
+                    depth.minFilter = THREE.NearestFilter
+                    depth.magFilter = THREE.LinearFilter
+                    depth.format = THREE.RGBFormat
+                    depth.generateMipmaps = false
+                    sphere.material.uniforms.depth_map.value = depth;
+                });
+
+				renderer = new THREE.WebGLRenderer();
+				renderer.setPixelRatio( window.devicePixelRatio );
+				renderer.setSize( window.innerWidth, window.innerHeight );
+				renderer.vr.enabled = true;
+				container.appendChild( renderer.domElement );
+
+				document.body.appendChild( WEBVR.createButton( renderer ) );
+
+				//
+
+				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
+                if (!renderer.vr.isPresenting()) {
+
+                    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>