mozillahispano / blog-labs

Seguimiento de las tareas del blog de Labs
3 stars 4 forks source link

Building Cardboard Dungeon With A-Frame #68

Closed jvillalobos closed 8 years ago

jvillalobos commented 8 years ago

https://hacks.mozilla.org/2016/03/building-cardboard-dungeon-with-a-frame/

SoftwareRVG commented 8 years ago

Jorge. ¿ Puedes asignarme este ?

Saludos.

Rober Villar @SoftwareRVG

SoftwareRVG commented 8 years ago

Saludos, José , Ahora he visto que me lo asignas. Me voy a dormir ya. Esta semana empiezo con la tarea.

2016-06-11 3:04 GMT+02:00 Jose Suarez notifications@github.com:

Assigned #68 https://github.com/mozillahispano/blog-labs/issues/68 to @SoftwareRVG https://github.com/SoftwareRVG.

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/mozillahispano/blog-labs/issues/68#event-689262213, or mute the thread https://github.com/notifications/unsubscribe/APBJ2XcUHHpwlgukgrsGGKodw6p4XK04ks5qKgmfgaJpZM4IOF_o .

SoftwareRVG commented 8 years ago

Construcción de una Mazmorra de cartón con A-Frame

Mazmorra de Cartón es una web basada en la experiencia de rastreo por mazmorras diseñada para su uso con Google Cardboard y escrita utilizando la estructura de realidad virtual de mozilla, A-Frame.

En este estudio, Voy a hablar de los principales desafíos a los que me enfrenté durante el desarrollo de Mazmorra de Cartón, mis experiencias con A-Frame, y algunas de las lecciones que aprendí mientras me aproximaba a la realidad virtual por primera vez.

Primeros pasos con A-Frame

Me encontré con A-Frame buscando un modo fácil de comenzar con el desarrollo de la realidad virtual. A-Frame me atrajo porque encaja naturalmente con los conceptos de desarrollo web a los que estoy acostumbrado. La capacidad de situar entidades dentro de una escena a traves de markup puro es extremadamente potente y ofrece una barrera muy baja de acceso. También ayuda que la Documentación de A-Frame sea clara y concisa – algo que es tan importante para mi porque un desarrollador opta a utilizar código de terceros/librerias.

Honestamente,me sorpendrió lo robusto que es A-Frame . La mayoría de los obstáculos a los que me tuve que enfrentar estaban relacionados con el reto específico del manejo de la realidad virtual.

Construcción de una Mazmorra

Cardboard Dungeon renderable area

Mazmorra de Cartón comenzó como una manera rápida de probar alguna de las características de A-Frame. En lugar de crear por adelantado una mazmorra completa, mi concepto fué tener un número fijo de habitaciones definiendo el area reproducible alrededor del jugador. Esas habitaciones pueden ser reproducidas basandose en datos del archivo JSON . Esto puede reducir el número de entidades dentro de DOM y proporciona una mazmorra extremadamente grande como yo deseaba, con muy poco o ningún impacto en el rendimiento.

Una habitación es sencilla y siempre está compuesta como máximo por cuatro paredes, un suelo, y un techo. Los datos JSON definen cuales de ellos deben ser reproducidos para cada habitación. También opté por un sencillo sistema de parrilla para definir la posición virtual de la habitación – con (0,0,0) siendo el punto de salida de los jugadores.

Inicialmente inyectaba nuevas entidades A-Frame cada vez que el jugador se ponía en movimiento. Sin embargo, hablando con el equipo A-Frame , señalé el componente “visibilidad” . Lo ubiqué inicializando la reproducción de cada espacio por adelantado alternando después el componente “visibilidad” para cada habitación cuando entra el jugador.

