Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

03.12.2011, 21:34

Box2D Motor/RevoluteJoint

Hallo!
Mal wieder ich. Mal wieder bestimmt irgendwas aus Flüchtigkeit.
Doch würde sich bei euch ein Objekt drehen, wenn ich den RevoluteJoint so definiere:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
    b2RevoluteJointDef RevJointDef;
    RevJointDef.Initialize(MiniRectBody, RectBody, MiniRectBody->GetWorldCenter());
    RevJointDef.lowerAngle          =      -0.25f*b2_pi;
    RevJointDef.upperAngle          =       0.50f*b2_pi;
    RevJointDef.enableLimit         =       true;
    RevJointDef.maxMotorTorque      =       100000.f;
    RevJointDef.motorSpeed          =       2.f;
    RevJointDef.enableMotor         =       true;
    b2RevoluteJoint *RevJoint       = (b2RevoluteJoint*)world->CreateJoint(&RevJointDef);


Hab auch schon durch Google mithilfe von ApplyAngularImpulse herumgespielt, aber das Teil bleibt steif oder dreht sich einmal ganz schnell um ~270° am Anfang und steht dann da, als wäre das Objekt statisch.
Das Ganze ist so zu erklären: MiniRectBody ist ein ganz kleines, statisches Quadratlein welches in der Mitte von RectBody seinen Platz findet. Beide haben die gleichen Eigenschaften.
Ich danke schon mal!

MfG
Check

EDIT: Wenn mehr Informationen benötigt werden, fragt bitte nach. Dadurch wird mir ja geholfen. In der Doku, durch Google oder anderen Suchmaschinen und Hilfen, bin ich dazu gekommen, dass sich diese Verbindung doch eigentlich drehen müsste, oder? Naja, fragt nach wenn noch Syntax oder Informationen benötigt werden.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Checkmateing« (04.12.2011, 11:54)


2

05.12.2011, 17:10

hm?

MfG
Check

idontknow

unregistriert

3

05.12.2011, 17:50

Im Box2D Forum bist du mit sowas ziemlich sicher um Welten besser aufgehoben. Soll jetzt keine stänkerei sein oder sowas in der Art, aber hier Leute zu finden die überhaupt Box2D nutzen wird schon schwierig genug sein (vermute ich). Stell deine Frage einfach mal dort, da sollte es definitiv ne Antwort geben die weiterhilft.

Mastermind

unregistriert

4

05.12.2011, 18:19

Wenn du wirklich einen Motor willst (also wiederholte 360° Drehung) brauchst du ziemlich sicher enableLimit = false. Sonst bleibt das Joint immer innerhalb der Limits, die du angegeben hast.

5

05.12.2011, 20:41

Also ich finde es komisch, teilweise ist der Code haargenau, also testweise, wie aus der Doku und anderen Quellen wo es funktioniert, doch hier irgendwie nicht.
Naja, ich habe also folgende Definition:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
    b2RevoluteJointDef RevJointDef;
    RevJointDef.Initialize(MiniRectBody, RectBody, MiniRectBody->GetWorldCenter());
    RevJointDef.lowerAngle          =      -8.0f * b2_pi / 180.0f;
    RevJointDef.upperAngle          =       8.0f * b2_pi / 180.0f;
    RevJointDef.maxMotorTorque      =       10000.f;
    RevJointDef.motorSpeed          =       3;
    RevJointDef.enableMotor         =       true;
    RevJointDef.enableLimit         =       false;
    b2RevoluteJoint *RevJoint       = (b2RevoluteJoint*)world->CreateJoint(&RevJointDef);

Und dann folgende Abfrage:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
        if(sf::Keyboard::IsKeyPressed(sf::Keyboard::Up))
        {
            RevJoint->SetMotorSpeed( 50.f);
            RevJoint->GetBodyB()->SetAwake(true);
        }
        if(sf::Keyboard::IsKeyPressed(sf::Keyboard::Down))
        {
            RevJoint->SetMotorSpeed(-50.f);
            RevJoint->GetBodyB()->SetAwake(true);
        }


MfG
Check

PS: Wer macht denn hier alles mit Box2D? Welche Physik-Engine benutzt ihr denn sonst so?

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

6

06.12.2011, 10:58

ich hatte schonmal angefangen, mir JBox2D bzw. Box2DX anzuschauen (mit Box2DX fühlt sich die Programmierung mehr nach einer C#-Programmierung an, als mit JBox2D nach einer Java-Programmierung, aber das ist was anderes), allerdings bin ich dabei noch nicht weit gekommen
deshalb kann ich dir bei Problemen wohl eher weniger helfen

andere Physik-Engine: wenn ich richtig bin, ist Newton Game Dynamics eine andere 2D-Physik-Engine (aufgelistet in unserem Wiki auf der Link-Sammlung)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

06.12.2011, 13:10

Newton ist eine 3D-Physik-Engine.
Mit Box2D fährt man schon gut. Ich hab's selber mal benutzt, für dieses Spiel hier:

[youtube]http://www.youtube.com/watch?v=9eTxvXByXwQ[/youtube]

Ist aber schon eine Weile her, und darum kann ich dir hier auch nicht helfen.
Aber geh doch wirklich mal ins Box2D-Forum, oder hast du Angst vor den fremden Leuten? ;)

8

06.12.2011, 13:36

Ich habe immer Angst, dass man mich falsch versteht.
Ich verstehe Englisch, doch meine Grammatikfehler, wenn ich einen eigenen Satz bilde, sind durchaus nicht ohne. :lol:
Naja, danke für eure kompetenten Antworten! (nicht ironisch verstehen :])
Ich werde nun dort nachfragen, und weil ich denke, dass es euch interessieren könnte, oder dass es einem Besucher, durch eine Suchmaschine hergeleitet, helfen könnte, werde ich euch die "Lösung" präsentieren.

MfG
Check

Nexxtron

Alter Hase

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

9

06.12.2011, 15:42

also bei mir gehts es mit folgenden Werten:

C-/C++-Quelltext

1
2
3
4
 jointDef.enableLimit = false;
                jointDef.maxMotorTorque = 100000.0f;
                jointDef.motorSpeed = 3.0f;
                jointDef.enableMotor = true;



wenn es bei dir nicht funktioniert, dann ist keiner von den 2 Bodys Dynamic oder die Bodys haben FixedRotation = true oder du hast das Flag CollideConnected an. Und wenn alles nichts hilft, dann hab ich auch keine Ahnung :D
New Project: Operation CityRacer

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Nexxtron« (06.12.2011, 17:39)


10

06.12.2011, 21:12

Klappt auch nicht.
Einer der Bodies ist ja statisch. Das sollte "MiniRectBody" sein.
Ich weiß nun nicht, wie ich eine Achse erstelle, die das Objekt einfach mit der Welt verbindet. ^^
Oder muss ich erst mühselig einen statischen erstellen, darunter den MiniRectBody der dann auf dynamisch ist und mit einem b2DistanceJoint mit dem erstellten statischen Objekt verbunden ist und dann mit dem b2RevoluteJoint fortfahren?

MfG
Check

Werbeanzeige