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

Anonymous

unregistriert

1

29.08.2007, 16:20

Rotation des Spielers aus Mauszeigerposition berechnen (2D)

Hallo!

Ich habe ein Problem mit dem ich mich schon länger beschäftig habe, aber bisher leider immer noch keine Lösung gefunden habe. Hier im Forum konnte ich auch nichts finden.

Also zu meinem Problem:
Ich möchte das meine Spielfigur immer zum Mauszeiger hinblickt. Doch iwie tue ich mich schwer damit, die benötigte Gradzahl zur Rotation des Spielers aus den beiden (2D-)Vektoren zu berechnen....

Grüße Frede

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

29.08.2007, 16:29

Einfach:

C-/C++-Quelltext

1
float a = atan2( y, x ) * 180.0 / PI;
@D13_Dreinig

Anonymous

unregistriert

3

29.08.2007, 16:37

Könntest du bitte wenigstens eine KLEINE Erklärung dazu geben???

Für mich sieht das aber eher falsch aus, da dort ja nicht zwei Vektoren sondern nur ein Vektor mit einbezogen wird...

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

4

29.08.2007, 16:37

Das is ma ganz einfache Vektormathematik. wenn wir mal annehmen, deine beiden vektoren heissen OrtsVektorSpieler und Mauspos, kannste den winkel wie folgt berechnen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
D3DXVECTOR2 diff; 

D3DXVec2Subtract(&diff,Mauspos,OrtsVektorSpieler);

float winkel = diff.x / D3DXVec2Length(&diff);

//jetzt hast den cos des winkels muste blos noch rückrechnen

winkel = arccos(winkel); //im Bogenmaß

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

5

29.08.2007, 16:43

Zitat von »"David_pb"«

Einfach:

C-/C++-Quelltext

1
float a = atan2( y, x ) * 180.0 / PI;


kannst du mir mal bitte erklären wie du darauf gekommen bist? Bin zwar Mathe leistungskurs aba die formel macht mir sorgen... :roll:

Anonymous

unregistriert

6

29.08.2007, 16:47

@ TrommlBomml:
Jau, danke. Kanns grade nicht ausprobieren, aber sieht schonmal besser aus.
Ein Problem gibt es aber leider noch: Ich arbeite mit OpenGL und habe deshalb die ganzen D3DX-Sachen nicht. Ich habe mir einfach die Vektor-Klasse der Tribase abgeschrieben. Wenn ich das ganze dann mit der TB-Vektorklasse benutzen würde, wäre das dann so richtig? (Wenn ich die Rotation in Grad haben möchte?)

C-/C++-Quelltext

1
2
3
4
5
tbVector2 diff; 

diff=Mauspos-OrtsVektorSpieler;

float winkel = diff.x / tbVector2Length(diff);


mfg Frede

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

7

29.08.2007, 17:04

jo vom grundsatz her is die "übersetzung" richtig. David hat ja sicherlich überladene operatoren für seine Klassen gemacht *gg*. aber hier erhälst du auch nur den Kosinus-wert des Winkels. ich weis ja nicht wie du das mit den spieler machst. Wenn du das Quad drehst mit einer Matrix dann müsstest du blos noch arccos von winkel machen und dann die rotationsfunktion von opengl aufrufen.
da es aber glaub ich keine arccos funktion gibtmüsstest du das über umwege mit arctan machen. ansonsten nimm das was david geschireben hat. der weis schon was er macht

Anonymous

unregistriert

8

29.08.2007, 17:08

Ok!
Aber gibt es nicht die Funktion "acosf"?
Frede

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

9

29.08.2007, 17:14

jup da hätt ioch ja auch drauf kommen können :( egal damit müsste es gehen

Anonymous

unregistriert

10

29.08.2007, 17:32

So, hab jetzt das ganze ausprobiert und musste leider feststellen, das keine der beiden Wege bei mir funktioniert haben.

Meine Quelltext sieht jetzt so aus:

C-/C++-Quelltext

1
2
diff=MausVektor-SpielerVektor;
Spielerrotation=diff.x/Length(diff);

Das hat leider nicht funktioniert, aber als ich dann den Code etwas umgewandelt habe, hat es eingeschränkt geklappt:

C-/C++-Quelltext

1
2
diff=MausVektor-SpielerVektor;
Spielerrotation=diff.x/Length(diff) * 180.0f / PI;


Die Funktionsfolge hab ich mal in einem Bitmap festgehalten:

(Link)


In dem grünen Bereich stimmte die Rotation völlig. Sobald sich die Maus aber in Richtung bzw. in dem orangen Bereich bewegte, kommt der Spieler nicht mehr mit. Ist die Maus im weißen Bereich, funktioniert die Rotation des Spielers halb korrekt: Er rotiert als wenn die Maus in der oberen Hälfte wäre, also eigentlich falsch.
Weiß jemand eine Lösung???
Ich kenn mich mit Vektorrechnungen und so noch nicht so aus.

Vielen Dank im Voraus :)

mfg Frede

Werbeanzeige