// LLamada una vez durante la inicialización de la escena.
Container.prototype.init = function () {
  var entity = document.createElement('a-entity');
  entity.className = 'top';
  entity.setAttribute('mixin','wall top');
  entity.setAttribute('visible', 'false');
  entity.setAttribute('position', {
    x: this.position_multipliers.x,
    y: (4 + this.position_multipliers.y),
    z: this.position_multipliers.z
  });
  document.getElementById(this.target).appendChild(entity);
  // …
};
// LLamada cuando el jugador inicia el movimiento.
Container.prototype.render = function () {
  // establece el componente `visibilidad` en las entidades de este contenedor.
  var container = document.getElementById(this.target);
  if (this.room) {
    setAttributeForClass(container, 'top', 'visible', (this.room.data.top ? this.room.data.top : 'false'));
    setAttributeForClass(container, 'bottom', 'visible', (this.room.data.bottom ? this.room.data.bottom : 'false'));
    setAttributeForClass(container, 'left', 'visible', (this.room.data.left ? this.room.data.left : 'false'));
    setAttributeForClass(container, 'right', 'visible', (this.room.data.right ? this.room.data.right : 'false'));
    setAttributeForClass(container, 'back', 'visible', (this.room.data.back ? this.room.data.back : 'false'));
    setAttributeForClass(container, 'front', 'visible', (this.room.data.front ? this.room.data.front : 'false'));
  }
  // …
};
function setAttributeForClass (parent, class_name, attribute, value) {
  var elements = parent.getElementsByClassName(class_name);
  for (var i = 0; i < elements.length; i++) {
    elements[i].setAttribute(attribute, value);
  }
}

Para comenzar, estuve reproduciendo un área de 3×3 alrededor del jugador pero la aumenté a 3×3×3 para permitir el recorrido oblicuo (transversal-vertical). también lo extendí a 2 cuadrículas en las direcciones norte, sur, este, y oeste para ayudar con la ilusión de la distancia.

SoftwareRVG commented 8 years ago

Construcción de una Mazmorra de cartón con A-Frame

Mazmorra de Cartón es una web basada en la experiencia de rastreo por mazmorras diseñada para su uso con Google Cardboard y escrita utilizando la estructura de realidad virtual de mozilla, A-Frame.

En este estudio, Voy a hablar de los principales desafíos a los que me enfrenté durante el desarrollo de Mazmorra de Cartón, mis experiencias con A-Frame, y algunas de las lecciones que aprendí mientras me aproximaba a la realidad virtual por primera vez.

Primeros pasos con A-Frame

Me encontré con A-Frame buscando un modo fácil de comenzar con el desarrollo de la realidad virtual. A-Frame me atrajo porque encaja naturalmente con los conceptos de desarrollo web a los que estoy acostumbrado. La capacidad de situar entidades dentro de una escena a traves de markup puro es extremadamente potente y ofrece una barrera muy baja de acceso. También ayuda que la Documentación de A-Frame sea clara y concisa – algo que es tan importante para mi porque un desarrollador opta a utilizar código de terceros/librerias.

Honestamente,me sorpendrió lo robusto que es A-Frame . La mayoría de los obstáculos a los que me tuve que enfrentar estaban relacionados con el reto específico del manejo de la realidad virtual.

Construcción de una Mazmorra

Cardboard Dungeon renderable area

Mazmorra de Cartón comenzó como una manera rápida de probar alguna de las características de A-Frame. En lugar de crear por adelantado una mazmorra completa, mi concepto fué tener un número fijo de habitaciones definiendo el area reproducible alrededor del jugador. Esas habitaciones pueden ser reproducidas basandose en datos del archivo JSON . Esto puede reducir el número de entidades dentro de DOM y proporciona una mazmorra extremadamente grande como yo deseaba, con muy poco o ningún impacto en el rendimiento.

Una habitación es sencilla y siempre está compuesta como máximo por cuatro paredes, un suelo, y un techo. Los datos JSON definen cuales de ellos deben ser reproducidos para cada habitación. También opté por un sencillo sistema de parrilla para definir la posición virtual de la habitación – con (0,0,0) siendo el punto de salida de los jugadores.

Inicialmente inyectaba nuevas entidades A-Frame cada vez que el jugador se ponía en movimiento. Sin embargo, hablando con el equipo A-Frame , señalé el componente “visibilidad” . Lo ubiqué inicializando la reproducción de cada espacio por adelantado alternando después el componente “visibilidad” para cada habitación cuando entra el jugador.

