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

11.11.2015, 19:46

Bewegung in Richtung in die ein Objekt "schaut"

Guten Abend an alle :)
Ich habe ein Objekt, eine Maus mit Gesicht, und ich würde gerne das Objekt rotieren und dann in die Richtung vorwärts bewegen in die es schaut.
Zunächst einmal zur Bewegung in die Richtung, in die es schaut:
Die Blickrichtung lässt sich doch durch den Rotationswinkel berechnen. Bekomme ich dann durch diesen Vektor die "richtige" Bewegung hin?
Oder macht man das mit einer Matrix und Transformationen?

Könnt ihr mir bitte eine kleine Anleitung geben?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

11.11.2015, 19:55

Du kannst es mit einer Matrix lösen, indem du den lokalen Vorwärtsvektor des Objekts in den World-Space transformierst und das Ergebnis als Bewegungsvektor benutzt. Du kannst den Bewegungsvektor aber auch mit Sinus/Kosinus direkt aus dem/den Rotationswinkel(n) (2D oder 3D?) berechnen.

3

11.11.2015, 20:06

Hey David, vielen Dank für deine Antwort. Stimmt hatte ich ganz vergessen zu sagen, es geht um 2D hier.

"... indem du den lokalen Vorwärtsvektor des Objekts in den World-Space transformierst..."


Wie genau mache ich das?

Sorry leider bin ich doch noch Neuling in dem ganzen und mir reichen Tutorials in denen der Sachverhalt in paar Sätzen erklärt wird leider nicht. :(

Gibt es eigentlich gute Tutorials/ Bücher (auch englisch) die einem das Ganze ausführlich erklären?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »ul5391« (11.11.2015, 20:12)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

11.11.2015, 20:22

Fangen wir vielleicht mal damit an: Wie genau rotierst du denn dein Objekt?

5

11.11.2015, 21:43

Aus dem Rotationswinkel kann man einen Vektor erstellen:
v = [x: cos(Rotationswinkel); y: sin(Rotationswinkel)]

Die neue Position ist dann: alte Position + v * Geschwindigkeit.

Ich hoffe das hilft dir weiter, ansonsten schau dir mal das hier an: https://de.wikipedia.org/wiki/Polarkoordinaten

Superwayne

Treue Seele

Beiträge: 242

Beruf: Student & App Entwickler (Xamarin)

  • Private Nachricht senden

6

12.11.2015, 01:18

Aus dem Rotationswinkel kann man einen Vektor erstellen:
v = [x: cos(Rotationswinkel); y: sin(Rotationswinkel)]

Die neue Position ist dann: alte Position + v * Geschwindigkeit.

Ich hoffe das hilft dir weiter, ansonsten schau dir mal das hier an: https://de.wikipedia.org/wiki/Polarkoordinaten

Dazu sei noch angemerkt, dass die Formel davon abhängt, in welche Richtung ein Rotationswinkel von 0 zeigt. Die Formel, wie sie oben steht, ist gültig, wenn ein Rotationswinkel von 0 nach rechts zeigt. Zeigt er stattdessen nach oben (z.B. default im Unity 2D Modus) ist x = -sin(Rotationswinkel) und y = cos(Rotationswinkel).
Sollte ich mich irren, bitte schnell korrigieren ;)

SlinDev

Treue Seele

Beiträge: 142

Wohnort: Lübeck

Beruf: Programmierer

  • Private Nachricht senden

7

12.11.2015, 14:49


Dazu sei noch angemerkt, dass die Formel davon abhängt, in welche Richtung ein Rotationswinkel von 0 zeigt. Die Formel, wie sie oben steht, ist gültig, wenn ein Rotationswinkel von 0 nach rechts zeigt. Zeigt er stattdessen nach oben (z.B. default im Unity 2D Modus) ist x = -sin(Rotationswinkel) und y = cos(Rotationswinkel).
Sollte ich mich irren, bitte schnell korrigieren ;)

Wie das 2D Koordinatensystem dabei aussieht ist völlig egal. Deine Variante ist senkrecht zu dem eigentlichen Vektor!?

