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
|
Verfasst am: 26.03.2004, 14:43 Titel: Aus (XSpeed, YSpeed) den Winkel berechen |
|
|
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 |
|
|
HotAcid Super JLI'ler
Alter: 43 Anmeldedatum: 04.08.2002 Beiträge: 372 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 26.03.2004, 15:02 Titel: |
|
|
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 |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 26.03.2004, 15:53 Titel: |
|
|
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 |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 26.03.2004, 17:09 Titel: |
|
|
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 |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 26.03.2004, 19:00 Titel: |
|
|
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 |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 26.03.2004, 19:31 Titel: |
|
|
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 |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 26.03.2004, 20:01 Titel: |
|
|
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 |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 26.03.2004, 20:04 Titel: |
|
|
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
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 |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 26.03.2004, 20:17 Titel: |
|
|
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 |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 26.03.2004, 21:04 Titel: |
|
|
@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 |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 27.03.2004, 10:39 Titel: |
|
|
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 |
|
|
|