利用threejs实现3D全景图
来源:互联网 发布:apache伪静态两次 编辑:程序博客网 时间:2024/05/07 04:30
threejs下载位置:http://www.threejs.org
我在Facebook上看到Facebook实现了3D全景图,然后,一直很好奇,最后,我发现threejs里面有一个库竟然可以实现,一下我贴出代码:
<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0"> <title>three.js css3d - panorama</title> <style> body { background-color: #000000; margin: 0; cursor: move; overflow: hidden; } a { color: #ffffff; } #info { position: absolute; width: 100%; color: #ffffff; padding: 5px; font-family: Monospace; font-size: 13px; font-weight: bold; text-align: center; z-index: 1; } </style></head><body><script src="../build/three.min.js"></script> <!-- 此处引入threejs基础类 --><script src="js/renderers/CSS3DRenderer.js"></script> <!-- 此处引入CSS3Drenderer.js类 --><!-- 以上两个文件,在下载threejs的时候就有的,引入就好 --><script> var camera, scene, renderer; var geometry, material, mesh; var target = new THREE.Vector3(); var lon = 90, lat = 0; var phi = 0, theta = 0; var touchX, touchY; init(); animate(); function init() { camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 1, 1000 ); scene = new THREE.Scene();/** 次数是重点说明的 * 这个sides对应的是六张图位于立体坐标轴内的位置,里面的position又包含x,y,三个轴 * 然后ratation是三个轴上的变换 */ var sides = [ { position: [ 512, 0, 0 ], // 1 rotation: [ 0, -Math.PI / 2, 0 ] }, { position: [ -512, 0, 0 ], // 2 rotation: [ 0, Math.PI / 2, 0 ] }, { position: [ 0, 512, 0 ], // 3 rotation: [ Math.PI / 2, 0, Math.PI ] }, { position: [ 0, -512, 0 ], // 4 rotation: [ - Math.PI / 2, 0, Math.PI ] }, { position: [ 0, 0, 512 ], // 5 rotation: [ 0, Math.PI, 0 ] }, { position: [ 0, 0, -512 ], // 6 rotation: [ 0, 0, 0 ] } ]; var canvas = document.createElement('canvas'); var image = document.createElement('img'); image.src = 'picture/360photos.jpg'; // 画图,这里引入的这张图片,是一张图上集合了6张图片 image.height = 6144; image.width = 1024; canvas.width = 1024; canvas.height = 1024; // 这里有判断image.onload,这里是判断创建的image节点是否把引入的图片加载进来 image.onload = function() { for ( var i = 0; i < sides.length; i ++ ) { // 由于是六张图放在一张图片上,然后这里分割六张图片 var cxt = canvas.getContext("2d"); cxt.drawImage(image, 0, -1024*i); var side = sides[ i ]; var element = document.createElement( 'img' ); element.width = 1026; // 2 pixels extra to close the gap. document.getElementsByTagName('body')[0].appendChild(canvas); var _img_url = canvas.toDataURL("image/png"); // 获取图片位置 element.src = _img_url; var object = new THREE.CSS3DObject( element ); // 这里根据sides把图片放在坐标轴上进行渲染 object.position.fromArray( side.position ); object.rotation.fromArray( side.rotation ); scene.add( object ); } } renderer = new THREE.CSS3DRenderer(); renderer.setSize( window.innerWidth, window.innerHeight ); document.body.appendChild( renderer.domElement ); // document.addEventListener( 'mousedown', onDocumentMouseDown, false ); document.addEventListener( 'mousewheel', onDocumentMouseWheel, false ); document.addEventListener( 'touchstart', onDocumentTouchStart, false ); document.addEventListener( 'touchmove', onDocumentTouchMove, 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(); document.addEventListener( 'mousemove', onDocumentMouseMove, false ); document.addEventListener( 'mouseup', onDocumentMouseUp, false ); } function onDocumentMouseMove( event ) { var movementX = event.movementX || event.mozMovementX || event.webkitMovementX || 0; var movementY = event.movementY || event.mozMovementY || event.webkitMovementY || 0; lon -= movementX * 0.1; lat += movementY * 0.1; } function onDocumentMouseUp( event ) { document.removeEventListener( 'mousemove', onDocumentMouseMove ); document.removeEventListener( 'mouseup', onDocumentMouseUp ); } function onDocumentMouseWheel( event ) { camera.fov -= event.wheelDeltaY * 0.05; camera.updateProjectionMatrix(); } function onDocumentTouchStart( event ) { event.preventDefault(); var touch = event.touches[ 0 ]; touchX = touch.screenX; touchY = touch.screenY; } function onDocumentTouchMove( event ) { event.preventDefault(); var touch = event.touches[ 0 ]; lon -= ( touch.screenX - touchX ) * 0.1; lat += ( touch.screenY - touchY ) * 0.1; touchX = touch.screenX; touchY = touch.screenY; } function animate() { requestAnimationFrame( animate ); lon += 0.1; lat = Math.max( - 85, Math.min( 85, lat ) ); phi = THREE.Math.degToRad( 90 - lat ); theta = THREE.Math.degToRad( lon ); target.x = Math.sin( phi ) * Math.cos( theta ); target.y = Math.cos( phi ); target.z = Math.sin( phi ) * Math.sin( theta ); camera.lookAt( target ); renderer.render( scene, camera ); }</script></body></html>
以上,我把重要的说明点都写上了注释,然后,注意,我这里的图片是去facebook上下载下来的,我把Facebook上的图片手动进行了左右翻转实现的程序,如果不需要手动翻转,如果是渲染Facebook上的图片的话,需要把Facebook的图片用程序进行翻转再分割才能渲染出正常的图片,否则渲染出来的全景是不正常的。
我下面附上的图很大,宽度是1024像素的,然后高度是1024像素*6;原图是这张图的左右翻转。
下面,我附上图,此图来自简书上传的,可能会有盗链导致加载不出来:
0 0
- 利用threejs实现3D全景图
- 使用threejs实现3D全景漫游
- 3d全景图
- 基于Threejs的360全景图预览
- Away 3D实现360度全景图的二种全景图.
- 浏览器中实现3D全景浏览
- 3D全景直播
- threejs加载3D模型例子
- threejs制作3d模型展示网页
- Threejs开发3D地图实践总结
- 利用OpenGL实现IOS上VR全景图
- 3D全景!这么牛!!
- 3D全景!这么牛!!
- DIY 3D全景摄像机
- 【自己写全景】TreeJs实现全景图
- VR 全景图实现
- Vr (全景图实现)
- unity3d利用pano2VR实现全景视图效果
- LitePal结合SQLCipher实现DB数据库操作和加密
- 最大子段和
- 科克曼女生问题
- js对象的些许记录
- rtems移植到树莓派
- 利用threejs实现3D全景图
- rabbitmq笔记
- PAT
- Mac 下使用命令行自动补全--bash-completion--git命令自动补全
- leetcode--53. Maximum Subarray
- MATLAB作业2
- webpack 的 demos
- 3、Redis从入门到放弃 之 安装
- Spring中使用Map、Set、List、数组、属性集合的注入方法配置文件