// LLamada una vez durante la inicialización de la escena.
Container.prototype.init = function () {
  var entity = document.createElement('a-entity');
  entity.className = 'top';
  entity.setAttribute('mixin','wall top');
  entity.setAttribute('visible', 'false');
  entity.setAttribute('position', {
    x: this.position_multipliers.x,
    y: (4 + this.position_multipliers.y),
    z: this.position_multipliers.z
  });
  document.getElementById(this.target).appendChild(entity);
  // …
};
// LLamada cuando el jugador inicia el movimiento.
Container.prototype.render = function () {
  // establece el componente `visibilidad` en las entidades de este contenedor.
  var container = document.getElementById(this.target);
  if (this.room) {
    setAttributeForClass(container, 'top', 'visible', (this.room.data.top ? this.room.data.top : 'false'));
    setAttributeForClass(container, 'bottom', 'visible', (this.room.data.bottom ? this.room.data.bottom : 'false'));
    setAttributeForClass(container, 'left', 'visible', (this.room.data.left ? this.room.data.left : 'false'));
    setAttributeForClass(container, 'right', 'visible', (this.room.data.right ? this.room.data.right : 'false'));
    setAttributeForClass(container, 'back', 'visible', (this.room.data.back ? this.room.data.back : 'false'));
    setAttributeForClass(container, 'front', 'visible', (this.room.data.front ? this.room.data.front : 'false'));
  }
  // …
};
function setAttributeForClass (parent, class_name, attribute, value) {
  var elements = parent.getElementsByClassName(class_name);
  for (var i = 0; i < elements.length; i++) {
    elements[i].setAttribute(attribute, value);
  }
}

Para comenzar, estuve reproduciendo un área de 3×3 alrededor del jugador pero la aumenté a 3×3×3 para permitir el recorrido oblicuo (transversal-vertical). también lo extendí a 2 cuadrículas en las direcciones norte, sur, este, y oeste para ayudar con la ilusión de la distancia.

VR lección # 1 : Escala

Escalar en la pantalla no es igual que en un dispositivo VR para la cabeza. En una pantalla las alturas pueden verse bien , pero un dispositivo VR amarrado a la cabeza puede alterar drásticamente la percepción de la escala. Esto todavía está presente sutílmente en Mazmorra de Cartón , especialmente cuando se atraviesa verticálmente, debido a que las paredes pueden parecer más altas de lo previsto. Esto fué importante para poner a prueba con frecuencia experiencias en el dispositivo VR.

Transversal

Cardboard Dungeon Traversal

El plano transversal fué una de las primeras cosas que necesité resolver. Como todas las cosas en VR, requirió de una iteración substancial.

Inicialmente utilizé cuadriculas sobre el suelo (N, E, S, O) para activar el movimiento del jugador. esto funcionó bien, y entonces insistí sobre esto para proporcionar controles adicionales para el recorrido vertical transversal. Hize ese contexto sensitivo para que la opción vertical transversal apareciera unicamente cuando fuera necesario. Sin embargo, estó funcionó en muchas de las vistas que lo rodean y el jugador depende de esto para reconocer los controles.

SoftwareRVG commented 8 years ago

Construcción de una Mazmorra de cartón con A-Frame

Mazmorra de Cartón es una web basada en la experiencia de rastreo por mazmorras diseñada para su uso con Google Cardboard y escrita utilizando la estructura de realidad virtual de mozilla, A-Frame.

En este estudio, Voy a hablar de los principales desafíos a los que me enfrenté durante el desarrollo de Mazmorra de Cartón, mis experiencias con A-Frame, y algunas de las lecciones que aprendí mientras me aproximaba a la realidad virtual por primera vez.

Primeros pasos con A-Frame

Me encontré con A-Frame buscando un modo fácil de comenzar con el desarrollo de la realidad virtual. A-Frame me atrajo porque encaja naturalmente con los conceptos de desarrollo web a los que estoy acostumbrado. La capacidad de situar entidades dentro de una escena a traves de markup puro es extremadamente potente y ofrece una barrera muy baja de acceso. También ayuda que la Documentación de A-Frame sea clara y concisa – algo que es tan importante para mi porque un desarrollador opta a utilizar código de terceros/librerias.

Honestamente,me sorpendrió lo robusto que es A-Frame . La mayoría de los obstáculos a los que me tuve que enfrentar estaban relacionados con el reto específico del manejo de la realidad virtual.

Construcción de una Mazmorra

Cardboard Dungeon renderable area

Mazmorra de Cartón comenzó como una manera rápida de probar alguna de las características de A-Frame. En lugar de crear por adelantado una mazmorra completa, mi concepto fué tener un número fijo de habitaciones definiendo el area reproducible alrededor del jugador. Esas habitaciones pueden ser reproducidas basandose en datos del archivo JSON . Esto puede reducir el número de entidades dentro de DOM y proporciona una mazmorra extremadamente grande como yo deseaba, con muy poco o ningún impacto en el rendimiento.

Una habitación es sencilla y siempre está compuesta como máximo por cuatro paredes, un suelo, y un techo. Los datos JSON definen cuales de ellos deben ser reproducidos para cada habitación. También opté por un sencillo sistema de parrilla para definir la posición virtual de la habitación – con (0,0,0) siendo el punto de salida de los jugadores.

Inicialmente inyectaba nuevas entidades A-Frame cada vez que el jugador se ponía en movimiento. Sin embargo, hablando con el equipo A-Frame , señalé el componente “visibilidad” . Lo ubiqué inicializando la reproducción de cada espacio por adelantado alternando después el componente “visibilidad” para cada habitación cuando entra el jugador.

// LLamada una vez durante la inicialización de la escena.
Container.prototype.init = function () {
  var entity = document.createElement('a-entity');
  entity.className = 'top';
  entity.setAttribute('mixin','wall top');
  entity.setAttribute('visible', 'false');
  entity.setAttribute('position', {
    x: this.position_multipliers.x,
    y: (4 + this.position_multipliers.y),
    z: this.position_multipliers.z
  });
  document.getElementById(this.target).appendChild(entity);
  // …
};
// LLamada cuando el jugador inicia el movimiento.
Container.prototype.render = function () {
  // establece el componente `visibilidad` en las entidades de este contenedor.
  var container = document.getElementById(this.target);
  if (this.room) {
    setAttributeForClass(container, 'top', 'visible', (this.room.data.top ? this.room.data.top : 'false'));
    setAttributeForClass(container, 'bottom', 'visible', (this.room.data.bottom ? this.room.data.bottom : 'false'));
    setAttributeForClass(container, 'left', 'visible', (this.room.data.left ? this.room.data.left : 'false'));
    setAttributeForClass(container, 'right', 'visible', (this.room.data.right ? this.room.data.right : 'false'));
    setAttributeForClass(container, 'back', 'visible', (this.room.data.back ? this.room.data.back : 'false'));
    setAttributeForClass(container, 'front', 'visible', (this.room.data.front ? this.room.data.front : 'false'));
  }
  // …
};
function setAttributeForClass (parent, class_name, attribute, value) {
  var elements = parent.getElementsByClassName(class_name);
  for (var i = 0; i < elements.length; i++) {
    elements[i].setAttribute(attribute, value);
  } 
}

Para comenzar, estuve reproduciendo un área de 3×3 alrededor del jugador pero la aumenté a 3×3×3 para permitir el recorrido oblicuo (transversal-vertical). también lo extendí a 2 cuadrículas en las direcciones norte, sur, este, y oeste para ayudar con la ilusión de la distancia.

VR lección # 1: Escala

Escalar en la pantalla no es igual que en un dispositivo VR para la cabeza. En una pantalla las alturas pueden verse bien , pero un dispositivo VR amarrado a la cabeza puede alterar drásticamente la percepción de la escala. Esto todavía está presente sutílmente en Mazmorra de Cartón , especialmente cuando se atraviesa verticálmente, debido a que las paredes pueden parecer más altas de lo previsto. Esto fué importante para poner a prueba con frecuencia experiencias en el dispositivo VR.

Transversal

