Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Box2d + SFML 2.0] problem z prismatic joints (wyginają się)

Ostatnio zmodyfikowano 2013-03-06 07:18
Autor Wiadomość
Arturr300
Temat założony przez niniejszego użytkownika
[Box2d + SFML 2.0] problem z prismatic joints (wyginają się)
» 2013-02-26 21:03:30
Witam.
Mam następujący problem.
Otóż amortyzatory (dampery) w moim pojeździe powinny poruszać się tylko w jednej osi - pionowej. A jak widać na filmiku poniżej, wyginają się w różnych kierunkach.

http://youtu.be/cNMQDHUU0oQ

Fragmenty kodów:
Plik samochodu (Car.cpp)
C/C++
_G->CreateRevoluteJoint( backdamper, backwheel, backwheel->GetWorldCenter(), true, 0, 0 );
_G->CreateRevoluteJoint( frontdamper, frontwheel, frontwheel->GetWorldCenter(), true, 0, 0 );
_G->CreatePrismaticJoint( carbody, backdamper, backdamper->GetWorldCenter(), b2Vec2( 0, 1.0f ) );
_G->CreatePrismaticJoint( carbody, frontdamper, frontdamper->GetWorldCenter(), b2Vec2( 0, 1.0f ) );

Funkcja w Gra.cpp:
C/C++
void Gra::CreatePrismaticJoint( b2Body *& Body1, b2Body *& Body2, b2Vec2 anchor, b2Vec2 moveaxis )
{
    b2Vec2 axis = moveaxis; axis.Normalize();
    prismaticJointDef.Initialize( Body1, Body2, anchor, axis );
    prismaticJointDef.enableLimit = true;
    prismaticJointDef.upperTranslation =- 0.3;
    prismaticJointDef.lowerTranslation = 0.5;
    prismaticJointDef.enableMotor = true;
   
    World.CreateJoint( & prismaticJointDef );
    v_Joints.push_back( World.GetJointList() );
   
   
}

