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