Cardboard Dungeon Traversal

El plano transversal fué una de las primeras cosas que necesité resolver. Como todas las cosas en VR, requirió de una iteración substancial.

Inicialmente utilizé cuadriculas sobre el suelo (N, E, S, O) para activar el movimiento del jugador. esto funcionó bien, y entonces insistí sobre esto para proporcionar controles adicionales para el recorrido vertical transversal. Hize ese contexto sensitivo para que la opción vertical transversal apareciera unicamente cuando fuera necesario. Sin embargo, estó funcionó en muchas de las vistas que lo rodean y el jugador depende de esto para reconocer los controles.

VR lección # 2: Esfuerzo

Situar interacciones comunes fuera de la mirada de los jugadores crea una incómoda experiencia. Tener que mirar al suelo con el objeto de activar el movimiento implica constantemente mover la cabeza hacia adelante y hacia atras. Situando esta interacción cercana a la posicion de mirada de descanso de los jugadores se crea una experiencia mucho mas confortable.

Mi solución final fue por lo tanto utilizar un teletransporte mecánico. El jugador simplemente mira a una esfera azul para moverse a ese lugar, independientemente de que la habitación este en un piso más alto o más bajo. Opté por limitar esto a una mazmorra cuadrada alrededor del jugador con objeto de retener la sensación de exploración.

function move (dom_element) {
  // Recuperar las identidades de las habitaciones actuales y de destino.
  var current_room_key_array = containers.center.room_id.split(',');
  var container_key = dom_element.parentElement.getAttribute('id');
  var target_room_key_array = containers[container_key].room_id.split(',');
  // Calcular las compensaciones.
  var offset_x = parseInt(target_room_key_array[0], 10) - parseInt(current_room_key_array[0], 10);
  var offset_y = parseInt(target_room_key_array[1], 10) - parseInt(current_room_key_array[1], 10);
  var offset_z = parseInt(target_room_key_array[2], 10) - parseInt(current_room_key_array[2], 10);
  // Aplicar a cada habitación.
  Object.keys(containers).forEach(function (key) {
    var container = containers[key];
    var room_key_array = container.room_id.split(',');
    room_key_array[0] = parseInt(room_key_array[0], 10) + offset_x;
    room_key_array[1] = parseInt(room_key_array[1], 10) + offset_y;
    room_key_array[2] = parseInt(room_key_array[2], 10) + offset_z;
    var new_room_key = room_key_array.join(',');
    if (map[new_room_key]) {
      container.room = new Room(map[new_room_key].data);
      container.room_id = new_room_key;
      // Eliminar todos los datos existentes de elementos.
      container.removeItems();
      // Añadir elementos si estos esixten en los datos de la nueva habitación.
      if (map[new_room_key].item) {
        container.addItem(map[new_room_key].item);
      }
      container.render();
    } else {
      container.room = null;
      container.room_id = new_room_key;
      // Eliminar cualquier dato de elementos esixtentes.
      container.removeItems();
      container.render();
    }
  });
}

Inventario e interacción

Cardboard Dungeon Inventory

El inventario y la interacción llevaron el mayor esfuerzo e iteración para crear algo funcional. Experimenté con muchas ideas salvajes , como reducir al jugador en una caja de inventario a sus pies o teletransportarlo a una habitación inventario separada .

Mientras te diviertes, esos prototipos destacan el tema de la conveniencia dentro de la realidad virtual. Los conceptos pueden ser divertidos para explorar como experiencias iniciales, pero las mecánicas poco familiares pueden convertirse en un inconveniente y volverse finalmente irritantes.

VR lección # 3: Movimiento automatizado

Tomar el control del jugador crea una mala experiencia. En el caso de Mazmorra de cartón, la mencionada reducción mecánica tenía una animación que escalaba la cámara y movia esta a una caja a los pies del jugador. Esto rapidamente generó una sensación de nausea porque el jugador no tiene control sobre la animación; es una acción poco natural.

