JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=11e171ec7b3dc561f76ce2021aae9b58Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Aus (XSpeed, YSpeed) den Winkel berechen

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 26.03.2004, 14:43    Titel: Aus (XSpeed, YSpeed) den Winkel berechen Antworten mit Zitat

Ich programmiere gerade eine Art Worms.
Der Panzer besitz Werte für den aktuellen Winkel und die Schußstärke.

Diese beiden Werte rechnen ich nun beim schießen in eine X und eine Y Geschwindigkeit um (mit sinus und cosinus), mit deren Hilfe ich dann die Flugbahn darstellen kann.

Das Projektil soll sich im Flug aber drehen, also brauch ich eine FUnktion, mit der ich aus der X und der Y Geschwindigkeit den Winkel berechnen kann.

normalerweise sollte das ja so ähnlich gehen wie das Umrechnen der Winkel/Geschwindigkeit ind YSpeed/YSpeed. Ich bräuchte also so eine Art Umkehrfunktion für sinus und cosinus.

So berechne ich die X und Y Geschwindigkeiten:
Code:

m_YSpeed=cosf(Winkel*D3DX_PI/180)*Speed;
m_XSpeed=sinf(Winkel*D3DX_PI/180)*Speed;


Ich hab mir mal die math.h angeschaut, da gibt es ja ziemlich viele FUnktionen:
Code:

float  __cdecl acosf( float );
        float  __cdecl asinf( float );
        float  __cdecl atanf( float );
        float  __cdecl atan2f( float , float );
        float  __cdecl cosf( float );
        float  __cdecl sinf( float );
        float  __cdecl tanf( float );

Aber ich hab keine Ahnung, welche ich nehmen muss. (Vileicht atan2f() weil man 2 Werte (XSpeed, YSpeed) übergeben muss und einen (WInkel) zurückbekommt???)

Evtl. wäre es auch interesant, die Geschwindigkeit zu ermitteln z. B. für eine Rauchspur, aber das ist nicht so wichtig.

[edit]
Achja, ich hab mein Projekt mal hochgeladen:http://www.C3-Soft.de.vu/panzer.ace falls es sich mal einer anschauen will.
[/edit]
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
HotAcid
Super JLI'ler


Alter: 43
Anmeldedatum: 04.08.2002
Beiträge: 372
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 26.03.2004, 15:02    Titel: Antworten mit Zitat

die Arcus-Funktionen sind die Umkehrfunktionen der Trigonometrischen Dinger.

also:
asin(sin(x)) = x || wenn 0 <= x < 2*pi
acos(cos(x)) = x || wie oben

viele Grüße
Felix
_________________
StGB §§ 328 Abs. 2 Pkt 3:
Mit Freiheitsstrafe bis zu fünf Jahren oder mit Geldstrafe wird bestraft, wer eine nukleare Explosion verursacht.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 26.03.2004, 15:53    Titel: Antworten mit Zitat

OK, ich habs mal ausprobiert:

Code:

float t_Speed, t_Winkel;
   t_Speed=sqrt((m_XSpeed*m_XSpeed) + (m_YSpeed*m_YSpeed));
   t_Winkel=asinf(m_XSpeed/t_Speed);
   t_Winkel/=D3DX_PI/180;
   t_Winkel+=180;
   /*if(m_YSpeed<0)
   {
      t_Winkel+=90;
   }*/
   m_Sprite.SetRotation(t_Winkel);

Es funktioniert schon ein bisschen, wenn das Projektil seinen höchsten Ounkt erreciht hat, und dann runterfällt, stimmt es sogar ziemlich gut. Aber beim hochfliegen, hängt das Ding wie ein Schluck Wasser in einer Kurve (deswegen hab ich mal probiet es beim hochfliegen um 90 Grad zu drehen). Aber die Bewegung eiert noch sehr und sieht nicht so natürlich aus.

Falls jemand wissen möchte wie ich auf die Formel gekommen bin:

XSpeed=sin(W*PI/180)*Speed

XSpeed/Speed=sin(W*PI/180)

asin(sin(x))=x

W*PI/180=asin(sin(W*PI/180))

