3d Bewegung eines Jets

Anfängerfragen zum Programmieren mit PureBasic.
D4uS1
Beiträge: 268
Registriert: 02.09.2006 12:16

3d Bewegung eines Jets

Beitrag von D4uS1 »

Ich brauche mal wieder eure Hilfe, allerdings geht es diesmal um Mathematik. Ich habe ein 3d Spiel, in dem man einen Jet Bewegen kann. (Arbeite mit Irrlicht falls das wichtig ist). Der Jet soll sich ja aber immer so bewegen, das es der Neigung entspricht. Wenn der Jet also nach unten geneigt ist, soll er sich nach unten bewegen und nicht nach vorne. Ich habe dazu eine Formel aufgeschrieben. Es hat etwas mit dem 90° Winkel zu tun. Hat der Jet an der X-Achse eine Neigung von 45°, teile ich diese durch 90 und dann bekomme ich das ergebnis. An der Z Achse bewegt sich der Jet also mit der halben Geschwindigkeit nach vorne. Wenn ich diese Rechnung aber durchführe kommt eine unsagbar Große Zahl als Ergebnis raus. Hier ein Beispielcode.

Code: Alles auswählen

define.d JetX, JetY, JetZ, BewegJetX, BewegJetY, BewegJetZ, NeigungX, NeigungY, NeigungZ

 Repeat
 ...blablabla

while IrrRunning()

    BewegJetZ = NeigungX/90
    BewegJetY = NeigungZ/90
    BewegJetZ + JetZ
    BewegJetY + JetY
    BewegJetX + JetX
    IrrSetNodePosition(*Jet, JetX, JetY, JetZ)
    IrrSetNodeRotation(*Jet, NeigungX, NeigungY, NeigungZ)
 
     If IrrKeyEventAvailable() 
      *Taste = IrrReadKeyEvent()
       Select *Taste\key
       Case #IRR_KEY_ARROW_UP
        If *Taste\direction = #IRR_KEY_DOWN
         NeigungX  -1
        endif
       Case #IRR_KEY_ARROW_DOWN
        If *Taste\direction = #IRR_KEY_DOWN
         NeigungX + 1
        endif
        EndIf
       Case #IRR_KEY_ARROW_LEFT
        If *Taste\direction = #IRR_KEY_DOWN
         NeigungZ  -1
        endif
        EndIf
       Case #IRR_KEY_ARROW_RIGHT
        If *Taste\direction = #IRR_KEY_DOWN
         NeigungZ + 1
        endif
       ;---Hier das Ganze noch mit Y, aber ich brauche zunächst ma nur die Z Achse
        EndIf
        
      Case #IRR_KEY_ESCAPE   
        If *Taste\direction = #IRR_KEY_DOWN
         Beenden = 1
        Else
         Beenden = 0
        EndIf
       EndSelect
    EndIf

wend
Until Beenden = 1
IrrStop()
FreeIrrlichtWrapperDLL()
Wie bereits gesagt kommt bei der BewegungJetZ bei mir über 200 Milliarden Raus, ich denke das die Variable hier an ihren Grenzwert stlößt. Aber warum? Oder gibt es eine Einfacherere Methode das mit der Neigung zu machen?
THEEX
Beiträge: 804
Registriert: 07.09.2004 03:13

Beitrag von THEEX »

Ich glaub, Du gehst das vom Ansatz her falsch an. Davon ausgehend, wie Du es machen möchtest, würde Dein Jet dadurch zu langsam voran kommen.
Gehe ich von einem Winkel mit 45 Grad aus und einer Geschwindigkeit von 1000 km/h, dann würde Deiner Rechenweise zufolge der Jet 500 km in Richtung z und 500 km in Richtung y fliegen. Dabei käme dieser aber nur ca 700 km weit.

Code: Alles auswählen

y = 500
z = 500
Debug Sqr(y * y + z * z)
THEEX
Beiträge: 804
Registriert: 07.09.2004 03:13

Beitrag von THEEX »

So wie das machen möchtest, müßte das etwa folgendermassen aussehen:

Code: Alles auswählen

Speed = 1000
Winkel = 45

yFaktor.f = Abs(Winkel / 90)
zFaktor.f = 1 - yFaktor

WegQuadrat = Speed * Speed 
z.f = Sqr(WegQuadrat * zFaktor)
y.f = Sqr(WegQuadrat * yFaktor)
Kontrolle.f = Sqr(y * y + z * z)

