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

Блокировка колес в ODE

Страницы: 1 2 Следующая »
#0
14:12, 7 фев. 2007

Пожалуйста, поделитесь опытом, кто работал с ODE. Приложение 0-й желаемой скорости и силы в несколько сотен (в джойнте колеса) не дает ожидаемого результата, колесо полностью не блокируется, например на горке не держит...


#1
6:52, 22 фев. 2007

Ну неужели никто не работал с ODE и джойнтами!!!  не жмотьте знания!!!! помогите советом!!!

#2
10:06, 22 фев. 2007

Сделай угловой лимит-джоинт и назначь ему значения лимитов равными друг-другу - это будет работать как fixed joint

#3
13:39, 12 мар. 2007

TopSpace

была у меня такая проблема.
Ты уточни, колеса у автомобиля скатываются!! (т.е. вращаются в соединениях) или они соскальзывают  (т.е. они не вращаются, но автомобиль скользит с горки)!!!.
Это две разные проблемы.

#4
7:00, 13 мар. 2007

Трение поверхностей вроде нормальное, колеса именно проворачиваются в соединении. Буду признателен за подсказку!

#5
13:54, 13 мар. 2007

TopSpace

Если у тебя соеденения с колесами представлены hinge2 ,  что должно быть естественным, но не обязательным, то заведи параметр "блокировки колес" (передних, задних, не важно). И при торможении обрабатывай эту ситуацию тем, что делай примерно следующее:

dJointSetHinge2Param(joint - твой джоинт колеса, dParamFMax2 , параметр блокировки колес);  - его подберешь сам, он зависит от массы, плотности и трения.

Если ты его не сбросишь, то автомобиль не тронется с места, даже когда будешь жать газ до поликов.

#6
14:32, 13 мар. 2007

_mr.angel
FMax работать не будет. Только как сказал GeorgeBig2 - взять текущий угол колеса и забить его в lostop2/histop2.

#7
15:02, 13 мар. 2007

CoolDev

с тобой спорить не буду, ты парень авторитетный.
Но у нас такой принцып работает, навязывать его никому не хочу.

#8
15:11, 13 мар. 2007

Ребят, это все я пробовал. Так ДОЛЖНО работать, но не работает.

Вот код ручника:

    dJointSetHinge2Param( rearwheel[0]->GetOdeJointId(), dParamFMax2, (dReal)FslowingBack );
    dJointSetHinge2Param( rearwheel[1]->GetOdeJointId(), dParamFMax2, (dReal)FslowingBack );
    dJointSetHinge2Param( rearwheel[0]->GetOdeJointId(), dParamVel2, 0 );
    dJointSetHinge2Param( rearwheel[1]->GetOdeJointId(), dParamVel2, 0 );
    dJointSetHinge2Param( rearwheel[0]->GetOdeJointId(), dParamLoStop2, 0 );
    dJointSetHinge2Param( rearwheel[1]->GetOdeJointId(), dParamHiStop2, 0 );

Эти параметры не работают, видимо косяк при создании мира. Там что-то выставляется так, что  dParamLoStop2 и dParamHiStop2 не влияет вообще...

#9
15:16, 13 мар. 2007

_mr.angel
Ок, от солвера зависит, от его настроек, от соотношения масс колесо/корпус, тупо от фризинга. Может у тебя она сползает по наклону, но так медленно, что успевает зафризиться? Но по моим наблюдениям сползает всегда.

ЗЫ Если у тебя действительно не сползает и расскажешь как сделал, буду благодарен.

#10
15:29, 13 мар. 2007

TopSpace

> dJointSetHinge2Param( rearwheel[0]->GetOdeJointId(), dParamLoStop2, 0 ); 
> dJointSetHinge2Param( rearwheel[1]->GetOdeJointId(), dParamHiStop2, 0 ); 

Вот это оригинально :) Одному колесу задал верхний ограничитель, другому нижний :)

dJointSetHinge2Param( rearwheel[0]->GetOdeJointId(), dParamLoStop2, 0 ); 
dJointSetHinge2Param( rearwheel[0]->GetOdeJointId(), dParamHiStop2, 0 ); 
dJointSetHinge2Param( rearwheel[1]->GetOdeJointId(), dParamLoStop2, 0 ); 
dJointSetHinge2Param( rearwheel[1]->GetOdeJointId(), dParamHiStop2, 0 ); 

Правка: и не ноль, а текущий угол колеса. А то при торможенни колесо разворачивать в нулевой угол будет.

ЗЫ Юзай тег code.

#11
9:32, 15 мар. 2007

Все равно не работает...  эти ограничители по углам хоть при создании джойнта в 0 ставь - они не влияют. ODE версии 0.5..

#12
12:08, 15 мар. 2007

TopSpace
Выложи код инициализации и настройки джоинта. И переходи на последнюю версию, в 0.5 глюки были.

#13
9:39, 16 мар. 2007

там очень много кода, параметры прописаны в xml, грузятся в коде (Nebula2 + Mangalore)
на версию другую перейти не могу, т.к. ODE 0.5 в Mangalore вшит... 
во пример из xml для одного джойнта:

<Hinge2 name="Hinge3" 
anchor="-0.686 0.284  -1.171"   
axis1="0.000 1.000 0.000" 
axis2="1.000 0.000 0.000" 
body1="Body" 
body2="Wheel3" 
lostop0="-25" 
histop0="25"  
fmax0="100" 
fmax1="0" 
fudge0="0.05" 
fudge1="1" 
bounce0="0" 
bounce1="0" 
cfm0="0.001" 
stopErp0="0.8" 
stopCfm0="0.001" 
cfm1="0.001" 
stopErp1="0.08" 
stopCfm1="0.001" 
vel0="0" vel1="0" 
suspERP="0.75" 
suspCFM="0.007"/>
#14
13:25, 16 мар. 2007

TopSpace
Эээ... посыпаю голову пеплом, каюсь и тп. Для колес использую universal с амортизатором, hinge2 и не мучил по хорошему. Заглянул счас внутрь, обнаружил это

static void hinge2GetInfo1 (dxJointHinge2 *j, dxJoint::Info1 *info)
{
   ...
   // see if we're powering axis 2 (we currently never limit this axis)
   j->limot2.limit = 0;
   if (j->limot2.fmax > 0) info->m++;
}

В версии 0.5 в hinge2 джоинте ораничители по второй оси не работают в принципе...
В версиях 0.6, 0.7, 0.8 точно так же.

Даже незнаю, что порекомендовать... или без ограничителей задирать fmax, или в коде что-то править.
Насчет кода - не знаю возможно ли это, если оси не перпендикулярны - может потому и не сделали.

Страницы: 1 2 Следующая »
ПрограммированиеФорумФизика

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