Proszę o pomoc. Jeżeli potrzeba jeszcze jakiegoś kodu, to wrzucę
P-77149
DejaVu
» 2013-02-26 22:16:53
Ustaw dla amortyzatorów wysoki angularDamping.
C/C++
bodyDef.angularDamping = 9999;
To jest opór obrotu. Doczytaj jaka jest wartość 'maksymalna' dla tego pola bądź eksperymentalnie sprawdź czy po prostu działa rozwiązanie, które Ci dałem.
P-77158
Arturr300
Temat założony przez niniejszego użytkownika
a
» 2013-02-26 22:35:27
Wpisałem:
if( name == L"Amortyzator" ) BodyDef.angularDamping = 99999999999999;
Niestety dalej jest to samo :( Z mniejszymi liczbami również. Ta wartość jest na pewno przypisywana dla amortyzatorów (sprawdzone przez breakpointy)

Ciała tworzę oczywiście z BodyDef
P-77160
DejaVu
» 2013-02-26 22:37:52
Ja sprawdzałem na bryle, która spada i się nie obraca ona po wpisaniu wspomnianej przeze mnie linijki. Podaj krótki kod jak użyć jointa dołączonego do bryły i kółko to sprawdzę, czy faktycznie inaczej powinno to wyglądać.
P-77161
Arturr300
Temat założony przez niniejszego użytkownika
» 2013-02-26 22:47:26
Nie bardzo rozumiem, co mam podać.

Tworzenie jointów:
C/C++
void Gra::CreateRevoluteJoint( b2Body *& Body1, b2Body *& Body2, b2Vec2 anchor, bool enablemotor, float motorspeed, float maxtorque )
{
    revoluteJointDef.Initialize( Body1, Body2, anchor ); //, BodyIterator->GetNext()->GetWorldCenter()
   
    revoluteJointDef.enableMotor = true;
    revoluteJointDef.motorSpeed = 0;
    revoluteJointDef.maxMotorTorque = 20000;
    World.CreateJoint( & revoluteJointDef );
    v_Joints.push_back( World.GetJointList() );
    foo = true;
    zmiana = false;
   
   
}
void Gra::CreatePrismaticJoint( b2Body *& Body1, b2Body *& Body2, b2Vec2 anchor, b2Vec2 moveaxis )
{
    b2Vec2 drol = moveaxis; drol.Normalize();
   
    prismaticJointDef.Initialize( Body1, Body2, anchor, drol );
    prismaticJointDef.upperTranslation =- 0.3;
    prismaticJointDef.lowerTranslation = 0.5;
    prismaticJointDef.enableLimit = true;
   
    prismaticJointDef.enableMotor = true;
    World.CreateJoint( & prismaticJointDef );
    v_Joints.push_back( World.GetJointList() );
   
    foo = true;
    zmiana = false;
   
}

Tworzenie obiektów(karoseria i dampery to Box, a koła to Circle)
C/C++
void Gra::CreateBox( b2World & World, int MouseX, int MouseY, float w, float h, wstring name )
{
    b2BodyDef BodyDef;
    BodyDef.position.Set(( MouseX +( w / 2 ) ) / SCALE, MouseY / SCALE );
    BodyDef.type = b2_dynamicBody;
    if( name == L"Amortyzator" ) BodyDef.angularDamping = 99999999999999;
   
    b2Body * Body = World.CreateBody( & BodyDef );
    v_Data.push_back( new UserData );
    v_Data[ v_Data.size() - 1 ]->typ = name;
    v_Data[ v_Data.size() - 1 ]->nazwa = L"";
    Body->SetUserData( v_Data[ v_Data.size() - 1 ] );
    v_Body.push_back( Body );
    b2PolygonShape Shape;
    Shape.SetAsBox(( w / 2 ) / SCALE,( h / 2 ) / SCALE );
    b2FixtureDef FixtureDef;
    if( name != L"Amortyzator" ) FixtureDef.density = 50.0f; else FixtureDef.density = 8.f;
    FixtureDef.friction = 0.7f;
    FixtureDef.shape = & Shape;
    Body->CreateFixture( & FixtureDef );
   
}
void Gra::CreateCircle( b2World & World, int MouseX, int MouseY, float radius )
{
    b2BodyDef BodyDef;
    BodyDef.position = b2Vec2( MouseX / SCALE, MouseY / SCALE );
    BodyDef.type = b2_dynamicBody;
    b2Body * Body = World.CreateBody( & BodyDef );
    v_Data.push_back( new UserData );
    v_Data[ v_Data.size() - 1 ]->typ = L"Koło";
    v_Data[ v_Data.size() - 1 ]->nazwa = L"";
    Body->SetUserData( v_Data[ v_Data.size() - 1 ] );
    v_Body.push_back( Body );
    b2CircleShape Shape;
    Shape.m_radius = radius / SCALE;
   
    b2FixtureDef FixtureDef;
    FixtureDef.restitution = 0;
    FixtureDef.density = 10.f;
    FixtureDef.friction = 0.7f;
    FixtureDef.shape = & Shape;
    Body->CreateFixture( & FixtureDef );
}
P-77163
DejaVu
» 2013-02-26 22:50:11
Popatrzę sobie na to i dam znać pewnie za godzinkę :)
P-77165
Arturr300
Temat założony przez niniejszego użytkownika
» 2013-02-26 22:51:17
Ok, nie ma sprawy :) Nie śpieszy mi się
Jeżeli chcesz to mogę wrzucić cały projekt
P-77166
DejaVu
» 2013-02-26 22:52:42
Na pewno byłoby szybciej :P

/edit:
na szybciora:
http://www.emanueleferonato.com/2009/04/06 /two-ways-to-make-box2d-cars/

masz przykład działający z kodem źródłowym w którym masz to co chcesz osiągnąć.
P-77167
« 1 » 2 3 4
  Strona 1 z 4 Następna strona