[ODE] Collisions from models

Ivan Bolcina ivan.bolcina at snt.si
Tue May 18 11:21:05 MST 2004


David Rogers wrote:

> Hi all, I'm new to ODE and I haven't found any examples yet of how to 
> do what I want.  I have some 3DS models that I load for a game and I'm 
> trying to use ODE for collision detection between the models.  Does 
> anyone have an example or pointers to info on how to go about building 
> the bboxes or whatever i need?
>
> thanks in advance,
>
> dave rogers
>
> _______________________________________________
> ODE mailing list
> ODE at q12.org
> http://q12.org/mailman/listinfo/ode
>
Hi.
You can use following pattern.

1. Convert 3ds  model to .x model.
2. Load .x model into hierarcy - D3DXLoadMeshHierarchyFromX
3. this way you can get array of boxes. You can construct ODE body from it.

  void SObject::createPhy()
{
    if (PhyUp) return;
    PhyUp=true;
    string bounding=entry->collision->GetBounding();
    D3DXVECTOR3 box=entry->mesh->MainBox.b-entry->mesh->MainBox.a;
    if (bounding=="") bounding="sphere";
    if (bounding=="box")
    {
        PhyBody = dBodyCreate (app->world);
        dBodySetGravityMode(PhyBody,1);
        dBodySetPosition (PhyBody,m_Position.x,m_Position.y,m_Position.z);
        float vol=box.z*box.y*box.x;
        float den=Mass/vol;
        dMassSetBox (&m,den,box.z,box.y,box.x);
        dBodySetMass (PhyBody,&m);
        PhyGeom[0] = dCreateBox (app->space,box.x,box.y,box.z);
        PhyGeomCnt=1;
        dGeomSetBody (PhyGeom[0],PhyBody);
    }
    if (bounding=="boxes")
    {
        PhyBody = dBodyCreate (app->world);
        dBodySetGravityMode(PhyBody,1);
        dBodySetPosition (PhyBody,m_Position.x,m_Position.y,m_Position.z);
        float vol=box.z*box.y*box.x;
        float den=Mass/vol;
        dMassSetBox (&m,den,box.z,box.y,box.x);
        dBodySetMass (PhyBody,&m);
        for (unsigned int i=0;i<entry->mesh->Boxes.size();i++)
        {
            D3DXVECTOR3 kot1=entry->mesh->Boxes[i].a;
            D3DXVECTOR3 kot2=entry->mesh->Boxes[i].b;
            D3DXVECTOR3 mid=(kot1+kot2)*0.5f;
            D3DXVECTOR3 diff=(kot2-kot1);
            dGeomID skatlica=dCreateBox(0,diff.x,diff.y,diff.z);
            dGeomID skatlicaonpos=dCreateGeomTransform(app->space);
            dGeomTransformSetGeom(skatlicaonpos,skatlica);
            dGeomSetPosition(skatlica,mid.x,mid.y,mid.z);
            dGeomTransformSetCleanup(skatlicaonpos,1);
            dGeomSetBody(skatlicaonpos,PhyBody);
            PhyGeom[i]=skatlicaonpos;
        }
        PhyGeomCnt=(int) entry->mesh->Boxes.size();
    }
    if (bounding=="sphere")
    {
        PhyBody = dBodyCreate (app->world);
        dBodySetGravityMode(PhyBody,1);
        dBodySetPosition (PhyBody,m_Position.x,m_Position.y,m_Position.z);
        float rad=GetRadius();
        float vol=rad*rad*rad*3.1459f;
        float den=Mass/vol;
        dMassSetSphere (&m,den,rad);
        dBodySetMass (PhyBody,&m);
        PhyGeom[0] = dCreateSphere(app->space,rad);
        PhyGeomCnt=1;
        dGeomSetBody (PhyGeom[0],PhyBody);
    }
}




More information about the ODE mailing list