ammo.js btBvhTriangle Mesh Colindro de forma que no funciona

Estoy tratando de hacer un colisionador de cuerpo rígido estático de los datos del vértice de un modelo de gltf y no puedo conseguir que funcione. Sólo uso este colider de malla para el suelo, pero todos los otros objetos sólo brillan por un segundo y luego caen trough. Si cambio el btBvhTriangleMeshShape a un btBoxShape funciona perfectamente, pero me gustaría tener la opción de añadir elementos no de caja a mi mapa de juego. ¿Hay una mejor alternativa al btBvhTriangleMeshShape?

const indexOffset =
    model.mesh.primitives[0].indices.bufferView.byteOffset / 2;
const indexLength =
    model.mesh.primitives[0].indices.bufferView.byteLength / 2;
const index = new Uint16Array(
    model.mesh.primitives[0].indices.bufferView.buffer
);

const position = new Float32Array(
    model.mesh.primitives[0].attributes.POSITION.bufferView.buffer
);

const positionOffset =
    model.mesh.primitives[0].attributes.POSITION.bufferView
    .byteOffset / 4;
const positionLength =
    model.mesh.primitives[0].attributes.POSITION.bufferView
    .byteLength / 4;

this.trimesh = new Ammo.btTriangleMesh();
for (let i = 0; i < indexLength; i += 3) {
    let j = 0;
    const vertexes = [];
    while (j < 3) {
        let ind = index[indexOffset + i + j] * 3;
        vertexes.push(
            Ammo.btVector3(
                position[positionOffset + ind],
                position[positionOffset + ind + 1],
                position[positionOffset + ind + 2]
            )
        );
        j++;
    }
    this.trimesh.addTriangle(vertexes[0], vertexes[1], vertexes[2]);
}

this.geometry = new Ammo.btBvhTriangleMeshShape(
    this.trimesh,
    true
);

this.transform = new Ammo.btTransform();
this.transform.setIdentity();
this.transform.setOrigin(
    new Ammo.btVector3(
        this.model.translation[0],
        this.model.translation[1],
        this.model.translation[2]
    )
);

this.transform.setRotation(
    new Ammo.btQuaternion(
        this.model.rotation[0],
        this.model.rotation[1],
        this.model.rotation[2],
        this.model.rotation[3]
    )
);

this.motionState = new Ammo.btDefaultMotionState(this.transform);
this.localInertia = new Ammo.btVector3(0, 0, 0);
this.geometry.calculateLocalInertia(this.mass, this.localInertia);
this.rbInfo = new Ammo.btRigidBodyConstructionInfo(
    this.mass,
    this.motionState,
    this.geometry,
    this.localInertia
);
this.body = new Ammo.btRigidBody(this.rbInfo);
this.body.setFriction(this.friction);

physicsWorld.addRigidBody(this.body);

Pregunta hecha hace 3 años, 4 meses, 26 días - Por byteexplorer


2 Respuestas:

  • El problema que estás experimentando puede estar relacionado con la forma en que estás configurando y usando el colisionador btBvhTriangleMeshShape en Ammo.js. Aquí hay algunas posibles soluciones y mejoras que puedes probar:

    • Verificar la orientación de los triángulos: Asegúrate de que los triángulos que estás agregando al btTriangleMesh estén en el orden correcto (es decir, en el sentido contrario a las agujas del reloj cuando se mira desde arriba). La orientación incorrecta de los triángulos puede provocar problemas de detección de colisiones.
    • Posible error en la creación de btVector3: Reemplaza `Ammo.btVector3` con `new Ammo.btVector3` al crear instancias de vectores tridimensionales en el bucle donde agregas los vértices de los triángulos. Por ejemplo, cambia `Ammo.btVector3` por `new Ammo.btVector3`.
    • Revisar el cálculo de offset e índices: Asegúrate de que estás calculando los índices y offset correctamente al acceder a los datos del modelo glTF para los índices y posiciones de los vértices.
    • Considerar otros tipos de colisionadores: Si sigues teniendo problemas con btBvhTriangleMeshShape, puedes probar otros tipos de colisionadores en Ammo.js como btConvexHullShape o btCompoundShape dependiendo de la forma de los objetos que deseas colisionar.
    • Depuración con console.log: Para identificar posibles errores más fácilmente, puedes agregar console.log en diferentes partes de tu código para imprimir los valores de las variables y asegurarte de que tienen los valores esperados.

    Espero que estas sugerencias te ayuden a solucionar el problema con el colisionador de malla triangular en tu código. ¡Si necesitas más ayuda, no dudes en consultarme!

    Respondida el Dec 20, 2020 a las 16:45 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • .

    Respondida el Dec 20, 2020 a las 16:47 - por Gemini

    Votos positivos: 0 | Votos negativos: 0