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

FlyingDragon

Frischling

  • »FlyingDragon« ist der Autor dieses Themas

Beiträge: 38

Wohnort: Sachsen

Beruf: Consultant / Software Architekt

  • Private Nachricht senden

1

17.07.2014, 12:16

Wie bewegt man einen Akteur mit einer Physik-Engine (ODE)?

Hallo,

ich bin gerade dabei mich in die ODE und irrlicht3D einzuarbeiten. Ich habe jetzt eine kleine Szene mit Würfeln gebaut, die sich dank der Physik-Engine gegenseitig beeinflussen. Ich möchte jetzt einen Akteur (einen Spieler) in die Szene setzen und diesen über Tastatur oder Gamepad bewegen. Die Objekte in der Szene sollen auf den Akteur reagieren, z.B. indem Würfel zur Seite geschoben werden (Animation ist noch unwichtig). Welche Eigenschaften sollte der Akteur haben und wie bewege ich diesen Akteur mit ODE?

Ich verwende die ODE-Klassen für die Physik. Sie entsprechen aber den Funktionsaufrufen. Mein Ansatz sieht bisher wie folgt aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
            class AbstractGameObject : public GameObject {
            public:

                AbstractGameObject();
                ~AbstractGameObject();

                void setPosition(float x, float y, float z);
                void setRotation(float rotation);

                inline const irr::scene::ISceneNode* getSceneNode() const {
                    return _sceneNode;
                }

                inline const dBody& getBody() const {
                    return _body;
                }


            protected:
                irr::scene::ISceneNode* _sceneNode;
                dBody                   _body;
            };

            class ActorImpl : public AbstractGameObject, public Actor {
            public:
                ActorImpl();
                ~ActorImpl();
                void update(float delta);

                void setPosition(float x, float y, float z);
                void setRotation(float rotation);
                void move(float x, float y);
            protected:
                dSphere _cylinder;

            };

Bewegt wird der Akteur über die Move-Methode, welche eine Kraft auf den Körper (_body) des Akteurs setzt.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void ActorImpl::update(float delta) {

    // get the position from the physic engine and set the position of the scene node
    const dReal* pos = _body.getPosition();
    const dReal* rot = _body.getRotation();

    _sceneNode->setPosition(irr::core::vector3df(pos[0], pos[1], pos[2]));
    _sceneNode->setRotation(convertOdeMatrixToIrrRotationDegrees(rot));
}

void ActorImpl::move(float x, float y) {

    // set movement as force to the body
    dReal force[3];
    force[0] = x * 5000.0;
    force[1] = 0.0f;
    force[2] = y * 5000.0;
    _body.setForce(force);
}

Die move-Methode wird nach der Eingabebehandlung aufgerufen und bekommt einen normalisierten Richtungsvektor übergeben. Mir fehlt hier leider der Ansatz. Soll ich das nur setPosition aufrufen?

Ich bin für Hilfe und Ratschläge sehr dankbar.

Viele Grüße
Sven
Achtung! Das Lesen dieses Beitrags kann Ihnen und den Menschen in ihrer Umgebung erheblichen Schaden zufügen.
___________
Mein Leben, Freunde und die Spieleentwicklung