[ODE] Collisions from models
Ivan Bolcina
ivan.bolcina at snt.si
Tue May 18 13:18:33 MST 2004
In direct3d, I build hierarcy of boxes. I do this with
D3DXLoadMeshHierarchyFromX function and as a result, I get array of
boxes. I had trouble at first because boxes have their own transform. So
I had to mutiply those transforms to get the final one. Once you have
array of boxes, it is easy, something like "if (bounding=="boxes") ...."
code. I was using axis-aligned boxes, but this is not necessary. So I
think ordering is only important because of tranformation matrixes.
David Rogers wrote:
> Hey, thanks. that helps a little bit. Unfortunately I'm not using
> directx. Good ol' opengl with lib3ds(from sourceforge) to load and
> display the models.
>
> From lib3ds, once a file is loaded, the structure that contains the
> models data does have an array of the meshes. I assume then that the
> process would be similar. Am I right? I'm not sure how the meshes
> are ordered in the array yet(haven't looked at it that much), but
> would that matter?
>
> thanks,
>
> dave
>
> On May 18, 2004, at 4:21 AM, Ivan Bolcina wrote:
>
>> 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);
>> }
>> }
>>
>>
>> _______________________________________________
>> ODE mailing list
>> ODE at q12.org
>> http://q12.org/mailman/listinfo/ode
>
>
> _______________________________________________
> ODE mailing list
> ODE at q12.org
> http://q12.org/mailman/listinfo/ode
>
More information about the ODE
mailing list