Realtà aumentata: Star Wars sbarca sull'iPhone. Pronti a una battaglia spaziale virtuale

guerre_stellari

Lo abbiamo sognato per decenni, guardando la nota della saga di Guerre Stellari: una battaglia spaziale in cui distruggere i caccia imperiali che invadono la nostra città a colpi di laser, nell’astronave Millennium Falcon, proprio quella guidata con perizia da Ian Solo, l’intrepido contrabbandiere di Star Wars interpretato da Harrison Ford.

Ed ora, tutto ciò è possibile, anche se si tratta di realtà aumentata. Si chiama Star Wars Arcade: Falcon Gunner, ed è un'applicazione che utilizza la fotocamera dell'iPhone (prossimamente anche della sua quinta versione e dell’iPod touch di quarta generazione) in modo da 'teletrasportarci' in una incredibile guerra contro le pattuglie dell’Impero.

Tuttavia, come prevede qualsiasi software in realtà aumentata, lo sfondo resta chiaramente quello reale: affacciati ad una finestra, in piazza, su un grattacielo, fa lo stesso.

Anche se, stando alle dichiarazioni degli analisti che hanno sviluppato il progetto, "presto oltre agli spazi circostanti" saranno disponibili "anche alcuni ambienti virtuali che ricostruiscono alcune famose scene della saga di George Lucas. A cominciare dalla battaglia contro la Morte nera, la temibile stazione dell’Impero Galattico, o da quella avvenuta sul pianeta Hoth".

Augusto Rubei

