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. :) |
|
DejaVu |
» 2013-02-26 23:15:49 Ja też w to popatrzę bo akurat interesuje mnie Box2D :P |
|
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 |
|
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? _G->CreatePrismaticJoint( backdamper, backwheel, backdamper->GetWorldCenter(), b2Vec2( 0, 1.0f ) );
ewentualnie wykomentuj wiersze lub spróbuj je zastąpić prismaticjointami: _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. |
|
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: _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-1Tamte 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 |
|
Arturr300 Temat założony przez niniejszego użytkownika |
» 2013-02-27 15:26:18 Cały projekt: http://www.speedyshare.com/t3Rmv/Projekt3.rarJeż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 |
|
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/sourcecodePobierz 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-prismaticW 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). http://www.cocos2d-iphone.org/forum/topic/30191Może na coś konkretnego naprowadzą Cię powyższe linki... |
|
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. |
|
1 « 2 » 3 4 |