Al final, establecí el método mas conveniente de interacción para el jugador. Esto fué sencillamente una cuadrícula de elementos a los pies del jugador . Colocando los elementos situados en la mazmorra en una cuadrícula desde la cual los elementos pueden ser sencillamente seleccionados. Algunas veces , la solución más sencilla proporciona la mejor experiencia.

SoftwareRVG commented 8 years ago

Hola JVillalobos. Aquí os dejo un enlace abierto de Google Docks, con el último artículo de Hacks que he traducido. Voy a echar un vistazo a ver lo que teneis por el waffle, y te pediré que me asignes otro articulo.

Saludos a todos, comunidad. Rober Villar

Enlace de Google Docks con la traducción del artículo. ( Nota: lo paso a revisión )

https://docs.google.com/document/d/1d5DzQzU34L4CT8LoZsS4yxj5eavjXfZXoLV43nIWhXU/edit?usp=sharing


Construcción de una Mazmorra de cartón con A-Frame

Mazmorra de Cartón es una web basada en la experiencia de rastreo por mazmorras diseñada para su uso con Google Cardboard y escrita utilizando la estructura de realidad virtual de mozilla, A-Frame.

En este estudio, Voy a hablar de los principales desafíos a los que me enfrenté durante el desarrollo de Mazmorra de Cartón, mis experiencias con A-Frame, y algunas de las lecciones que aprendí mientras me aproximaba a la realidad virtual por primera vez.

Primeros pasos con A-Frame

Me encontré con A-Frame buscando un modo fácil de comenzar con el desarrollo de la realidad virtual. A-Frame me atrajo porque encaja naturalmente con los conceptos de desarrollo web a los que estoy acostumbrado. La capacidad de situar entidades dentro de una escena a traves de markup puro es extremadamente potente y ofrece una barrera muy baja de acceso. También ayuda que la Documentación de A-Frame sea clara y concisa – algo que es tan importante para mi porque un desarrollador opta a utilizar código de terceros/librerias.

Honestamente,me sorpendrió lo robusto que es A-Frame . La mayoría de los obstáculos a los que me tuve que enfrentar estaban relacionados con el reto específico del manejo de la realidad virtual.

Construcción de una Mazmorra

Cardboard Dungeon renderable area

Mazmorra de Cartón comenzó como una manera rápida de probar alguna de las características de A-Frame. En lugar de crear por adelantado una mazmorra completa, mi concepto fué tener un número fijo de habitaciones definiendo el area reproducible alrededor del jugador. Esas habitaciones pueden ser reproducidas basandose en datos del archivo JSON . Esto puede reducir el número de entidades dentro de DOM y proporciona una mazmorra extremadamente grande , como yo deseaba, con muy poco o ningún impacto en el rendimiento.

Una habitación es sencilla y siempre está compuesta como máximo por cuatro paredes, un suelo, y un techo. Los datos JSON definen cuales de ellos deben ser reproducidos para cada habitación. También opté por un sencillo sistema de parrilla para definir la posición virtual de la habitación – con (0,0,0) siendo el punto de salida de los jugadores.

Inicialmente inyectaba nuevas entidades A-Frame cada vez que el jugador se ponía en movimiento. Sin embargo, hablando con el equipo A-Frame , señalé el componente “visibilidad” . Lo ubiqué inicializando la reproducción de cada espacio por adelantado alternando después el componente “visibilidad” para cada habitación cuando entra el jugador.

