;(function($){ //panoramaView jQuery.fn.panoramaViewer=function(prmUser){ /////////////////////////////////////////////////////////////////////////////////////////// // Var /////////////////////////////////////////////////////////////////////////////////////////// //parameter const prmDef={ src : "", src_pre : "", autoRotate : false, autoRotateSpeed : 0.2, rotationX : 0, rotationY : 0, enableRotate : true, rotateSpeed : -0.05, enableGyro : true, camera : { fov : 45, near : 1, far : 2000 } }; const prm=$.extend(prmDef,prmUser); //canvas const myCanvas=$(this); var cv=new Canvas(); function Canvas(){ this._id =myCanvas.attr("id"); this._box =myCanvas.closest(".canvas_box"); this._loader =myCanvas.closest(".canvas_box").find(".canvas_loader"); this._w =this._box.width(); this._h =this._box.height(); } myCanvas.attr({ 'width' : cv._w, 'height' : cv._h }); //操作イベント var _start ='touchstart mousedown'; var _move ='touchmove mousemove'; var _end ='touchend mouseup'; var isTap=false; var isDrag=false; var isTouch=('ontouchstart' in window); var isGyro=false; if((prm.enableGyro)&&(window.DeviceOrientationEvent)&&('ontouchstart' in window)){ isGyro=true; } //回転用 var onMouseDownMouseX; var onMouseDownMouseY; var lon=0; var lat=0; var onMouseDownLon; var onMouseDownLat; //three.js var renderer; var scene; var group; var camera; var controls; //loader var loader={}; var loader_pre={}; /////////////////////////////////////////////////////////////////////////////////////////// // Canvas /////////////////////////////////////////////////////////////////////////////////////////// setCanvas(); function setCanvas(){ if(!Detector.webgl){Detector.addGetWebGLMessage();} renderer=new THREE.WebGLRenderer({ canvas : document.querySelector('#'+cv._id), antialias : true, alpha : true }); renderer.setPixelRatio(window.devicePixelRatio); renderer.setSize(cv._w,cv._h); scene=new THREE.Scene(); group=new THREE.Group(); if(isGyro){ camera=new THREE.PerspectiveCamera(prm.camera.fov,cv._w/cv._h,prm.camera.near,prm.camera.far); camera.position.set(0,0,0); controls=new THREE.DeviceOrientationControls(camera,true); controls.connect(); if(prm.enableRotate){ myCanvas.on(_start,function(e){ e.preventDefault(); isTap=true; }); myCanvas.on(_move,function(e){ e.preventDefault(); if(isTap){ isTap=false; isDrag=true; onMouseDownMouseX=(isTouch ? event.changedTouches[0].clientX : e.clientX); onMouseDownMouseY=(isTouch ? event.changedTouches[0].clientY : e.clientY); onMouseDownLon=lon; onMouseDownLat=lat; }else if(isDrag){ var move_x=(isTouch ? event.changedTouches[0].clientX : e.clientX); var move_y=(isTouch ? event.changedTouches[0].clientY : e.clientY); lon=(move_x-onMouseDownMouseX)*-0.005+onMouseDownLon; lat=(move_y-onMouseDownMouseY)*-0.005+onMouseDownLat; } }); myCanvas.on(_end,function(e){ e.preventDefault(); isTap=false; isDrag=false; }); } }else{ camera=new THREE.PerspectiveCamera(prm.camera.fov,cv._w/cv._h,prm.camera.near,prm.camera.far); camera.translateZ(0.01); camera.lookAt(new THREE.Vector3(0,0,0)); controls=new THREE.OrbitControls(camera,renderer.domElement); if(prm.autoRotate){ controls.autoRotate=true; controls.autoRotateSpeed=prm.autoRotateSpeed; }else{ controls.autoRotate=false; } if(prm.enableRotate){ controls.enableRotate=true; controls.rotateSpeed=prm.rotateSpeed; }else{ controls.enableRotate=false; } controls.enableDamping =true; controls.dampingFactor =0.1; controls.enableZoom =false; controls.enablePan =false; } if(prm.src_pre!=""){ loader_pre[prm.src_pre]=false; var gmPrebase=new THREE.SphereBufferGeometry(900,60,40); gmPrebase.scale(-1,1,1); var mtrPrebase; var texture_pre=new THREE.TextureLoader().load(prm.src_pre,function(){ loader_pre[prm.src_pre]=true; }); mtrPrebase=new THREE.MeshBasicMaterial({ map : texture_pre }); texture_pre.minFilter=texture_pre.magFilter=THREE.LinearFilter; texture_pre.mapping=THREE.UVMapping; } var prebase=new THREE.Mesh(gmPrebase,mtrPrebase); prebase.rotation.y=(prm.rotationY*Math.PI/180)*-1; group.add(prebase); var gmBase=new THREE.SphereBufferGeometry(1000,60,40); gmBase.scale(-1,1,1); var mtrBase; if(prm.src==""){ mtrBase=new THREE.MeshNormalMaterial(); }else{ loader[prm.src]=false; var texture=new THREE.TextureLoader().load(prm.src,function(){ loader[prm.src]=true; checkLoading(); }); mtrBase=new THREE.MeshBasicMaterial({ map : texture }); texture.minFilter=texture.magFilter=THREE.LinearFilter; texture.mapping=THREE.UVMapping; } var base=new THREE.Mesh(gmBase,mtrBase); base.rotation.y=(prm.rotationY*Math.PI/180)*-1; group.add(base); runLoading(); function runLoading(){ var flag_loading=false; Object.keys(loader_pre).forEach(function(key){ if(!loader_pre[key]){ flag_loading=true; } },loader_pre); if(flag_loading){ setTimeout(function(){ runLoading(); },500); }else{ scene.add(group); runAnimate(); } } function checkLoading(){ var flag_loading=false; Object.keys(loader).forEach(function(key){ if(!loader[key]){ flag_loading=true; } },loader); if(!flag_loading){ if(prm.src_pre!=""){ prebase.visible=false; } cv._loader.hide(); } } function runAnimate(){ if((isGyro)&&(isDrag)){ group.rotation.y=lon; group.rotation.x=lat; } controls.update(); renderer.render(scene,camera); requestAnimationFrame(runAnimate); } } /////////////////////////////////////////////////////////////////////////////////////////// // Window Resize /////////////////////////////////////////////////////////////////////////////////////////// var timerResize=false; $(window).on("resize",function(){ if(timerResize!==false){ clearTimeout(timerResize); } timerResize=setTimeout(function(){ resizeCanvas(); },500); }); function resizeCanvas(){ cv._w=cv._box.width(); cv._h=cv._box.height(); myCanvas.attr({ 'width' : cv._w, 'height' : cv._h }); renderer.setPixelRatio(window.devicePixelRatio); renderer.setSize(cv._w,cv._h); camera.aspect=cv._w/cv._h; camera.updateProjectionMatrix(); } }; })(jQuery);