Войти
ПрограммированиеФорумФизика

ODE: Составные объекты. Траблы...

#0
15:31, 7 фев. 2006

В общем нужно создать объект состоящий из двух геометрий: капсулы и кубика, делаю так:

ODEphysicsgeom = dCreateGeomTransform (space);
dGeomTransformSetCleanup (ODEphysicsgeom,1);
dGeomTransformSetInfo(ODEphysicsgeom, 1);

tmpODEphysicsgeom[0] = dCreateBox (0, pRadius, pRadius, pWidth);
tmpODEphysicsgeom[1] = dCreateCCylinder (0, pRadius/3, pWidth);

dGeomTransformSetGeom (ODEphysicsgeom,tmpODEphysicsgeom[0]);
dGeomTransformSetGeom (ODEphysicsgeom,tmpODEphysicsgeom[1]);

dGeomSetBody (ODEphysicsgeom, ODEphysicsbody); //Соединяем геометрию с телом

трабл в том, что тело коллизится только той  геометрией, которая подключена в последнюю очередь(т.е. dGeomTransformSetGeom (ODEphysicsgeom,tmpODEphysicsgeom[1]);)... А мне нужно сразу две! :(

Как исправить такую ошибку?


#1
16:41, 7 фев. 2006

создавай трансформацию (dCreateGeomTransform) для каждой геометрии ... и для капсулы и для кубика. т.е. две штуки

#2
16:46, 7 фев. 2006

Krush
>>> создавай трансформацию (dCreateGeomTransform) для каждой геометрии ... и для капсулы и для кубика. т.е. две штуки
Т.е.?!

dCreateGeomTransform - это отдельная геометрия, которая будет содержать и капсулу и кубик...

Можешь код показать?

#3
17:38, 7 фев. 2006

посмотри как делается в сэмплах ОДЕ...
вот кусок из test_trimesh.cpp

for (k=0; k<GPB; k++)
{
obj.geom[k] = dCreateGeomTransform (space);
dGeomTransformSetCleanup (obj
.geom[k],1);
if (k==0) {
dReal radius = dRandReal()*0.25+0.05;
g2[k] = dCreateSphere (0,radius);
dMassSetSphere (&m2,DENSITY,radius);
}
else if (k==1) {
g2[k] = dCreateBox (0,sides[0],sides[1],sides[2]);
dMassSetBox (&m2,DENSITY,sides[0],sides[1],sides[2]);
}
else {
dReal radius = dRandReal()*0.1+0.05;
dReal length = dRandReal()*1.0+0.1;
g2[k] = dCreateCCylinder (0,radius,length);
dMassSetCappedCylinder (&m2,DENSITY,3,radius,length);
}
dGeomTransformSetGeom (obj
.geom[k],g2[k]);
...
for (k=0; k < GPB; k++) {
if (obj
.geom[k]) dGeomSetBody (obj.geom[k],obj.body);
}


Как можешь убедиться, для каждого составного объекта создается своя оффсет геометрия и в конце аттачится к телу
и оффсет геометрия может быть приаттачена всего лишь к ОДНОЙ геометрии, а не как ты пытался сделать - к нескольким

#4
21:05, 8 фев. 2006

Krush
Вроде разобрался, пасиб! :)

Прошло более 6 месяцев
#5
19:45, 8 авг. 2006

что я не могу понять как правильно сделать составную геометрию
вот часть кода создания геометрии, но мне кажется она у меня не правельная

 
setlength(Body,kolobmap);
setlength(ODEphysicsgeom,kolobmap);
setlength(ODEphysicsgeom2,kolobmap);
setlength(GeomCUB,kolobmap);
setlength(Geom,kolobmap);
               // 1
for i:=0 to kolobmap-1  do begin
Body[i]    := dBodyCreate (dWorldID);   //создаем в мире тело
GeomCUB[i] := dCreateBox  (0, 4,4,4);   //геометрия
Geom[i]    := dCreateSphere( 0, 0.01);   //геометрия
//dGeomSetData( Geom[i],                     //  dCreateSphere( 0, 0.3);

ODEphysicsgeom[i]:= dCreateGeomTransform (space);      //создаем геометрию в мире      space
dGeomTransformSetCleanup (ODEphysicsgeom[i],1);  //  режим очистки трансформации геометрии. Если режим очистки установлен в 1, тогда инкапсулированные объекты будут уничтожаться при уничтожении трансформированной геометрии
dGeomTransformSetInfo (ODEphysicsgeom[i], 1);  //

ODEphysicsgeom2[i]:= dCreateGeomTransform (space);      //создаем геометрию в мире      space
dGeomTransformSetCleanup (ODEphysicsgeom2[i],1);  //  режим очистки трансформации геометрии. Если режим очистки установлен в 1, тогда инкапсулированные объекты будут уничтожаться при уничтожении трансформированной геометрии
dGeomTransformSetInfo (ODEphysicsgeom2[i], 1);  //

//dGeomTransformSetGeom (Geom[i], GeomCUB[i] );
dGeomTransformSetGeom (ODEphysicsgeom[i], GeomCUB[i] );
dGeomTransformSetGeom (ODEphysicsgeom2[i], Geom[i] );

{void dGeomTransformSetGeom (dGeomID g, dGeomID obj);
Устанавливает геометрию которая будет являться трансформированной геометрией g.
Объект obj не должен принадлежать ни какому пространству и не быть ассоциированным с каким либо телом.
}
dGeomSetPosition( GeomCUB[i],0,0,10);
dGeomSetPosition( Geom[i],0,0,0);
dGeomSetBody (ODEphysicsgeom[i], body[i]);  //Соединяем геометрию с телом
dGeomSetBody (ODEphysicsgeom2[i], body[i]);  //Соединяем геометрию с телом
//Geom[1] :=dCreateBox( Space, 1,1,1);
body[i].mass.mass :=0.70;

dBodySetPosition(body[i], Kartaob[i][1], Kartaob[i][2], Kartaob[i][3] );
                       end; //for i to kolobmap-1 do begin
#6
20:09, 13 авг. 2006

да где взять хотябы пример нормальный по данному вопросу

#7
0:13, 26 сен. 2006

Используй вместо transform

  dGeomSetOffsetPosition (dGeomID geom, dReal x, dReal y, dReal z)
 

  http://opende.sourceforge.net/docs/group__collide.html

ПрограммированиеФорумФизика

Тема в архиве.