I’m getting this weird gltf convex shape collision, where model is reacting to floor goes inside of the floor, probably some mistake in calculating vertices or something? can anyone tell me where am I doing wrong, please?
Already posted this question on a closed solved post but didn’t get any solution so posting once again
I have attached a video of it below and this is the code
createMask(Ammo){
let head
let position = {x: 0, y: 70, z: 0},
quaternion = {x: 0, y: 0, z: 0, w: 1},
mass = 1
const scale = 5
this.loader = new GLTFLoader()
const dracoLoader = new DRACOLoader()
dracoLoader.setDecoderPath('/draco/')
this.loader.setDRACOLoader(dracoLoader)
this.loader.load('assets/models/mask.glb', (gltf) => {
head = gltf.scene.children[0]
head.scale.set(scale,scale,scale)
head.position.set(0, position.y, 0)
head.castShadow = true
this.scene.add(head)
//physics
const transform = new Ammo.btTransform();
transform.setIdentity();
transform.setOrigin(new Ammo.btVector3(position.x, position.y, position.z));
transform.setRotation(new Ammo.btQuaternion(quaternion.x, quaternion.y, quaternion.z, quaternion.w));
const shape = new Ammo.btConvexHullShape();
//new ammo triangles
let triangle, triangle_mesh = new Ammo.btTriangleMesh;
//declare triangles position vectors
let vectA = new Ammo.btVector3(0, 0, 0);
let vectB = new Ammo.btVector3(0, 0, 0);
let vectC = new Ammo.btVector3(0, 0, 0);
//retrieve vertices positions from object
let verticesPos = head.geometry.getAttribute('position').array;
console.log(verticesPos)
let triangles = [];
for (let i = 0; i < verticesPos.length; i += 3) {
triangles.push({
x: verticesPos[i],
y: verticesPos[i + 1],
z: verticesPos[i + 2]
})
}
//use triangles data to draw ammo shape
for (let i = 0; i < triangles.length - 3; i += 3) {
vectA.setX(triangles[i].x);
vectA.setY(triangles[i].y);
vectA.setZ(triangles[i].z);
shape.addPoint(vectA, true);
vectB.setX(triangles[i + 1].x);
vectB.setY(triangles[i + 1].y);
vectB.setZ(triangles[i + 1].z);
shape.addPoint(vectB, true);
vectC.setX(triangles[i + 2].x);
vectC.setY(triangles[i + 2].y);
vectC.setZ(triangles[i + 2].z);
shape.addPoint(vectC, true);
triangle_mesh.addTriangle(vectA, vectB, vectC, true);
}
Ammo.destroy(vectA);
Ammo.destroy(vectB);
Ammo.destroy(vectC);
shape.setMargin(0.05);
const motionState = new Ammo.btDefaultMotionState(transform);
const localInertia = new Ammo.btVector3(0, 0, 0);
shape.calculateLocalInertia(mass, localInertia);
const rbInfo = new Ammo.btRigidBodyConstructionInfo(mass, motionState, shape, localInertia);
const rBody = new Ammo.btRigidBody(rbInfo);
this.physicsWorld.addRigidBody(rBody)
head.userData.physicsBody = rBody
this.rigidBodies.push(head)
})
}