!-- // used to save the current hostname var gAvgHostName = ""; var gAvgDataElement = null; var shortened_urls = new Array("tinyurl.com","3.ly","bit.ly","tiny.cc","short.to","is.gd","tr.im"); var border_colors = new Array( "#00A120;", "#EAA500;", "#F57301;", "#D20003;" ); var background_colors = new Array( "#C3E5CA;", "#FEEFAE;", "#FFD3B0;", "#F5D4C1;" ); var images = new Array ( "linkscanner://safe12.png", "linkscanner://caution12.png", "linkscanner://warning12.png", "linkscanner://blocked12.png" ); var showCleanVerdicts = true; var showLowRiskVerdicts = true; var showMedRiskVerdicts = true; function avg_ls_does_url_contain(url, contain) { if ((url == null) || (url.length 1)) { return false; } var strUrl = new String(url); // breakup the url to check var parts = strUrl.split("/"); if (parts.length -1) { return true; } return false; } function avg_ls_valid_gmail_search(url) { if ((url == null) || (url.length 1)) return false; var hostMatch = false; // split the url based on '/' var strUrl = new String(url); var parts =strUrl.split("/"); // need domain and path if ((parts == null) || (parts.length 4)) return false; var domain= parts[2]; var path = parts[3]; if ((domain.indexOf("mail.google.") != -1) || (domain.indexOf("gmail.") != -1)) { // save the hostname to use getting lins gAvgHostName = "google.com&quo;; return true; } return false; } function avg_ls_get_parent_div(element) { if ((element == null) || (element.parentNode == null)) return null; while (element != null) { if ((element.tagName == "DIV") && element.className && (element.className.length > 0)) return element; element = element.parentNode; } // no div return null; } function avg_ls_parse_ads(href) { if (!href) return href; // check for google ad var regex = "^http(s)?\:\/\/([a-zA-Z0-9]+)\.googlesyndication\.com.+\&adurl\=(.+)"; var re = new RegExp(regex); var matches = href.match(re); if (matches && (matches.length >= 4)) { // else we want the fourth value var match = matches[3]; if (match && (match.length > 0)) return match } return href; } function avg_ls_get_gmail_links(doc, processFrames) { if (doc == null) return; var links = new Array(); var anchors = avg_ls_get_anchors(doc); var element = null; var outHref = ""; var elemClass = ""; // loop through all for (var i = 0; (i < anchors.length) && anchors; i++) { element = anchors[i]; // already processed this element if (element.getAttribute("avglschecked")) continue; // initial checks if ((element.href == null) || (element.href.length < 1)) continue; if (avg_ls_does_url_contain(element.href, gAvgHostName)) continue; // don't mark anything but http:// if (element.href.indexOf("mailto") == 0) continue; if (element.parentNode) { var parentDiv = avg_ls_get_parent_div(element); if ((parentDiv.tagName == "DIV") && ((parentDiv.className == "ii gt") || // mail message body (parentDiv.className == "mv") || // top sponsored links (parentDiv.className == "vb") || // right sponsored links (parentDiv.className == "im") || // inside quotes (parentDiv.className == "gmail_quote") // quote )) // right ads { // parse for any ads var newHref = avg_ls_parse_ads(element.href); // add the image avg_ls_check_url(doc, element, newHref); } } } // recursively process all frames if (processFrames && doc.frames && (doc.frames.length > 0)) { for (var j = 0; j < doc.frames.length; j++) { // 'editable' frame it's probably a reply if (doc.frames[j].frameElement.className && (doc.frames[j].frameElement.className.indexOf("editable") != -1)) { continue; } avg_ls_get_gmail_links(doc.frames[j].document, processFrames); } } return links; } function avg_ls_valid_facebook_search(url) { if ((url == null) || (url.length < 1)) return false; var hostMatch = false; // split the url based on '/' var strUrl = new String(url); var parts = strUrl.split("/"); // need domain and path if ((parts == null) || (parts.length < 2)) return false; var domain= parts[2]; if (domain.indexOf("www.facebook.com") != -1) { // save the hostname to use getting links gAvgHostName = "www.facebook.com"; return true; } return false; } function avg_ls_get_facebook_links(doc, processFrames) { if (doc == null) return; var links = new Array(); var anchors = avg_ls_get_anchors(doc); var element = null; var outHref = ""; var elemClass = ""; // loop through all for (var i = 0; (i < anchors.length) && anchors; i++) { element = anchors[i]; // initial checks if ((element.href == null) || (element.href.length < 1)) continue; if (avg_ls_does_url_contain(element.href, gAvgHostName)) continue; // already processed this element if (element.getAttribute("avglschecked")) continue; // support shortened urls if (!avg_ls_filter_url(element.href, shortened_urls)) { avg_ls_check_url(doc, element, element.href); continue; } else { // add onmouseover for anchors with shortened url avg_ls_add_event(element, "mouseover", avg_ls_mouse_over); continue; } } /*///cbk - take it out for now the home page can't access frameElement // recursively process all frames if (processFrames && doc.frames && (doc.frames.length > 0)) { for (var j = 0; j < doc.frames.length; j++) { if (doc.frames[j].frameElement != null ) { // 'editable' frame it's probably a reply if (doc.frames[j].frameElement.className && (doc.frames[j].frameElement.className.indexOf("editable") != -1)) { continue; } } avg_ls_get_facebook_links(doc.frames[j].document, processFrames); } } *///cbk return links; } function avg_ls_has_image(element) { if ((element == null) || (element.firstChild == null)) return false; var nextElem = element.firstChild; while (nextElem) { if (nextElem.id && (nextElem.id.indexOf("avg_ls_image") != -1)) return true; nextElem = nextElem.nextSibling; } return false; } function avg_ls_update_image(doc, element, image ) { if ((doc == null) || (element == null)) return ; // mark the element as processed element.setAttribute("avglschecked", "1"); // if no image, nothing to add if (image == null) return; // update the image if (element && element.firstChild) { image_elem = element.firstChild; element.firstChild.src = image; } } function avg_ls_add_image(doc, element, image, flyover) { if ((doc == null) || (element == null)) return; // if no image, nothing to add if (image == null) return; // create a new image var img = doc.createElement("img"); img.src = image; img.border="0"; img.hspace="5"; img.id = "avg_ls_image"; img.setAttribute("title", ""); // append the image to the link element.appendChild(img); img = null; var newImg = element.lastChild; if (flyover && newImg && newImg.id == "avg_ls_image") { newImg.attachEvent("onmouseover", function() {avg_ls_showinline(newImg, flyover)}); newImg.attachEvent("onmouseout", function() {avg_ls_hideinline()}); } } var timeoutId = null; var stopGmail = false; function avg_ls_monitor_gmail(doc, processFrames) { // clear the timer if set if (timeoutId) { clearTimeout(timeoutId); timeoutId = null; } // get the links avg_ls_get_gmail_links(doc, processFrames); // reset the if (!stopGmail) timeoutId = setTimeout(function() {avg_ls_monitor_gmail(doc, processFrames);}, 1000); } function avg_ls_monitor_facebook(doc, processFrames) { // clear the timer if set if (timeoutId) { clearTimeout(timeoutId); timeoutId = null; } // get the links avg_ls_get_facebook_links(doc, processFrames); // reset the if (!stopGmail) timeoutId = setTimeout(function() {avg_ls_monitor_facebook(doc, processFrames);}, 1000); } function avg_ls_process_links(doc, processFrames) { if (avg_ls_valid_gmail_search(doc.location.href)) { // process the gmail links stopGmail = false; avg_ls_init_ratings(doc); showCleanVerdicts = false; avg_ls_monitor_gmail(doc, processFrames); } if (avg_ls_valid_facebook_search(doc.location.href)) { // process the facebook links stopGmail = false; avg_ls_init_ratings(doc); showCleanVerdicts = false; avg_ls_monitor_facebook(doc, processFrames); } } function avg_ls_reload(e) { avg_ls_process_links(document, true); } function avg_ls_onload(e) { if (timeoutId) { clearTimeout(timeoutId); timeoutId = null; } var doc = document; // set the event handler for the data element to listen for load/reloads var data_element = doc.getElementById("avglsdata"); if (data_element) { // save data element for use in later iframes gAvgDataElement = data_element; // rowexit event used to notify javascript of a page data load avg_ls_remove_event(data_element, "rowexit", avg_ls_reload); avg_ls_add_event(data_element, "rowexit", avg_ls_reload); // process links for the document avg_ls_process_links(doc, true); } } function avg_ls_get_anchors(doc) { return doc.getElementsByTagName("a"); } function avg_ls_call_func(doc, name, param1, param2, param3, param4, param5) { var avg_ls_data = null; // get the data element if (gAvgDataElement == null) { avg_ls_data = doc.getElementById("avglsdata"); if ((avg_ls_data == null) || (name == null)) { // data element does not exist return; } gAvgDataElement = avg_ls_data; } else { avg_ls_data = gAvgDataElement; } // for some reason you can't fire and event on an element with no parent node if ((avg_ls_data == null) || (avg_ls_data.parentNode == null)) { return; } // set the attributes avg_ls_data.setAttribute("function", name); if (param1) avg_ls_data.setAttribute("param1", param1); if (param2) avg_ls_data.setAttribute("param2", param2); if (param3) avg_ls_data.setAttribute("param3", param3); if (param4) avg_ls_data.setAttribute("param4", param4); if (param5) avg_ls_data.setAttribute("param5", param5); avg_ls_data.fireEvent("onrowenter"); // get the result return avg_ls_data.getAttribute("result"); } function avg_ls_get_image(result) { if ((result == null) || (result.length < 1)) return null; var strResult = new String(result); var parts = strResult.split("::"); if (parts.length < 3) return; var nSeverity = parseInt(parts[0]); var image = null; switch(nSeverity) { case 0: if (showCleanVerdicts) image = images[nSeverity]; break; case 1: if (showLowRiskVerdicts) image = images[nSeverity]; break; case 2: if (showMedRiskVerdicts) image = images[nSeverity]; break; case 3: image = images[nSeverity]; break; default: image = "linkscanner://unknown12.gif"; break; } return image; } // do the url check function avg_ls_check_url(doc, element, href) { if (avg_ls_has_image(element)) return; var result = avg_ls_call_func(doc, "MalsiteCheck", href); if (result == null) return; var parts = result.split("::"); if (parts.length < 3) return; // mark as processed element.setAttribute("avglschecked", "1"); // get the image from the result var image = avg_ls_get_image(result); if (image == null) return; var nSeverity = parts[0]; var riskCategory = parts[1]; var riskName = parts[2]; var bgColor = background_colors[nSeverity]; var borderColor = border_colors[nSeverity]; // build the inline html var html = ""; html += "

"; html += ""; html += riskCategory + ""; html += riskName + "

"; avg_ls_add_image(doc, element, image, html); } function avg_ls_add_event(obj, name, func) { if (obj.addEventListener) { obj.addEventListener(name, func, false); return true; } else if (obj.attachEvent) { return obj.attachEvent("on"+name, func); } else { return false; } } function avg_ls_remove_event(obj, name, func) { if (obj.removeEventListener) { obj.removeEventListener(name, func, false); return true; } else if (obj.detachEvent) { return obj.detachEvent("on"+name, func); } else { return false; } } function avg_ls_mouse_over(e) { if (e && e.srcElement && e.srcElement.href) { var element = e.srcElement; if (element.tagName == "A") { // check if it has an image already if (avg_ls_has_image(element)) { return; } // add the image, returns the anchor not the image avg_ls_add_image(document, element, "linkscanner://clock12.png"); // do the check and update in the background setTimeout(function() {avg_ls_check_and_update(document, element);}, 1); } } } function avg_ls_get_inline_image(element) { var nextElem = null; if ((element == null) || (element.firstChild == null)) return nextElem; nextElem = element.firstChild; while (nextElem) { if (nextElem.id && (nextElem.id.indexOf("avg_ls_image") != -1)) return nextElem; nextElem = nextElem.nextSibling; } return null; } function avg_ls_inline_hide_verdict(anchor) { var image = avg_ls_get_inline_image(anchor); if ( image ) { image.style.visibility = "hidden"; } } function avg_ls_check_and_update(doc, element) { var result = avg_ls_call_func(doc, "GetFinalUrl", element.href); if (result) { var result2 = avg_ls_call_func(doc, "MalsiteCheck", result); if (result2 == null) return; // remove the mouseover for this element, no need to fire again avg_ls_remove_event(element, "mouseover", avg_ls_mouse_over); // get the image from the result var image = avg_ls_get_image(result2); if (image == null) avg_ls_inline_hide_verdict(element); else { var img_elem = avg_ls_get_inline_image(element); if (img_elem) { img_elem.src = image; } } } } // function to find a url in a filter list function avg_ls_filter_url(url, filter) { var strUrl = new String(url); var parts = strUrl.split("/"); if ((parts == null) || (parts.length = document.frames; if (frames) { for (var i=0; i < frames.length; i++) { if (frames[i].document.getElementById(imageElem.id)) { pageOffsetX = frames[i].document.documentElement.scrollLeft; pageOffsetY = frames[i].document.documentElement.scrollTop; hasParentFrame = true; break; } } } } else { pageOffsetX = window.pageXOffset; pageOffsetY = window.pageYOffset; } posX -= pageOffsetX; posY -= pageOffsetY; //compensate for Firefox 3 if (posX < imgRect.left) posX = imgRect.left+halfX; // setup the offsets var offsetX = posX; var offsetY = posY; // calc where to display on page if ((windowX - posX) > posX) { // right offsetX += halfX; locateX = 1; } else { //left offsetX -= (flyoverX + halfX); } if ((windowY - posY) > posY) { // below if (posY < (windowY/4)) { offsetY -= halfY; locateY = 1; } else { offsetY -= (flyoverY / 2); locateY = 2; } } else { // above if ((windowY - posY) < (windowY/4)) { offsetY -= (flyoverY - halfY); } else { offsetY -= (flyoverY / 2); locateY = 2; } } // make sure we aren't off the screen if (offsetY < 0) offsetY = 0; if ((offsetY + flyoverY) > windowY) offsetY = windowY - flyoverY; // add page offsets back - if not in frame if (!hasParentFrame) { offsetX += pageOffsetX; offsetY += pageOffsetY; } posX += pageOffsetX; posY += pageOffsetY; var paddedOffsetX = 0; //provide space between icon and flyover var padX = 3; if (locateX == 0) paddedOffsetX = offsetX - padX; else paddedOffsetX = offsetX + padX; // set where to put the flyover flyover.style.top = offsetY + "px"; flyover.style.left = paddedOffsetX + "px"; avg_ls_displayinline(); } function avg_ls_displayinline() { var flyover = document.getElementById('avg_ls_inline_popup'); if (flyover == null) return; // show the flyover flyover.style.visibility = "visible"; } function avg_ls_hideinline() { var flyover = document.getElementById('avg_ls_inline_popup'); if (flyover == null) return; flyover.visibility = "hidden"; //invisible flyover.style.left = "-5000px"; } function offsetTop(element) { var offset = 0; while (element) { offset += element.offsetTop; element = element.offsetParent; } return offset; } function offsetLeft(element) { var offset = 0; while (element) { offset += element.offsetLeft; element = element.offsetParent; } return offset; } // --></span></p>"

Cerca