Search code examples
three.jsammo.js

Full Hull Shape of BufferGeometry


I'm trying to create a "Ammo Shape" for my BufferGeometry with ammo.js. I'm using "Ammo.btConvexHullShape", but the object is closed. Can you help me please?

https://cotosystem.com.br/fechado.png "Original"

https://cotosystem.com.br/shape.png "Closed"

function criarConvexHullPhysicsShape(geometry) {
    var coords = geometry.attributes.position.array;
    var tempBtVec3_1 = new Ammo.btVector3(0, 0, 0);
    var shape = new Ammo.btConvexHullShape();
    for (var i = 0, il = coords.length; i < il; i+= 3) {
        tempBtVec3_1.setValue(coords[i], coords[i + 1], coords[i + 2]);
        var lastOne = (i >= (il - 3));
        shape.addPoint(tempBtVec3_1, lastOne);
    }
    return shape;
}

EDITED: I found this solution my friend, thanks Mugen!

function createTriangleShapeByGeometry(geometry) {
    var mesh = new Ammo.btTriangleMesh(true, true);
    var vertices = geometry.vertices;
    for (var i = 0; i < geometry.faces.length; i++) {
        var face = geometry.faces[i];
        if (face instanceof THREE.Face3) {
            mesh.addTriangle(
                new Ammo.btVector3(vertices[face.a].x, vertices[face.a].y, vertices[face.a].z),
                new Ammo.btVector3(vertices[face.b].x, vertices[face.b].y, vertices[face.b].z),
                new Ammo.btVector3(vertices[face.c].x, vertices[face.c].y, vertices[face.c].z),
                false
            );
        } else if (face instanceof THREE.Face4) {
            mesh.addTriangle(
                new Ammo.btVector3(vertices[face.a].x, vertices[face.a].y, vertices[face.a].z),
                new Ammo.btVector3(vertices[face.b].x, vertices[face.b].y, vertices[face.b].z),
                new Ammo.btVector3(vertices[face.d].x, vertices[face.d].y, vertices[face.d].z),
                false
            );
            mesh.addTriangle(
                new Ammo.btVector3(vertices[face.b].x, vertices[face.b].y, vertices[face.b].z),
                new Ammo.btVector3(vertices[face.c].x, vertices[face.c].y, vertices[face.c].z),
                new Ammo.btVector3(vertices[face.d].x, vertices[face.d].y, vertices[face.d].z),
                false
            );
        }
    }
    var shape = new Ammo.btBvhTriangleMeshShape(mesh, true, true);
    return shape;
}

Solution

  • Like any other bounding volume, a convex hull is always closed. So I'm afraid what you are looking for is not possible.