Es mehrere Lösungen etwas in Rotationsrichtung zu bewegen. Das übersichtlichste ist meiner Meinung nach das Transformieren des lokalen Bewegungsvektors mit einer Rotationsmatrix.
Alternativ kannst du aber auch wie hier vorgeschlagen den Vorwärtsvektor bestimmen und wenn du nur vorwärts bewegen willst bist du damit auch schon fertig. Wenn du aber beliebige lokale Bewegungen machen möchtest brauchst du auch noch einen dazu senkrechten Vektor. Wenn du diese entsprechend mit deiner Bewegung in die entsprechende Richtung skalierst und dann die Summe der beiden bildest sieht das ziemlich schnell genauso aus wie mit der Transformationsmatrix.

Superwayne

Treue Seele

Beiträge: 242

Beruf: Student & App Entwickler (Xamarin)

  • Private Nachricht senden

8

12.11.2015, 16:09


Dazu sei noch angemerkt, dass die Formel davon abhängt, in welche Richtung ein Rotationswinkel von 0 zeigt. Die Formel, wie sie oben steht, ist gültig, wenn ein Rotationswinkel von 0 nach rechts zeigt. Zeigt er stattdessen nach oben (z.B. default im Unity 2D Modus) ist x = -sin(Rotationswinkel) und y = cos(Rotationswinkel).
Sollte ich mich irren, bitte schnell korrigieren ;)

Wie das 2D Koordinatensystem dabei aussieht ist völlig egal. Deine Variante ist senkrecht zu dem eigentlichen Vektor!?

Das war vielleicht etwas ungünstig formuliert. Entscheidend ist, in welche Richtung die Grafik bei Rotationswinkel r = 0 guckt. cos(0) ist ja 1 und sin(0) ist 0. Das heißt, wenn mein Rotationswinkel auf 0 steht und ich mich in Richtung (cos(r) | sin(r)) bewege, bewege ich mich nach Rechts. Meine Top-Down Grafik hat damals bei 0 aber nach oben gezeigt. Dann hat sie sich optisch nach rechts bewegt statt geradeaus. Deswegen musste ich -sin(r) und cos(r) nehmen.

9

12.11.2015, 22:15

Vielen lieben Dank für alle Antworten :)

Fangen wir vielleicht mal damit an: Wie genau rotierst du denn dein Objekt?
Ich verwende die Godot Engine, hier besitzt jedes Objekt neben der Position auch ein Rotationswinkel, den ich manipulieren kann.
Aber ich werde nun mal probieren mit einer eigenen Rotationsmatrix das Objekt zu rotieren.
Es mehrere Lösungen etwas in Rotationsrichtung zu bewegen. Das übersichtlichste ist meiner Meinung nach das Transformieren des lokalen Bewegungsvektors mit einer Rotationsmatrix.
Wie genau kann man die Rotationsmatrix dazu verwenden? Ich dachte man multipliziert den Positionsvektor mit der Rotationsmatrix, um so den Positionsvektor zu rotieren? Und wie genau kann man nun die Rotationsmatrix dazu verwenden, um sich in eine bestimmte Richtung zu bewegen?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

12.11.2015, 22:38

Fangen wir vielleicht mal damit an: Wie genau rotierst du denn dein Objekt?
Ich verwende die Godot Engine, hier besitzt jedes Objekt neben der Position auch ein Rotationswinkel, den ich manipulieren kann.
Aber ich werde nun mal probieren mit einer eigenen Rotationsmatrix das Objekt zu rotieren.

Naja, die Frage ist, ob die von dir verwendete Engine die Möglichkeit bietet, direkt eine Matrix anzugeben. Falls nicht, dann einfach die bereits präsentierte Lösung über Sinus und Kosinus verwenden (die Rotationsmatrix basiert im Endeffekt darauf)...

Es mehrere Lösungen etwas in Rotationsrichtung zu bewegen. Das übersichtlichste ist meiner Meinung nach das Transformieren des lokalen Bewegungsvektors mit einer Rotationsmatrix.
Wie genau kann man die Rotationsmatrix dazu verwenden? Ich dachte man multipliziert den Positionsvektor mit der Rotationsmatrix, um so den Positionsvektor zu rotieren? Und wie genau kann man nun die Rotationsmatrix dazu verwenden, um sich in eine bestimmte Richtung zu bewegen?

Der von dir gesuchte Vektor bildet eine der Spalten der Rotationsmatrix... ;)

Werbeanzeige