【问题标题】:View Image like in inverted carrousel or VR/Spherical查看图像,如倒转转盘或 VR/球形
【发布时间】:2018-10-07 19:56:04
【问题描述】:

我正在尝试构建这样的东西:

但不同的是,我有一个 4096x1024 的背景图像,我希望它看起来像某种 VR 外观,中心离屏幕有点远,边缘有点拉伸和靠近

我设法使用aframes 并将我的图像设置为<a-sky> 标记的背景,因此它会在球体中扭曲我的图像,并在球体中心扭曲视图或相机。我得到了我想要的正确类型的视图,问题是我认为有更轻松的解决方案。 我还想输入文字,我希望它的行为方式与图像的行为方式相同。

这就是我用 aframes 归档的内容:Gif on Imgur

我不想在场景/屏幕上移动(使用 AWDS),只是为了水平移动屏幕,因为我将拥有用户需要移动屏幕才能看到它们的元素,就像在 gif 和常见的卡罗素。

【问题讨论】:

    标签: css html three.js webgl aframe


    【解决方案1】:

    定义“打火机”A-Frame 是建立在WebVRthree.js 之上的,所以如果你不想依赖A-Frame,也许你可以使用three.js 自己构建全景图。它实际上已经有一个如何做到这一点的例子:

    https://threejs.org/examples/webgl_panorama_equirectangular.html

    <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/92/three.js"></script>
    <!DOCTYPE html>
    <html lang="en">
    	<head>
    		<title>three.js webgl - equirectangular panorama</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>
    		<div id="info">
    			<a href="http://threejs.org" target="_blank" rel="noopener">three.js webgl</a> - equirectangular panorama demo. photo by <a href="http://www.flickr.com/photos/jonragnarsson/2294472375/" target="_blank" rel="noopener">Jón Ragnarsson</a>.<br />
    			drag equirectangular texture into the page.
    		</div>
    
    		<script>
    			var camera, scene, renderer;
    			var 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.SphereBufferGeometry( 500, 60, 40 );
    				// invert the geometry on the x-axis so that all of the faces point inward
    				geometry.scale( - 1, 1, 1 );
    				var material = new THREE.MeshBasicMaterial( {
    					map: new THREE.TextureLoader().load( 'https://farm4.staticflickr.com/3289/2294472375_24a3b8ef46_o.jpg' )
    				} );
    				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( 'wheel', onDocumentMouseWheel, false );
    				//
    				document.addEventListener( 'dragover', function ( event ) {
    					event.preventDefault();
    					event.dataTransfer.dropEffect = 'copy';
    				}, false );
    				document.addEventListener( 'dragenter', function ( event ) {
    					document.body.style.opacity = 0.5;
    				}, false );
    				document.addEventListener( 'dragleave', function ( event ) {
    					document.body.style.opacity = 1;
    				}, false );
    				document.addEventListener( 'drop', function ( event ) {
    					event.preventDefault();
    					var reader = new FileReader();
    					reader.addEventListener( 'load', function ( event ) {
    						material.map.image.src = event.target.result;
    						material.map.needsUpdate = true;
    					}, false );
    					reader.readAsDataURL( event.dataTransfer.files[ 0 ] );
    					document.body.style.opacity = 1;
    				}, 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;
    				onMouseDownMouseX = event.clientX;
    				onMouseDownMouseY = event.clientY;
    				onMouseDownLon = lon;
    				onMouseDownLat = lat;
    			}
    			function onDocumentMouseMove( event ) {
    				if ( isUserInteracting === true ) {
    					lon = ( onMouseDownMouseX - event.clientX ) * 0.1 + onMouseDownLon;
    					lat = ( event.clientY - onMouseDownMouseY ) * 0.1 + onMouseDownLat;
    				}
    			}
    			function onDocumentMouseUp( event ) {
    				isUserInteracting = false;
    			}
    			function onDocumentMouseWheel( event ) {
    				var fov = camera.fov + event.deltaY * 0.05;
    				camera.fov = THREE.Math.clamp( fov, 10, 75 );
    				camera.updateProjectionMatrix();
    			}
    			function animate() {
    				requestAnimationFrame( animate );
    				update();
    			}
    			function update() {
    				if ( isUserInteracting === false ) {
    					lon += 0.1;
    				}
    				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 ); // comment this to disable Y axis
    				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>

    【讨论】:

    • 非常感谢老兄,我快速搜索了如何使用 AWSD 和相机向上/向下移动的能力,并且只允许向右/向左移动,但没有找到任何简洁的东西,对吗也知道我在哪里可以找到/了解这个?
    • 我不确定我是否理解。这个例子并没有随着 WASD 移动。您只想将相机限制在水平轴上吗?
    • 基本上,我想让相机只在水平轴上移动,没有上/下,只是右/左。我已经找到了如何消除使用 WASD 的可能性,但没有关于如何消除相机的上下移动
    • 那将是另一个问题。但是超级简单,就是不要设置camera.target.y。我已经更新了我的 sn-p。
    • 非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多