//https://maps.google.co.nz/maps/myplaces?ll=-38.75087,174.607258&spn=0.052479,0.154324&ctz=-780&t=h&z=13&layer=c&cbll=-38.750878,174.607314&panoid=N3qt_joqFI-93LKlaJBqBQ&cbp=11,198.35,,0,2.89 //https://maps.google.co.nz/?ll=-37.793237,175.303775&spn=0.001833,0.002411&t=h&z=19&layer=c&cbll=-37.793237,175.303775&panoid=qCIp44Wk4np0MUIEw_wjEA&cbp=12,98.51,,0,0 var fenway = new google.maps.LatLng(-37.793237, 175.303775); var botswana = new google.maps.LatLng(-20.472393999999998, 24.515585999999995); var NowyJork = new google.maps.LatLng(42.435272, -73.789272); var sandy = new google.maps.LatLng(40.554113, -74.110851); var sanFran = new google.maps.LatLng(37.775679, -122.425017); var HMSOcelot = new google.maps.LatLng(51.395492,0.526726); var geocoo = new google.maps.Geocoder(); $.urlParam = function(name){     var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(window.location.href);     if (results==null){        return null;     }     else{        return results[1] || 0;     } } var startLocation; var steps; places = { hamilton: fenway, botswana: botswana, newyork: NowyJork, sandy: sandy, sanFran: sanFran, submarine: HMSOcelot } var place = $.urlParam('place'); if(places[place]){ startLocation = places[place]; coolParty(); } else if (!!place) { geocoo.geocode({address:decodeURIComponent(place)}, function(data, status){ console.log(data); if(data[0]) startLocation = data[0].geometry.location; else startLocation = fenway; coolParty(); }); } else{ startLocation = fenway coolParty(); } var selectedLink; var timeoutHandle; var panorama; var dataService; var SVPaths = []; function coolParty(){ var map = new google.maps.Map( document.getElementById('map-canvas')); var panoramaOptions = { position: startLocation, pov: { heading: 90, pitch: 10, zoom: 1 }, linksControl:false, panControl:false, disableDefaultUI: true }; dataService = new google.maps.StreetViewService(); panorama = new google.maps.StreetViewPanorama(document.getElementById('pano'), panoramaOptions); map.setStreetView(panorama); google.maps.event.addListener(panorama, "pov_changed", function() { SyncThreeCamera(panorama.getPov().heading, panorama.getPov().pitch); //moved back to kinect }); google.maps.event.addListener(panorama, "links_changed", function() { console.log("nuking spheres and creating paths"); nukeSpheres(); createPaths(); }); google.maps.event.addListener(panorama, "zoom_changed", function(){ camera = cameraFromGoogleZoom(panorama.getZoom()); SyncThreeCamera(panorama.getPov().heading, panorama.getPov().pitch) }); } /* function LoadLinks( depth ) { var links = panorama.getLinks(); for ( var i = 0; i < links.length; ++i ) { ( function( panoLink ) { dataService.getPanoramaById( panoLink.pano, function( svData, svStatus ) { if ( svStatus == google.maps.StreetViewStatus.OK ) { var distance = google.maps.geometry.spherical.computeDistanceBetween( panorama.getPosition(), svData.location.latLng ); var heading = panoLink.heading; } else console.log( svData ); } ); } )( links[ i ] ) } }*/ var skipSteps = 2; function selecto(newIndex) { var index = newIndex - 1; var pathIndex = pickLink(panorama.getLinks()); //document.getElementById("kinectgripthing").innerHTML = "path: " + newIndex; if(index >= SVPaths[pathIndex].length) index = SVPaths[pathIndex].length - 1; if (index >= 0 && SVPaths[pathIndex].length > index) { selectSphere(SVPaths[pathIndex][index]); return SVPaths[pathIndex][index]; } else deselectSphere(); } function selectSphere(link) { if (link !== selectedLink) { deselectSphere(); selectedLink = link; if (selectedLink.sphere) { selectedLink.sphere.scale = new THREE.Vector3(2, 2, 2); selectoMore(selectedLink.sphere); } } } function deselectSphere() { if (selectedLink && selectedLink.sphere){ selectedLink.sphere.scale = new THREE.Vector3(1, 1, 1); if (selectedLink.sphere.anim) userUnselectSphere(selectedLink.sphere); } selectedLink = null; if (timeoutHandle !== null){ window.clearTimeout(timeoutHandle); console.log("CLEARED TIMER") } } var selectTime = 700; function selectoMore(sphere) { timeoutHandle = window.setTimeout(function() { userSelectSphere(sphere); /* //separate stage 1 sphere.startTime = performance.now(); var speed = sphere.distance / selectTime; //alert("heading equals " + sphere.heading + " and x equals " + sphere.position.x + " and distance equals " + sphere.distance ); //alert("all up is " + Math.sin(sphere.heading) * (sphere.position.x / sphere.distance)); var vec = new THREE.Vector3(Math.sin(sphere.heading) * (sphere.position.x / sphere.distance) , 0 , Math.cos(sphere.heading) * (sphere.position.z / sphere.distance) ); //alert("Raw vec is"); //alert(JSON.stringify(vec)); vec.normalize(); vec.multiplyScalar(speed); //alert("scaled vec is"); //alert(JSON.stringify(vec)); sphere.vec = vec; */ /* document.getElementById("kinectgripthing").innerHTML= "sphere " + sphere.id + ":
" + JSON.stringify(vec) + "
"; spheros.push(sphere);//begins animation */ }, selectTime); console.log("SETTIMER"); } function userSelectSphere(sphere){ //alert(JSON.stringify(getHipCameraPoint())); sphere.anim = new Ease(sphere.startPos,getHipCameraPoint(), 500); } function userUnselectSphere(sphere){ var timeo = Math.min(500, sphere.anim.time) sphere.anim = new Ease(sphere.position, sphere.startPos, timeo); } function jumpLoop(startPano) { //console.log("entered jumpLoop with " + steps + " steps") steps--; getLinks(startPano, jumpLoopFinish); } function getLinks(startPano, finalMethod) { dataService.getPanoramaById(startPano, function(StreetViewPanoramaData, StreetViewStatus) { if (StreetViewStatus == "OK") pickHop(StreetViewPanoramaData.links, finalMethod); else { console.log("StreetViewStatus was " + StreetViewStatus + " so I gave up") }; }); } function jumpLoopFinish(responsePano) { if (steps <= 0) { //break from loop //panorama.setPano(responsePano); dataService.getPanoramaById(responsePano.pano, function(svData, svStatus) { if (svStatus == google.maps.StreetViewStatus.OK) { var distance = google.maps.geometry.spherical.computeDistanceBetween(panorama.getPosition(), svData.location.latLng); console.log("jumping to " + responsePano.pano); var heading = google.maps.geometry.spherical.computeHeading(panorama.getPosition(), svData.location.latLng); //createPanoSphere( heading, distance, responsePano ); panorama.setPano(responsePano.pano); } }); skipSteps++; return; } console.log("steps = " + steps + " and going another round now from " + responsePano); jumpLoop(responsePano.pano); } /** *links, the collection of google streetview links *finalMethod, method to pass result on to **/ function pickLink(links) { //based off the current pano's heading return next forward jump //console.log("Starting jump from " + startPano); var setPano = null; var povHeading = panorama.getPov().heading; var minDiff = 360; var theIndex; //console.log("Starting picklink panorama pano is " + startPano);//+ " and startPano is " + startPano for (var k = 0; k < links.length; k++) { var linkBearing = (links[k].heading + 360) % 360; var povHead = (povHeading + 360) % 360; var diff = Math.abs(linkBearing - povHead); //console.log("diff is " + diff + " at " + dummyLinks[k].pano); if (diff > 180) { diff = 360 - diff; } if (minDiff > diff) { minDiff = diff; setPano = links[k]; theIndex = k; } // console.log(links[k].description + " " + k + ": " + linkBearing + " minus " + povHead + " = " + (linkBearing - povHead) + ", mindiff is " + minDiff); } //console.log("Picked " + setPano + '\n'); //finalMethod( theIndex ); //console.log("k is " +k); //console.log(theIndex); return theIndex; } function pickHop(links) { //based off the current pano's heading return next forward jump var setPano = null; var povHeading = panorama.getPov().heading; var minDiff = 360; for (var k = 0; k < links.length; k++) { var linkBearing = (links[k].heading + 360) % 360; var povHead = (povHeading + 360) % 360; var diff = Math.abs(linkBearing - povHead); //console.log("diff is " + diff + " at " + dummyLinks[k].pano); if (diff > 180) { diff = 360 - diff; } if (minDiff > diff) { minDiff = diff; setPano = links[k]; } } return setPano; } function createPaths() { console.log("Recomputing Paths"); var newPaths = panorama.getLinks(); SVPaths = []; for (var i = 0; i < newPaths.length; ++i) { SVPaths[i] = [newPaths[i]]; extendPath(SVPaths[i], 10); } console.log(SVPaths); } function extendPath(path, steps) { var curLink = path[path.length - 1]; dataService.getPanoramaById(curLink.pano, function(svData, svStatus) { if (svStatus == google.maps.StreetViewStatus.OK) { var distance = google.maps.geometry.spherical.computeDistanceBetween(panorama.getPosition(), svData.location.latLng); var heading = google.maps.geometry.spherical.computeHeading(panorama.getPosition(), svData.location.latLng); createPanoSphere(heading, distance, curLink, svData.tiles.centerHeading); curLink.distance = distance; curLink.heading = heading; } else alert("Ohhh myyy goooooooooooood"); if (svStatus == "OK") pickExtendLink(curLink.heading, svData.links, function(nextLink) { path.push(nextLink); if (steps > 1) extendPath(path, steps - 1); }); else console.log("StreetViewStatus was " + svStatus + " so I gave up"); }); } function pickExtendLink(heading, links, finalMethod) { //based off the current pano's heading return next forward jump //console.log("Starting jump from " + startPano); var setPano = null; var povHeading = heading; var minDiff = 360; //console.log("Starting picklink panorama pano is " + startPano);//+ " and startPano is " + startPano for (var k = 0; k < links.length; k++) { var linkBearing = (links[k].heading + 360) % 360; var povHead = (povHeading + 360) % 360; var diff = Math.abs(linkBearing - povHead); //console.log("diff is " + diff + " at " + dummyLinks[k].pano); if (diff > 180) { diff = 360 - diff; } if (minDiff > diff) { minDiff = diff; setPano = links[k]; } // console.log(links[k].description + " " + k + ": " + linkBearing + " minus " + povHead + " = " + (linkBearing - povHead) + ", mindiff is " + minDiff); } //console.log("Picked " + setPano + '\n'); finalMethod(setPano); return setPano; }