Debug z
Debug y
Debug Kontrolle
Allerdings würde ich das auch nicht empfehlen. Dein Winkel darf dabei nie größer als 90 Grad sein. Dabei kann die Neigung ja nach oben und unten gehn, was schonmal 180 Grad ist. Und dann gibt es ja noch die x-Achse und die mußt auch mit einkalkulieren.
D4uS1
Beiträge: 268
Registriert: 02.09.2006 12:16

Beitrag von D4uS1 »

Danke vielmals.
Hab das ganze erstmal erweitert, das es auch im negativen Bereich funktioniert.

Code: Alles auswählen

yFaktor.f = Abs(NeigungX / 90)
zFaktor.f = 1 - yFaktor
xFaktor.f = Abs(NeigungZ/90)

If NeigungY < 0
BewegJetZ.f = Sqr(zFaktor)/4
Else
BewegJetZ.f = Sqr(zFaktor)/4*-1
EndIf
If NeigungX < 0
 BewegJetY.f = Sqr(yFaktor)/4*-1
Else
 BewegJetY.f = Sqr(yFaktor)/4
EndIf
If NeigungZ < 0
 BewegJetX.f = Sqr(xFaktor)/4
Else
 BewegJetX.f = Sqr(xFaktor)/4*-1
EndIf

JetZ+BewegJetZ
JetY+BewegJetY
Zuletzt geändert von D4uS1 am 16.06.2007 13:59, insgesamt 1-mal geändert.
D4uS1
Beiträge: 268
Registriert: 02.09.2006 12:16

Beitrag von D4uS1 »

Aber ihr hattet recht, das is eine nicht sehr gute Lösung. Wie kann ich es denn eleganter machen?
D4uS1
Beiträge: 268
Registriert: 02.09.2006 12:16

Beitrag von D4uS1 »

Also ich bin mit meinen Ideen am Ende. Ich habe alles mögliche versucht aber ich finde eine gute Lösung.
D4uS1
Beiträge: 268
Registriert: 02.09.2006 12:16

Beitrag von D4uS1 »

Ich hab die Lösung gefunden. Man muss allerdings Einschränkungen machen. Die Neigung des Jets darf nicht mehr als 90 und weniger als -90 Crad auf der x Achse sein. Die Y Achse ist in dem Fall aber frei zu benutzen. Die Geschwindigkeit muss mit dem kehrwert berechnet werden. Eine größere Geschwindigkeit bedeuted hier ein langsameres FLugzeug.

Code: Alles auswählen

   Flugzeug\BewegZ = -(Cos((Neigung_FLugzeug_Y * 2 * #PI) / 360 )*200)/Flugzeug\Geschwindigkeit
   Flugzeug\BewegY = (Sin((Neigung_FLugzeug_X * 2 * #PI) / 360 )*200)/Flugzeug\Geschwindigkeit
   Flugzeug\BewegX = -(Sin((Neigung_Flugzeug_Y * 2 * #PI) / 360 )*200)/Flugzeug\Geschwindigkeit
   Flugzeug\x+Flugzeug\BEwegX
   Flugzeug\Z+Flugzeug\BewegZ
   Flugzeug\Y+Flugzeug\BEwegY
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

Ich kenn PB Irr jetzt nicht, aber kommst du denn da nicht an die Richtungsvektoren von Objekten rann? Dann ist doch die neue Position einfach alte_Position+(Richtungsvektor*geschwindigkeit).
D4uS1
Beiträge: 268
Registriert: 02.09.2006 12:16

Beitrag von D4uS1 »

Da bin ich überfragt :| . Ich bin erst in der 11 Klasse und habe noch keine Vektorenrechnung durchgenommen. Ich habe ka wie das funktioniert. Auf jeden Fall funktioniert das mit den Cos und Sin.

Gruß
Andreas
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

das mit den winkelfunktionen ist ja auch "vektorrechnung zu fuß"
also das was dahintersteckt, wenn man polarvektoren in koordinaten umrechnet.

deine beiden Neigungswinkel und die Geschwindigkeit sind der Richtungsvektor in Polardarstellung.
(Polardarstellung = Vektor wird beschrieben durch länge und richtung)

mit deinen formeln rechnest du das um in die Koordinaten-Darstellung.
der Richtungsvektor ist also (BewegX,BewegY,BewegZ)

Glückwunsch!
du beherrscht bereits einen der schwierigsten Teile der Vektorrechnung.


Zaphod meinte nun, ob dir Irrlicht nicht ermöglicht,
direkt auf die vektoren des objektes zuzugreifen,
dass du dir also deine rechnung sparen kannst
weil richtung und geschwindigkeit properties des objektes sind...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten