提交 31925d23 编写于 作者: O Or Fleisher

Init 360 6DOF example 🚀

上级 4ab3edd6
<!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>
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册