Hallo,
Ich möchte ein paar Figuren entlang eines Pfades bewegen, das funktioniert auch schon soweit. Jetzt sollen sich diese erst immer auf dem kürzest möglichen Weg in Richtung Ziel drehen, bevor sie weitergehen.
Das funktioniert eigentlich auch schon ganz gut, nur leider kommt es ab und zu zu Sprüngen, die ich mir nicht erklären kann. (Also keine Weiche Bewegung sondern eine instantane 180° Drehung z.B.)
Ich finde meine Lösung (das abfragen des Winkels zum Ziel) auch noch nicht besonders elegant, vielleicht liegt das Problem auch an der Umsetzung.
dt ist die vergangene Zeit.
speed ist der betrag der geschwindigkeit
position ist die position der Figur
velocity ist der geschwindigkeitsvektor
target ist das Ziel zu dem die Figur laufen soll
[HIGHLIGHT="Java"] public void update(float dt) {
// Ziel erreicht, nächstes auswählen
if (Vector2D.distanceSquare(position, target) <= speed*dt) {
nextTarget();
}
// move ist der Vektor von der Position zum Ziel
Vector2D move = Vector2D.sub(target, position);
// Winkel (rad) zwischen derzeitiger Bewegungsrichtung und Zielrichtung
float alpha = Vector2D.angle(velocity, move);
// Ermittelt ob Rechts- oder Linksdrehung erfordlich ist
float cP = Vector2D.crossProduct(move, velocity);
// Ist der Winkel größer als ein gewisser Grenzwert muss sich die Figur zunächst drehen (geht das nicht auch eleganter?)
if (alpha > 0.8f*dt) {
if (cP < 0) {
velocity = velocity.rotate(1.8f*dt);
} else {
velocity = velocity.rotate(-1.8f*dt);
}
} else {
// Ansonsten geht sie ganz normal Richtung Ziel
velocity = move.normalize();
velocity = Vector2D.scale(velocity, speed);
position = Vector2D.add(position, Vector2D.scale(velocity, dt));
}
}[/HIGHLIGHT]
Vielen Dank schonmal,
mfg
Ich möchte ein paar Figuren entlang eines Pfades bewegen, das funktioniert auch schon soweit. Jetzt sollen sich diese erst immer auf dem kürzest möglichen Weg in Richtung Ziel drehen, bevor sie weitergehen.
Das funktioniert eigentlich auch schon ganz gut, nur leider kommt es ab und zu zu Sprüngen, die ich mir nicht erklären kann. (Also keine Weiche Bewegung sondern eine instantane 180° Drehung z.B.)
Ich finde meine Lösung (das abfragen des Winkels zum Ziel) auch noch nicht besonders elegant, vielleicht liegt das Problem auch an der Umsetzung.
dt ist die vergangene Zeit.
speed ist der betrag der geschwindigkeit
position ist die position der Figur
velocity ist der geschwindigkeitsvektor
target ist das Ziel zu dem die Figur laufen soll
[HIGHLIGHT="Java"] public void update(float dt) {
// Ziel erreicht, nächstes auswählen
if (Vector2D.distanceSquare(position, target) <= speed*dt) {
nextTarget();
}
// move ist der Vektor von der Position zum Ziel
Vector2D move = Vector2D.sub(target, position);
// Winkel (rad) zwischen derzeitiger Bewegungsrichtung und Zielrichtung
float alpha = Vector2D.angle(velocity, move);
// Ermittelt ob Rechts- oder Linksdrehung erfordlich ist
float cP = Vector2D.crossProduct(move, velocity);
// Ist der Winkel größer als ein gewisser Grenzwert muss sich die Figur zunächst drehen (geht das nicht auch eleganter?)
if (alpha > 0.8f*dt) {
if (cP < 0) {
velocity = velocity.rotate(1.8f*dt);
} else {
velocity = velocity.rotate(-1.8f*dt);
}
} else {
// Ansonsten geht sie ganz normal Richtung Ziel
velocity = move.normalize();
velocity = Vector2D.scale(velocity, speed);
position = Vector2D.add(position, Vector2D.scale(velocity, dt));
}
}[/HIGHLIGHT]
Vielen Dank schonmal,
mfg
Zuletzt bearbeitet von einem Moderator: