Realidad extendida: el problema del huevo y la gallina
// ------------------------------------------------------------------------------------------------------------------------------- // PHOTOSWIPE
var initPhotoSwipeFromDOM = function(gallerySelector) {
// parse slide data (url, title, size ...) from DOM elements // (children of gallerySelector) var parseThumbnailElements = function(el) { var thumbElements = el.childNodes, numNodes = thumbElements.length, items = [], figureEl, linkEl, size, item;
for(var i = 0; i < numNodes; i++) {
figureEl = thumbElements[i]; //
// include only element nodes if(figureEl.nodeType !== 1) { continue; }
linkEl = figureEl.children[0]; // element
size = linkEl.getAttribute('data-size').split('x');
// create slide object item = { src: linkEl.getAttribute('href'), w: parseInt(size[0], 10), h: parseInt(size[1], 10) };
if(figureEl.children.length > 1) {
//
if(linkEl.children.length > 0) {
// thumbnail element, retrieving thumbnail url
item.msrc = linkEl.children[0].getAttribute('src');
}
item.el = figureEl; // save link to element for getThumbBoundsFn items.push(item); }
return items; };
// find nearest parent element var closest = function closest(el, fn) { return el && ( fn(el) ? el : closest(el.parentNode, fn) ); };
// triggers when user clicks on thumbnail var onThumbnailsClick = function(e) { e = e || window.event; e.preventDefault ? e.preventDefault() : e.returnValue = false;
var eTarget = e.target || e.srcElement;
// find root element of slide var clickedListItem = closest(eTarget, function(el) { return (el.tagName && el.tagName.toUpperCase() === 'FIGURE'); });
if(!clickedListItem) { return; }
// find index of clicked item by looping through all child nodes // alternatively, you may define index via data- attribute var clickedGallery = clickedListItem.parentNode, childNodes = clickedListItem.parentNode.childNodes, numChildNodes = childNodes.length, nodeIndex = 0, index;
for (var i = 0; i < numChildNodes; i++) { if(childNodes[i].nodeType !== 1) { continue; } if(childNodes[i] === clickedListItem) { index = nodeIndex; break; } nodeIndex++; } if(index >= 0) { // open PhotoSwipe if valid index found openPhotoSwipe( index, clickedGallery ); } return false; };
// parse picture index and gallery index from URL (#&pid=1&gid=2) var photoswipeParseHash = function() { var hash = window.location.hash.substring(1), params = {};
if(hash.length < 5) { return params; } var vars = hash.split('&'); for (var i = 0; i < vars.length; i++) { if(!vars[i]) { continue; } var pair = vars[i].split('='); if(pair.length < 2) { continue; } params[pair[0]] = pair[1]; } if(params.gid) { params.gid = parseInt(params.gid, 10); } return params; }; var openPhotoSwipe = function(index, galleryElement, disableAnimation, fromURL) { var pswpElement = document.querySelectorAll('.pswp')[0], gallery, options, items; items = parseThumbnailElements(galleryElement); // define options (if needed) options = { // define gallery index (for URL) galleryUID: galleryElement.getAttribute('data-pswp-uid'), getThumbBoundsFn: function(index) { // See Options -> getThumbBoundsFn section of documentation for more info var thumbnail = items[index].el.getElementsByTagName('img')[0], // find thumbnail pageYScroll = window.pageYOffset || document.documentElement.scrollTop, rect = thumbnail.getBoundingClientRect();
return {x:rect.left, y:rect.top + pageYScroll, w:rect.width}; }
};
// PhotoSwipe opened from URL if(fromURL) { if(options.galleryPIDs) { // parse real index when custom PIDs are used // http://photoswipe.com/documentation/faq.html#custom-pid-in-url for(var j = 0; j < items.length; j++) { if(items[j].pid == index) { options.index = j; break; } } } else { // in URL indexes start from 1 options.index = parseInt(index, 10) - 1; } } else { options.index = parseInt(index, 10); } // exit if index not found if( isNaN(options.index) ) { return; } if(disableAnimation) { options.showAnimationDuration = 0; } // Pass data to PhotoSwipe and initialize it gallery = new PhotoSwipe( pswpElement, PhotoSwipeUI_Default, items, options); gallery.init(); }; // loop through all gallery elements and bind events var galleryElements = document.querySelectorAll( gallerySelector ); for(var i = 0, l = galleryElements.length; i < l; i++) { galleryElements[i].setAttribute('data-pswp-uid', i+1); galleryElements[i].onclick = onThumbnailsClick; } // Parse URL and open gallery if it contains #&pid=3&gid=1 var hashData = photoswipeParseHash(); if(hashData.pid && hashData.gid) { openPhotoSwipe( hashData.pid , galleryElements[ hashData.gid - 1 ], true, true ); } }; // execute above function initPhotoSwipeFromDOM('.my-gallery'); // ====================================== // FIN SCRIPTS PHOTOSWIPE // ======================================
Desde hace años, por ejemplo, se viene hablando del advenimiento del llamado internet de las cosas y de los wearables (ropa y accesorios para traer el internet pegado al cuerpo) como las tendencias dominantes. Pero aún la mayoría de la gente sigue sin tener regaderas o cafeteras controladas por WiFi, ni agujetas de los tenis que se amarran mediante control de voz.
Un fenómeno parecido ocurre con las realidades que, valga la redundancia, no terminan de "realizarse". Se trata de la realidad virtual y la realidad aumentada (que en su combinación ya se les llama "realidad extendida"), utilidades que ya no evocan películas de ciencia ficción, pero que aún están lejos de convertirse en herramientas cotidianas más allá de su explotación para videojuegos.
Si bien tienen su público, basta asomarse a cualquier tienda física de juegos para verificar que las gafas de realidad virtual (aquella que implica sumergirse en un entorno completamente digital) no están entre los accesorios más ofertados (lo que hace suponer que tampoco entre los más vendidos). Lo anterior, a pesa de que cada año las ferias de tecnología muestran modelos más sofisticados tanto en diseño como en propiedades.
El campo de la realidad aumentada (aquella en la que elementos virtuales o digitales se superponen a los existentes en el mundo físico) pareció vivir su ingreso triunfal hace tres años con la explosiva popularidad del juego Pokémon Go, que permite "atrapar" monstruos de caricatura "ocultos" en plazas y parques públicos, por medio del teléfono celular.
Si bien todavía es posible encontrar en el Metrobús a uno que otro adicto a recolectar y coleccionar personajes de esa venerada franquicia japonesa, lo cierto es que la fiebre pasó rápido y no hubo otro competidor que tomara la estafeta.
La otra aplicación popular de la realidad aumentada la constituyen los filtros que permiten ponerse orejas de perro o cualquier otro disfraz simpático mientras uno se comunica por videochat. Pero difícilmente esta característica podría denominarse como "utilidad".
Express yourself and say YES! to the weekend. 😎
Our friend @DonteColley is here to show you how to use the new camera with Create Mode. 🎉 pic.twitter.com/7T6pLSX6Dq
— Instagram (@instagram) November 15, 2019
Con todo y su incierto futuro, todas las semanas hay alguna novedad sobre la realidad aumentada. Una de las más recientes corre justo a cargo de la creadora de Pokemon Go, Niantic, que se unió a la fabricante de chips Qualcomm para trabajar en un modelo de gafas de realidad aumentada que operen con las redes móviles de próxima generación, las 5G. El CEO de Niantic, John Hanke, ha anunciado su intención de que este modelo de anteojos sea el siguiente gran invento después de los teléfonos inteligentes.
We're so excited to collaborate with @Qualcomm! Read more about our announcement from their #SnapdragonSummit here: https://t.co/iyFdNE7OTR
— Niantic (@NianticLabs) December 5, 2019
No parece tener mucho futuro esa idea, a juzgar por la experiencia previa vivida por Google, que hace siete años anunció con bombo y platillo sus smart glasses que nunca alcanzaron una presencia masiva, quedando más bien como un dispositivo con aplicaciones muy específicas para ciertas industrias.
Y eso, por no mencionar las versiones de que otros prometedores lentes de realidad aumentada, los Magic Leap, apenas han vendido unas seis mil piezas en seis meses. Ni siquiera la promesa de jugar Angry Birds en tercera dimensión funcionó.
El caso de Niantic y Qualcomm ilustra el problema señalado en un análisis publicado este semana por el portal Axios, en el que la realidad extendida sigue siendo la próxima gran novedad o la próxima gran decepción... o ambos a la vez.
Lo que se lee entre líneas, señala Axios, es que tanto los productos como el mercado de las realidades digitales se están desarrollando más lentamente de lo previsto inicialmente, lo que obliga a las nuevas empresas a reajustar sus planes para sobrevivir más tiempo con menos ingresos, y a las grandes empresas a tener cuidado de invertir demasiado, o demasiado pronto.
En ese contexto se entiende que Facebook (que ha invertido millones de dólares en ampliar el horizonte de la realidad extendida más allá de los juegos) haya decidido deshacerse de una parte de su empresa subsidiaria Oculus, la relacionada con el programa Medium, que vendió a la compañía Adobe.
Y es que, como bien apunta Axios, el camino en el que se transitan las realidades virtual y aumentada está sólidamente pavimentado en la cuestión técnica. El problema es que varios ingredientes clave (duración de la batería, resolución de pantalla y comodidad) no están todavía donde deben estar para que cualquiera de esas tecnologías sea de uso generalizado entre los consumidores.
Y es justo en el último eslabón de la cadena, el del mercado del consumidor común, en el que la realidad extendida vive el problema de qué fue primero, el huevo o la gallina. Axios concluye: todavía no hay suficiente contenido para impulsar las ventas de hardware, y las bajas ventas de hardware significan que el mercado sigue siendo poco atractivo para la mayoría de los creadores de contenido.
Firmas como Apple no han dejado de apostar por la realidad extendida. Pero llamó más la atención su debut esta semana como triple nominado al Globo de Oro por la serie The Morning Show, de su recién lanzado servicio de streaming. Quién dijera que la ficción resultó mejor negocio.
Comentarios
// Obtener todos los elementos con clase .col-md-12 var colElements = document.querySelectorAll('.col-md-12');
// Iterar sobre cada elemento colElements.forEach(function(element) { // Verificar si tiene un hijo inmediato con clase .titulo-region var tituloRegion = element.querySelector('.titulo-region');
if (tituloRegion) { // Agregar la clase .is-sticky al elemento padre element.classList.add('is-sticky'); } });
// Obtener el elemento article dentro de .fila-especial-v2 .p50 var articleElement = document.querySelector('.home .fila-especial-v2 .p50 article');
// Obtener el texto del elemento .z-foto .bajada p var bajadaText = articleElement.querySelector('.z-foto .bajada p').textContent;
// Crear un nuevo elemento para mostrar el texto obtenido var textoElement = document.createElement('p'); textoElement.textContent = bajadaText;
// Obtener el elemento .z-txt .titulo dentro del article var tituloElement = articleElement.querySelector('.z-txt .titulo');
// Insertar el nuevo elemento al final del article articleElement.appendChild(textoElement);
Cortesía de Proceso.
Dejanos un comentario: