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
» 2013-02-26 23:15:00
Widziałem to i z tego czerpałem "inspiracje". Widocznie musiałem coś przeoczyć.
Jutro spróbuję wkleić, przerobić to na C++ i jak będzie działać to napiszę co było źle. :)
P-77169
DejaVu
» 2013-02-26 23:15:49
Ja też w to popatrzę bo akurat interesuje mnie Box2D :P
P-77170
Arturr300
Temat założony przez niniejszego użytkownika
» 2013-02-26 23:35:09
Sporo roboty z tym jest. To jest robione na jakiejś starszej wersji Box2d, w najnowszej połowa rzeczy jest pozmieniana. Ale czego się nie robi dla programowania :D
P-77177
DejaVu
» 2013-02-27 00:11:56
http://www.codeproject.com/Articles/468121/Box2d-vehicles-part-3-bike - tu są fajne rysunki :P

/edit:
Czy Twoje sprężyste joiny nie powinny być między backdamperem a backwhellem?
C/C++
_G->CreatePrismaticJoint( backdamper, backwheel, backdamper->GetWorldCenter(), b2Vec2( 0, 1.0f ) );

ewentualnie wykomentuj wiersze lub spróbuj je zastąpić prismaticjointami:
C/C++
_G->CreateRevoluteJoint( backdamper, backwheel, backwheel->GetWorldCenter(), true, 0, 0 );
_G->CreateRevoluteJoint( frontdamper, frontwheel, frontwheel->GetWorldCenter(), true, 0, 0 )
na szybciora niestety nie udało mi się nic konkretnego machnąć :P Niemniej jednak revoluteJoint odpowiada jak zrozumiałem za maksymalne kąty zgięcia, więc może z tym masz problem? Być może wystarczy jakieś 'trwałe' wiązanie między kołem, a damper-em i problem się rozwiąże.
P-77188
Arturr300
Temat założony przez niniejszego użytkownika
» 2013-02-27 06:49:38
Revolute joint odpowiada u mnie tylko za obrót koła - napęd.

Dodanie tego:
C/C++
_G->CreatePrismaticJoint( backdamper, backwheel, backdamper->GetWorldCenter(), b2Vec2( 0, 1.0f ) );
_G->CreatePrismaticJoint( frontdamper, frontwheel, frontwheel->GetWorldCenter(), b2Vec2( 0, 1.0f ) );
Nie dość że nie pomogło, to jeszcze zblokowało koła - nie mogą się obracać.
Nie mam pojęcia co jest nie tak :/
Jestem już w połowie przepisywania tamtego kodu, może to pomoże

Korzystałem także z tego:
http://www.codeproject.com/Articles/445461/Box-2d-vehicles-part-1

Tamte 2 strony są jedynymi miejscami w sieci, gdzie można znaleźć sensowne kody pojazdów. Nie wiem czemu, ale do box2d nie ma prawie żadnych poradników, itd. W odróżnieniu do takiego SFML, gdzie jest ich masa
P-77196
Arturr300
Temat założony przez niniejszego użytkownika
» 2013-02-27 15:26:18
Cały projekt:
http://www.speedyshare.com/t3Rmv/Projekt3.rar

Jeżeli możesz, to spróbuj coś zrobić. Ja nad tym już koło tygodnia siedzę :/ Próbowałem różne rzeczy - nadal się obraca.
Kluczowe funkcje są na końcu pliku Gra.cpp i w pliku Car.cpp

W ustawieniach projektu ustaw sobie ścieżkę do bibliotek, bo ja ustawiałem własny folder. I przekompiluj ponownie

Jeżeli Ci się uda, będę baaaaaaardzo wdzięczny :)

Klawiszem Y się dodaje pojazd, a strzałkami w górę i w dół się przyśpiesza/hamuje
P-77211
DejaVu
» 2013-02-27 22:26:45
Dopiero do domu wróciłem - pobieram projekt :) Dzisiaj lub jutro wieczorem dam Ci znać co się udało zrobić :P