// LLamada una vez durante la inicialización de la escena.
Container.prototype.init = function () {
  var entity = document.createElement('a-entity');
  entity.className = 'top';
  entity.setAttribute('mixin','wall top');
  entity.setAttribute('visible', 'false');
  entity.setAttribute('position', {
    x: this.position_multipliers.x,
    y: (4 + this.position_multipliers.y),
    z: this.position_multipliers.z
  });
  document.getElementById(this.target).appendChild(entity);
  // …
};
// LLamada cuando el jugador inicia el movimiento.
Container.prototype.render = function () {
  // establece el componente `visibilidad` en las entidades de este contenedor.
  var container = document.getElementById(this.target);
  if (this.room) {
    setAttributeForClass(container, 'top', 'visible', (this.room.data.top ? this.room.data.top : 'false'));
    setAttributeForClass(container, 'bottom', 'visible', (this.room.data.bottom ? this.room.data.bottom : 'false'));
    setAttributeForClass(container, 'left', 'visible', (this.room.data.left ? this.room.data.left : 'false'));
    setAttributeForClass(container, 'right', 'visible', (this.room.data.right ? this.room.data.right : 'false'));
    setAttributeForClass(container, 'back', 'visible', (this.room.data.back ? this.room.data.back : 'false'));
    setAttributeForClass(container, 'front', 'visible', (this.room.data.front ? this.room.data.front : 'false'));
  }
  // …
};
function setAttributeForClass (parent, class_name, attribute, value) {
  var elements = parent.getElementsByClassName(class_name);
  for (var i = 0; i < elements.length; i++) {
    elements[i].setAttribute(attribute, value);
  } 
}

Para comenzar, estuve reproduciendo un área de 3×3 alrededor del jugador pero la aumenté a 3×3×3 para permitir el recorrido oblicuo (transversal-vertical). también lo extendí a 2 cuadrículas en las direcciones norte, sur, este, y oeste para ayudar con la ilusión de la distancia.

VR lección # 1: Escala

Escalar en la pantalla no es igual que en un dispositivo VR para la cabeza. En una pantalla las alturas pueden verse bien , pero un dispositivo VR amarrado a la cabeza puede alterar drásticamente la percepción de la escala. Esto todavía está presente sutílmente en Mazmorra de Cartón , especialmente cuando se atraviesa verticálmente, debido a que las paredes pueden parecer más altas de lo previsto. Esto fué importante para poner a prueba con frecuencia experiencias en el dispositivo VR.

Transversal

Cardboard Dungeon Traversal

El plano transversal fué una de las primeras cosas que necesité resolver. Como todas las cosas en VR, requirió de una iteración substancial.

Inicialmente utilizé cuadriculas sobre el suelo (N, E, S, O) para activar el movimiento del jugador. Esto funcionó bien, y entonces insistí sobre esto para proporcionar controles adicionales para el recorrido vertical transversal. Hize ese contexto sensitivo para que la opción vertical transversal apareciera unicamente cuando fuera necesario. Sin embargo, estó funcionó en muchas de las vistas que lo rodean y el jugador depende de esto para reconocer los controles.

VR lección # 2: Esfuerzo

Situar interacciones comunes fuera de la mirada de los jugadores crea una incómoda experiencia. Tener que mirar al suelo con el objeto de activar el movimiento implica constantemente mover la cabeza hacia adelante y hacia atras. Situando esta interacción cercana a la posicion de mirada de descanso de los jugadores se crea una experiencia mucho mas confortable.

Mi solución final fue por lo tanto utilizar un teletransporte mecánico. El jugador simplemente mira a una esfera azul para moverse a ese lugar, independientemente de que la habitación este en un piso más alto o más bajo. Opté por limitar esto a una mazmorra cuadrada alrededor del jugador con objeto de retener la sensación de exploración.

function move (dom_element) {
  // Recuperar las identidades de las habitaciones actuales y de destino.
  var current_room_key_array = containers.center.room_id.split(',');
  var container_key = dom_element.parentElement.getAttribute('id');
  var target_room_key_array = containers[container_key].room_id.split(',');
  // Calcular las compensaciones.
  var offset_x = parseInt(target_room_key_array[0], 10) - parseInt(current_room_key_array[0], 10);
  var offset_y = parseInt(target_room_key_array[1], 10) - parseInt(current_room_key_array[1], 10);
  var offset_z = parseInt(target_room_key_array[2], 10) - parseInt(current_room_key_array[2], 10);
  // Aplicar a cada habitación.
  Object.keys(containers).forEach(function (key) {
    var container = containers[key];
    var room_key_array = container.room_id.split(',');
    room_key_array[0] = parseInt(room_key_array[0], 10) + offset_x;
    room_key_array[1] = parseInt(room_key_array[1], 10) + offset_y;
    room_key_array[2] = parseInt(room_key_array[2], 10) + offset_z;
    var new_room_key = room_key_array.join(',');
    if (map[new_room_key]) {
      container.room = new Room(map[new_room_key].data);
      container.room_id = new_room_key;
      // Eliminar todos los datos existentes de elementos.
      container.removeItems();
      // Añadir elementos si estos esixten en los datos de la nueva habitación.
      if (map[new_room_key].item) {
        container.addItem(map[new_room_key].item);
      }
      container.render();
    } else {
      container.room = null;
      container.room_id = new_room_key;
      // Eliminar cualquier dato de elementos esixtentes.
      container.removeItems();
      container.render();
    }
  });
}

