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/cNMQDHUU0oQFragmenty kodów: Plik samochodu (Car.cpp) _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: 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ę |
|
DejaVu |
» 2013-02-26 22:16:53 Ustaw dla amortyzatorów wysoki angularDamping. 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. |
|
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 |
|
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ć. |
|
Arturr300 Temat założony przez niniejszego użytkownika |
» 2013-02-26 22:47:26 Nie bardzo rozumiem, co mam podać. Tworzenie jointów: void Gra::CreateRevoluteJoint( b2Body *& Body1, b2Body *& Body2, b2Vec2 anchor, bool enablemotor, float motorspeed, float maxtorque ) { revoluteJointDef.Initialize( Body1, Body2, anchor ); 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) 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 ); } |
|
DejaVu |
» 2013-02-26 22:50:11 Popatrzę sobie na to i dam znać pewnie za godzinkę :) |
|
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 |
|
DejaVu |
» 2013-02-26 22:52:42 |
|
« 1 » 2 3 4 |