/edit:
No to tak:
http://www.iforce2d.net/b2dtut/sourcecode
Pobierz sobie plik binarny i wybierz prismatic join-y. Zauważ, że one też się 'wyginają' jak u Ciebie (czyli działają jak sprężyny).

Tu jest tutorial szerzej opisujący prismatic joiny (które sprawiają problemy):
http://www.iforce2d.net/b2dtut/joints-prismatic

W kodzie ze strony http://www.emanueleferonato.com/2009/04/06 /two-ways-to-make-box2d-cars/ jest metoda 'update':
     public function update(e : Event) : void {
        
         if (input.isPressed(32)) {
            world = null;
            init();
            return;
         }
 
         motor1.SetMotorSpeed(15*Math.PI * (input.isPressed(40) ? 1 : input.isPressed(38) ? -1 : 0));
         motor1.SetMaxMotorTorque(input.isPressed(40) || input.isPressed(38) ? 17 : 0.5);
        
         motor2.SetMotorSpeed(15*Math.PI * (input.isPressed(40) ? 1 : input.isPressed(38) ? -1 : 0));
         motor2.SetMaxMotorTorque(input.isPressed(40) || input.isPressed(38) ? 12 : 0.5);
        
         spring1.SetMaxMotorForce(30+Math.abs(800*Math.pow(spring1.GetJointTranslation(), 2)));
         //spring1.SetMotorSpeed(-4*Math.pow(spring1.GetJointTranslation(), 1));
         spring1.SetMotorSpeed((spring1.GetMotorSpeed() - 10*spring1.GetJointTranslation())*0.4);        
        
         spring2.SetMaxMotorForce(20+Math.abs(800*Math.pow(spring2.GetJointTranslation(), 2)));
         spring2.SetMotorSpeed(-4*Math.pow(spring2.GetJointTranslation(), 1));
        
         cart.ApplyTorque(30*(input.isPressed(37) ? 1: input.isPressed(39) ? -1 : 0));
        
         screen.x -= (screen.x - (-DRAW_SCALE*cart.GetWorldCenter().x + SCREEN_WIDTH/2 - cart.GetLinearVelocity().x*10))/3;
         screen.y -= (screen.y - (DRAW_SCALE*cart.GetWorldCenter().y + 2*SCREEN_HEIGHT/3 + cart.GetLinearVelocity().y*6))/3;
 
         world.Step(TIME_STEP, ITERATIONS);
        
         FRateLimiter.limitFrame(60);
        
      }
Może odpowiedź leży w tych dwóch linijkach:
spring2.SetMaxMotorForce(20+Math.abs(800*Math.pow(spring2.GetJointTranslation(), 2)));
spring2.SetMotorSpeed(-4*Math.pow(spring2.GetJointTranslation(), 1));
Przeprowadziłem eksperymenty na Twoim kodzie i w sumie wydaje mi się, że problem nie leży w Twojej metodzie PrismaticJoin tylko gdzieś indziej...

Dokumentacja Box2D w tych kwestiach wydaje mi się uboga więc... próżno szukać tam rozwiązania (http://www.box2d.org/manual.html#_Toc258082974).

Frazy, które należy wpisać w wyszukiwarkę google:
http://www.cocos2d-iphone.org/forum/topic/30191

Może na coś konkretnego naprowadzą Cię powyższe linki...
P-77271
DejaVu
» 2013-02-28 11:59:46
http://blog.allanbishop.com /box2d-2-1a-tutorial-part-2-joints/

Z treści wynika, że ciała połączone prismatic jointem obracają się razem (i tak u Ciebie to działa). Problem w tym, że w chwili gdy zadziała siła na połączone dynamiczne ciała, to dochodzi do 'odształcenia' jointa - o czym w sumie żadnych informacji nie znalazłem..., jednak nadal ten prismatic join zachowuje się jak sprężyna.
P-77301
1 « 2 » 3 4
Poprzednia strona Strona 2 z 4 Następna strona