dimforge / rapier.js

Official JavaScript bindings for the Rapier physics engine.
https://rapier.rs
Apache License 2.0
427 stars 58 forks source link

TriMesh should have better documentation. Example included. #272

Open jonmdev opened 6 months ago

jonmdev commented 6 months ago

Based on the minimal documentation we have, if I want to create a TriMesh floor made of a single triangle, this should I think look like this:

    let triMeshVerts = new Float32Array(9);

    triMeshVerts[0] = -9;   triMeshVerts[1] = 0;    triMeshVerts[2] = 9;    //point 1 x,y,z
    triMeshVerts[3] = 9;    triMeshVerts[4] = 0;    triMeshVerts[5] = 9;    //point 2 x,y,z
    triMeshVerts[6] = 0;    triMeshVerts[7] = 0;    triMeshVerts[8] = -9;   //point 3 x,y,z

    let triMeshIndices = new Uint32Array(9);

    for (let i=0;i<triMeshIndices.length;i++){
        triMeshIndices[i] = 0; //all points used for single triangle
    }
    let groundColliderDesc = RAPIER.ColliderDesc.trimesh(triMeshVerts,triMeshIndices).setTranslation(0,0,0);

However, objects fall right through this. Is there some other step that needs to be done or is this function broken?

By contrast, if I make a triangle with the same points it works properly and stops objects from going through it:

let groundColliderDesc = RAPIER.ColliderDesc.triangle(new RAPIER.Vector3(-9,0,9), new RAPIER.Vector3(9,0,9), new RAPIER.Vector3(0,0,-9)).setTranslation(0,0,0);
    world.createCollider(groundColliderDesc);

Thanks for any help.

jonmdev commented 6 months ago

Managed to get the correct code. It is:

let triMeshVerts = new Float32Array(9);
    triMeshVerts[0] = -9;    triMeshVerts[1] = 0;    triMeshVerts[2] = 9;
    triMeshVerts[3] = 9;    triMeshVerts[4] = 0;    triMeshVerts[5] = 9;
    triMeshVerts[6] = 0;    triMeshVerts[7] = 0;    triMeshVerts[8] = -9;

    let triMeshIndices = new Uint32Array(3);
    triMeshIndices[0] = 0;
    triMeshIndices[1] = 1;
    triMeshIndices[2] = 2;

    let groundColliderDesc = RAPIER.ColliderDesc.trimesh(triMeshVerts,triMeshIndices).setTranslation(0,0,0);

This is not intuitive how the indices work. I suggest adding an example like this to the documentation for illustration.

An example could also be given for a quad with reused verts like:

let triMeshVerts = new Float32Array(9);
    triMeshVerts[0] = -2;    triMeshVerts[1] = 0;    triMeshVerts[2] = -2; //vert1
    triMeshVerts[3] = -2;    triMeshVerts[4] = 0;    triMeshVerts[5] = 2; //vert2
    triMeshVerts[6] = 2;    triMeshVerts[7] = 0;    triMeshVerts[8] = 2; //vert3
    triMeshVerts[9] = 2;    triMeshVerts[10] = 0;    triMeshVerts[11] = -2; //vert4

    let triMeshIndices = new Uint32Array(3);
    triMeshIndices[0] = 0;    triMeshIndices[1] = 1;    triMeshIndices[2] = 2; //triangle 1
    triMeshIndices[3] = 0;    triMeshIndices[4] = 3;    triMeshIndices[5] = 2; //triangle 2

    let groundColliderDesc = RAPIER.ColliderDesc.trimesh(triMeshVerts,triMeshIndices).setTranslation(0,0,0);

If that is in fact correct.