Inventario e interacción

Cardboard Dungeon Inventory

El inventario y la interacción llevaron el mayor esfuerzo e iteración para crear algo funcional. Experimenté con muchas ideas salvajes , como reducir al jugador en una caja de inventario a sus pies o teletransportarlo a una habitación inventario separada .

Mientras te diviertes, esos prototipos destacan el tema de la conveniencia dentro de la realidad virtual. Los conceptos pueden ser divertidos para explorar como experiencias iniciales, pero las mecánicas poco familiares pueden convertirse en un inconveniente y volverse finalmente irritantes.

VR lección # 3: Movimiento automatizado

Tomar el control del jugador crea una mala experiencia. En el caso de Mazmorra de cartón, la mencionada reducción mecánica tenía una animación que escalaba la cámara y movia esta a una caja a los pies del jugador. Esto rapidamente generó una sensación de nausea porque el jugador no tiene control sobre la animación; es una acción poco natural.

Al final, establecí el método mas conveniente de interacción para el jugador. Esto fué sencillamente una cuadrícula de elementos a los pies del jugador . Colocando los elementos situados en la mazmorra en una cuadrícula desde la cual los elementos pueden ser sencillamente seleccionados. Algunas veces , la solución más sencilla proporciona la mejor experiencia.

Conclusión

Disfruté muchísimo utilizando A-Frame para crear mi juego. Es una poderosa estructura, y creo que es una excelente herramienta de prototipado rápido, ademas de ser una útil herramienta productiva por derecho propio.

Me preocupaba que la realidad virtual basada en la web pudiera sufrir problemas de rendimiento, pero quedé complacido al observar que este no era el caso. El tamaño de las texturas causó el principal problema de rendimiento, porque introdujeron vibraciones y causaron un notable impacto en la latencia.

Lo mejor en A-Frame es la posibilidad de crear tus propios componentes para aumentar las entidades y componentes ya existentes. No he tenido la oportunidad de experimentar demasiado con este concepto, pero obviamente ,este es el siguiente paso para mejorar la experiencia en Mazmorra de cartón.

Un apunte final, el equipo A-Frame y la comunidad son una delicia . Su Grupo estable es muy activo, y los miembros del equipo son extraordinariamente entusiastas.

Espero que esto de una vision del reto al que tuve que hacer frente cuando construí Mazmorra de Cartón. La realidad virtual es una frontera bastante nueva, y por lo tanto, las respuestas son pocas, con muchas lecciones todavía por aprender. Es un excitante espacio por explorar, y estructuras como A-Frame están ayudando a hacer la realidad virtual más accessible a los desarrolladores web que quieren explorar esta nueva frontera.

Puedes jugar en mazmorra de Cartón aquí (recomendamos las gafas de cartón google) y el código fuente completo, está disponible en GitHub.

Gracias por leeerlo.

Acerca de Christopher Waite

Christopher Waite es el director técnico de una agencia de desarrollo web en London y Suffolk, UK. Crea juegos en su tiempo libre.

```

Más artículos de Christopher Waite…

```
``` ```
``` ``` ![fireshot screen capture 116 - building cardboard dungeon with a-frame mozilla hacks the web developer blog - _c__users_robervillargarcia_deskto](https://cloud.githubusercontent.com/assets/15747545/16508693/f57e9850-3f35-11e6-9913-6742f54dc656.png)
jvillalobos commented 8 years ago

Publicado: https://www.mozilla-hispano.org/construir-cardboard-dungeon-con-a-frame/

Gracias!