W*PI/180=asin(XSpeed/Speed) //siehe Zeile 2

W=asin(XSpeed/Speed)/(PI/180)

Speed²=XSpeed²+YSpeed² (Satz des Pythagoras)
Speed=sqrt(XSpeed²+YSpeed²) //Wurzelfunktion

So, es müsste doch eigentlich stimmen. Wo könnte denn da der Fehler liegen?
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 26.03.2004, 17:09    Titel: Antworten mit Zitat

Du musst im Bogenmaß rechnen. Oder benutzt deine Spriteklasse Grad?(Frag nur wegen der Umrechnung)
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 26.03.2004, 19:00    Titel: Antworten mit Zitat

Ne, das mit dem Winkel stimmt schon. Die Spriteklasse rechnet das wieder in Bogenmaß um. (ist zwar eigentlich nicht so effizietn, aber in anderen Programmen ist es einfacher direkt den Winkel angeben zu können)
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 26.03.2004, 19:31    Titel: Antworten mit Zitat

Du kannst den Winkel auch gleich mit dem Tangens ausrechnen: winkel = atan( SpeedX / SpeedY ). Damit erhälst du den Winkel den der Vektor mit der X-Achse einschließt. Ich verstehe nicht ganz, was du mit "hängt wie ein Schluck Wasser in der Kurve" meinst...
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 26.03.2004, 20:01    Titel: Antworten mit Zitat

wenn ich
Code:
t_Winkel=atan(m_XSpeed/m_YSpeed);

benutze, dreht sich das Geschoß gar nicht mehr.

Und das mit dem Wasser in der Kurve:
Beim hochfliegen eiert es (es dreht sich ein bisschen links, dann ein bisschen rechts). Wenn es an der Höchsten Stelle angekommen ist, ruckt es irgendwie ganz komisch.
Beim runterfallen sieht es dann gut aus.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 26.03.2004, 20:04    Titel: Antworten mit Zitat

Du musst wahrscheinlich den Wert wider in Grad umwandeln. Und bei dieser Methode musst du natürlich auch eine fehlerkontrolle einbauen. Sonnst hagelt es Ausnahmefehler Wink

Wenn ich mich recht erinnere habe ich irgendwo mal eine funktion gepostet die sowas kann was du suchst.

Code:
double TargetToAngle(double startx,double starty,double zielx,double ziely, double ow=0)
{
  double z=0.0174532925199433;
  double x=zielx-startx;
  double y=ziely-starty;
  if(x==0)
  {
    if(y==0)
      return ow;
    if(y>0)
      return 90;
    if(y<0)
      return 270;
  }
  if(y==0)
  {
    if(x>0)
      return 0;
    if(x<0)
      return 180;
  }
  if((x>0) && (y>0))  //NO
    return atan(y/x)/z;
  if((x<0) && (y>0))  //NW
    return 180+atan(y/x)/z;
  if((x>0) && (y<0))  //SO
    return 360+atan(y/x)/z;
  if((x<0) && (y<0))  //SW
    return 180+absf(float(atan(y/x)/z));
  return ow;
}

_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 26.03.2004, 20:17    Titel: Antworten mit Zitat

Ja, du hast recht. Bogenmaß in Winkel (hätt ich eigentlich selbst merken müssen)

deine Funktion hab ich noch nicht ausprobiert. Ich weiß nicht, welche Ausnahmefehler ich berücksichtigen muss, aber das was ich jetzt hab funktioniert perfekt:
Code:
t_Winkel=atan(m_XSpeed/m_YSpeed);
   t_Winkel/=D3DX_PI/180;
   if(m_YSpeed>0)
   {
      t_Winkel+=180;
   }
   m_Sprite.SetRotation(t_Winkel);

Das Projektil beschreibt eine wunderschöne Kurve. Danke!
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 26.03.2004, 21:04    Titel: Antworten mit Zitat

@angel: Die atan funktion fängt die Ausnahmen schon ab für 90 und 180 Grad.
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 27.03.2004, 10:39    Titel: Antworten mit Zitat

Interessant,... dsa werde ich dann für mich mal übernehmen, meine Funktion fand ich schon immer sehr überladen ^^
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum