Semana 9. A-frame
Nos adentramos en la novena semana del blog. Los retos indicados son:
Malla de colisión
Determinar la fluidez de las físicas
TFM Pablo Moreno
Malla de colision
Respecto a la malla de colisión no logro encontrar información clara sobre como crearla para un modelo 3D que será exportado a A-frame. En los siguientes videos podemos observar como la colisión existe en Blender, pero no en Aframe.
La búsqueda de información sobre el presente tema es complicado, ya que los foros estan en su mayoría sin responder. Por otro lado, tras preguntar a diversas personas familiarizadas con A-frame y Blender he llegado a la conclusión de que por ahora el uso de mallas de colisión con formas geometricas básicas es lo ideal, ya las podemos adaptar a nuestras entidades lo máximo posible, obteniendo un buen resultado de forma sencilla.
Determinar la fluidez de las físicas
Algunas de las preguntas que buscamos responder son las siguientes:
¿Cada cuanto tiempo envía NAF información al esclavo?
¿Podría enviarse únicamente información, desde el maestro al esclavo, cuando se dan cambios en la escena?
Pero antes de adentarnos en las preguntas anteriores hemos de determinar la fluidez entre maestro y esclavo. Para ello se ha de crear una escena en la que cada ‘x’ segundos nuestra progatonista, la esfera, vuelva a la posición inicial, pero puede que esto no sea tan sencillo como parece.
Observaciones:
-
Una vez que las físicas han sido establecidas en la escena no podemos modificar la posición de la entidad afectada. Por tanto, para poder modificar la posición de nuestra entidad hemos de eliminar los atributos relacionados con las físicas para luego ponerselos de nuevo.
if (name == " ") { if (individual == "true") { setInterval(function(){ this.sphere.removeAttribute('ammo-body'); this.sphere.removeAttribute('ammo-shape'); this.sphere.setAttribute('position',{ x: 0, y: 5, z: -20 }); this.sphere.setAttribute('ammo-body', { type: 'dynamic', emitCollisionEvents: true }); this.sphere.setAttribute('ammo-shape',{ type: 'sphere' }); NAF.utils.takeOwnership(this.sphere); },4000); this.floor.setAttribute('ammo-body',{ type: 'static' }); this.floor.setAttribute('ammo-shape',{ type: 'box' }); NAF.utils.takeOwnership(this.floor); } }
-
Podemos modificar la precisión de la posición a la hora de enviar datos al esclavo.
Optimización de la sincronización de los componentes
Puntos clave del enlace anterior:
La función requiresNetworkUpdate tomo la posición actual y la anterior, por tanto, si no son iguales se devolvera true y se enviará al esclavo.
Por defecto se usa una función que compara el valor actual y el anterior, por ello, siempre que no sean iguales se dará una modificación.
Se ha de tener en cuenta que puede tomar más de 1ms si la escena es pesada y podrían tirarse ciertos frames.
Para enviar una menor cantidad de mensajes se pueden comparar las dos posiciones, pero determinando un margen. Esto se logra mediante la función NAF.utils.vectorRequiresUpdate.
Conclusión
- ¿Cada cuanto tiempo envía NAF información al esclavo?
Según la lectura anterior el maestro envía información cuando hay cambios e incluso para ahorrar mensajes puede determinarse un margen entre la posición actual y pasada. ¿Es esto cierto? En el ejemplo S021.html cada entidad tiene su propia precisión a la hora de enviar información al esclavo y como podemos observar se dan cambios en la fluidez del esclavo.
- ¿Podría enviarse únicamente información, desde el maestro al esclavo, cuando se dan cambios en la escena?
De nuevo, la lectura indica que solo se transmite la información cuando hay cambios. ¿Es esto cierto? En el ejemplo S021.html también podemos observar que los cambios de posición solo se envían cuando hay cambios e incluso si la precisión es baja los cambios se dan cada más tiempo.
Ejemplo S011.html
Ejemplo S021.html
En este ejemplo cada entidad tiene su propia precisión. El orden de mayor precisión a menor es:
caja > esfera > cilindro