3 minute read

Nos adentramos en la decimotercera semana del blog. Los retos indicados son:

Malla de colisión Ammo

Trastear con D1 de Kibotics

Malla de colisión Ammo

Tras pedir en diversos blogs información sobre la introducción de mallas complejas en modelos GLTF no he llegado a nada, ya que solo me ha contestado una persona y no me ha servido de mucha ayuda. Llegando de nuevo a un punto muerto he decidido releer la documentación de Ammo driver. Existe un componente denominado ammo-constraint que permite unir diferentes ammo-body mediante bisagras, distancias fijas o puntos de fijación. A continuación, voy a indicar descubrimientos de interés.

  • El siguiente código nos permite tener dos entidades dinámicas unidas, de forma fija, es decir, no pueden ser separadas. Como acabo de comentar ambas entidades son dinámicas, por tanto, no nos encontramos ante el problema anterior (ahora al golpear las entidades siempre se produce movimiento en las mismas). Aunque la existencia de ammo-constraint no evita el choque entre las entidades, por ello, hemos de continuar usando collisionFilterGroup: 1; collisionFilterMask: 2.

      <a-box id="other-box" material="color: blue" position="-2 0 -10" ammo-body="type: dynamic; 
      emitCollisionEvents: true;" ammo-shape />
      <a-box ammo-constraint="target: #other-box;" material="color: red" position="0 1 0" scale="0.5 0.5 0.5" ammo-body="type: dynamic; 
      emitCollisionEvents: true; emitCollisionEvents: true; collisionFilterGroup: 1; collisionFilterMask: 2" ammo-shape></a-box> 
    

En el siguiente video confirmamos el buen funcionamiento de dos entidades unidas.

En el siguiente video se ha extrapolado lo aprendido hasta ahora para ponerlo en nuestro modelo 3D.

    <!-- Coche -->
    <a-entity 
      id="other-box"
      gltf-model="#car"
      position="0 0 -10" 
      rotation="0 90 0"
      ammo-body="type: dynamic; 
      emitCollisionEvents: true; collisionFilterGroup: 1; collisionFilterMask: 2" 
      ammo-shape="type: box;fit: manual; halfExtents: 1.5 1 3.7; offset: 0 0 -0.3"
      />
    <a-entity
      geometry="primitive: box"
      material="opacity: 0"
      scale="2 2 3"
      position="0 1 -1"
      ammo-constraint="target: #other-box;"
      ammo-body="type: dynamic; emitCollisionEvents: true; collisionFilterGroup: 1; collisionFilterMask: 2" 
      ammo-shape="fit: all">
    </a-entity>

Ahora se han de introducir los avances en NAF. Es muy sencillo, solo hemos de añadir los cambios en templates.

    <a-asset-item id="car" src="own_asset/car.glb"></a-asset-item>

    <template id="box-template">
      <a-entity 
      id="other-box"
      class="raycastable" 
      gltf-model="#car"
      scale="0.5 0.5 0.5"
      position="0 2 -10" 
      rotation="0 90 0"
      ammo-body="type: dynamic; emitCollisionEvents: true; collisionFilterGroup: 1; collisionFilterMask: 2" 
      ammo-shape="type: box;fit: manual; halfExtents: 0.75 0.5 1.85; offset: 0 0 -0.3"
      />
      <a-entity
        geometry="primitive: box"
        material="opacity: 0"
        scale="2 2 3"
        position="0 1 -1"
        ammo-constraint="target: #other-box;"
        ammo-body="type: dynamic; emitCollisionEvents: true; collisionFilterGroup: 1; collisionFilterMask: 2" 
        ammo-shape="fit: all">
      </a-entity>
    </template>

Trastear con D1 de Kibotics

Antes de comenzar con la compresión del código existente se ha de tener en cuenta que tanto Ammo como Cannon funcionan correctamente en la versión 1.1.0 de Aframe.

Por otro lado, la carpeta build aparece una vez hemos realizado npm install, npm run build, npm run start.

Acciones:

  1. Modificar versión. 1.1.0 (Cannon) -> 1.2.0 (Ammo) -> 1.3.0 (Ammo)

Para modificar la versión hemos de modificar en package.json su valor y borrar las carpetas: node_modules + build + package-lock.json.

1.1.0 ☑ 1.2.0 ☑ No funcionan las físicas 1.3.0 ☑ No carga la escena

Nota: Aún usando este método para poner la última versión de aframe (repositorio ammo) se siguen dando los mismos problemas.

La versión 1.3.0 en Cannon da lugar a errores, ya que la escena no carga. ¿Sale algo en la consola? Si, salen errores que no comprendo.

  1. Introducir Ammo en la versión 1.1.0

Tras intentar comprender el código he llegado a la conclusión de lo siguiente:

  • JavaScript-Editor -> Contiene la página web principal
  • Assets/Config -> Dentro de simcore existe un parser que lee los elementos y crea la escena
  • Simcore/Config -> config_paser (encargado de analizar el fichero de configuración y de crear la escena) + camaras

Por tanto, teniendo lo anterior en cuenta puedo llegar a la conclusión de que es necesario modificar el fichero config_parser, ya que el error se da debido a driver: ammo.