GLBasic forum

Other languages => GLBasic - de => Topic started by: WPShadow on 2008-Jan-24

Title: Mathe für Schranz0r
Post by: WPShadow on 2008-Jan-24
Hi!

Hast du Bock auf Mathe? Ich bastle seit gestern Abend dran herum, aber die blöden Vektoren machen alles, bloß das nicht, was ich möchte... =/

Was ich brauche, ist ein Wert, der sich auf X & Y, je nach Winkel aufteilt, also:

0°:  X = 5000 Y = 0

45°: X = 2500 Y = 2500

90°: X = 0 Y = 5000

usw.

Soweit funktioniert es bei mir ja auch, aber wenn ich in den negativen Bereich gehe, dann fährt mein Ding rückwörds. Und ich bin bei Gott nicht der geborene Mathematiker!

Bitte Hilfe?

Gruß

W.
Title: Mathe für Schranz0r
Post by: Kitty Hello on 2008-Jan-24
Also, die Koordinaten, wenn Du ein Quadrat mit einer schrägen linie schneidest?
Title: Mathe für Schranz0r
Post by: WPShadow on 2008-Jan-24
Kurz erklärt:

Ich möchte ja mein Raumschiff beschleunigen. Dafür benutze ich NewtonBodyAddForce (oder so). Auf jeden Fall benutze ich force[0] und force[1]. Problem ist, daß ich die Kräfte, je nach Winkel aufteilen muß. Und da liegt auch schon mein Problem...

Gewissermaßen eine Beschleunigung gerade aus (also Gas geben) und den Winkel verändern, in dessen Richtung ich fliegen möchte und in die die Kraft wirkt.

Mit 5000 meine ich eigentlich die Kraft, die wirkt und die auf force[] aufgeteilt werden soll...
Title: Mathe für Schranz0r
Post by: bigsofty on 2008-Jan-24
*Cough*ATAN2*Cough* request :P
Title: Mathe für Schranz0r
Post by: Kitty Hello on 2008-Jan-24
force[0] = cos(phi) * kraft
force[1] = -sin(phi) * kraft

ATAN is ATAN"2" (has 2 parameters)
Title: Mathe für Schranz0r
Post by: bigsofty on 2008-Jan-24
Atan and Atan2 are quite different? ATAN2 is needed to select the correct quadrant for the angle, maybe it should be called ATAN2?

Quoteatan() takes x and returns y of arc tangents (in radians)

atan2() takes two arguments and returns quadrant correct arc tangents z (in radians)
Good to know its in though! ;)
Title: Mathe für Schranz0r
Post by: WPShadow on 2008-Jan-24
Supersupersuper Danke!
Title: Mathe für Schranz0r
Post by: Kitty Hello on 2008-Jan-24
atan returns -180 ... +180
atan2 returns the full -180 ... 180 ... -180
Title: Mathe für Schranz0r
Post by: bigsofty on 2008-Jan-24
I realise that Gernot, but nearly every language under the sun has ATAN and ATAN2. In this case ATAN takes 2 parameters and acts like ATAN2. It kinda makes it non standard for formulae. This is really just a question of syntax rather than functionality. I'd put in the correct function names for clarity.
Title: Mathe für Schranz0r
Post by: WPShadow on 2008-Jan-24
HI!

Nächstes Problem! Wie kriege ich die aktuelle Rotation raus? Ich vermute ich brauche mit

NewtonBodyGetMatrix
NewtonBodySetMatrix

Ich habe es nicht hinbekommen mat[] ein oder auszulesen. Problem dabei ist, daß ich im Prinzip die Bewegung jetzt hinbekommen habe, aber der Winkel der Rotation nicht übereinstimmt.

Ich möchte nämlich den aktuellen Winkel (0 - 359) direkt ans  Schiff übergeben, damit die Richtung mit der Rotation wieder übereinstimmt.

Gruß

W.
Title: Mathe für Schranz0r
Post by: Schranz0r on 2008-Jan-24
Haste Code dazu ?
Title: Mathe für Schranz0r
Post by: WPShadow on 2008-Jan-24
Hier ist der Code. Wie genau kann ich da machen?


Code (glbasic) Select
//================================
// TIMER

lost_init_timer()

//================================






NewtonBodySetPosition(ownship, 0,0,0)
//
NewtonConvexCollisionCalculateInertialMatrix(ownship, 1)
//
NewtonBodySetForceAndTorqueCallback(ownship)
//
NewtonBodySetAutoFreeze(ownship, FALSE)

NewtonSetWorldSize(minp[], maxp[])

// Hauptschleife

WHILE TRUE

MOUSESTATE mx, my, b1, b2



//lost_interface_main()



NewtonUpdate(lost_GT, 0)

// force[0] = -MOUSEAXIS(0)*3
// force[2] = -MOUSEAXIS(1)*3

//force[0] = COS(phi) * 5000
//force[2] = -SIN(phi) * 5000
//
//force[1] = 500

//=====================================================
IF KEY(200) = 1
force_a[0] = COS(phi) * 5000
force_a[2] = -SIN(phi) * 5000
ELSE
force_a[0] = 0
force_a[2] = 0
NewtonBodySetLinearDamping(ownship, 5.9)
ENDIF
NewtonBodyAddForce(ownship, force_a[])
//=====================================================
IF KEY(203) = 1
force[1] = -5000
phi = phi - 1
IF phi < 0 THEN phi = 359

ELSE
force[1] = 0
NewtonBodySetAngularDamping(ownship, rotdamping[])
ENDIF
NewtonBodyAddTorque(ownship, force[])

//force[0] = -MOUSEAXIS(0)*300
//force[1] = -MOUSEAXIS(0)*3000
Das ist bloß ein kurzer Auszug, also nicht aufregen...

Im übrigen ist es gerade NewtonBodySetAngularDamping das nicht dazu paßt. Ich möchte im Prinzip das Raumschiff in die Richtung drehen, in die auch die Kraft zeigt. Und das macht es etwas schwierig...
Title: Mathe für Schranz0r
Post by: Kitty Hello on 2008-Jan-25
Naja, mach eine Matrix mit NewtonBuildMatrix, dann überschreib die Werte [12]...[14] mit den originalen (das ist x,y,z - Position). Dann wieder ans Objekt ranpacken.
Title: Mathe für Schranz0r
Post by: WPShadow on 2008-Jan-25
Das habe ich schon versucht, aber mir hat das Ding bloß Fehler ausgespuckt sobald ich versucht habe mat[1] o.ä. zuzuweisen, bis ich einfach nur mat[] eingegeben habe. Und ganz egal, was ich versucht habe mat[] zuzuweisen, ob manuell, mit DIMDATA oder sonst wie, das Ding hat sich gewehrt, ohne Ende.

Kannst du mir ein kleines Beispiel geben, wie ich das angehen kann? Einen Fingerzeig, damit ich weiß, wie ich weiter machen muß?
Title: Mathe für Schranz0r
Post by: Schranz0r on 2008-Jan-25
So da hast du!

Mit NewtonBodyGetPositionX bis Z kannst du ja die werte holen...
( Hab ich dir glaub auch mal gemacht oder? Steht jetzt aber standartmässig mit drin lustriger weise) :D

und damit kannst du übergeben:

FINGERZEIG->

Code (glbasic) Select
FUNCTION NewtonBodySetPositionX: body_index, posX
LOCAL mat[]
NewtonBodyGetMatrix(body_index,mat[])
mat[12] = posX
NewtonBodySetMatrix(body_index,mat[])
ENDFUNCTION

FUNCTION NewtonBodySetPositionY: body_index, posY
LOCAL mat[]
NewtonBodyGetMatrix(body_index,mat[])
mat[13] = posY
NewtonBodySetMatrix(body_index,mat[])
ENDFUNCTION

FUNCTION NewtonBodySetPositionZ: body_index, posZ
LOCAL mat[]
NewtonBodyGetMatrix(body_index,mat[])
mat[14] = posZ
NewtonBodySetMatrix(body_index,mat[])
ENDFUNCTION
Title: Mathe für Schranz0r
Post by: WPShadow on 2008-Jan-25
Hi!

Ich habe gerade folgendes entnommen:

//?   FOR jedes Körperteil:
//?   NewtonBuildMatrix(0,0,90,x,y,z, M[])

Aufgrund dieses Beispiels habe ich folgendes versucht:

NewtonBuildMatrix(phi, 0, 0,NewtonBodyGetPositionX(ownship), NewtonBodyGetPositionY(ownship), NewtonBodyGetPositionY(ownship), mat[])

Funktioniert aber nicht! Und zwar gar nicht. Nicht einmal eine minimale Bewegung dahinter!!!

Was kann ich machen?
Title: Mathe für Schranz0r
Post by: Kitty Hello on 2008-Jan-26
X, Y, Y ???

Ja, und dann hast Du eine Matrix - aber was machst Du damit?
NewtonBodySetMatrix(ownship, mat[])
Title: Mathe für Schranz0r
Post by: WPShadow on 2008-Jan-26
Hi!

Funzt super! Des Rätsels Lösung war eigentlich ganz simpel!

Code (glbasic) Select
NewtonBuildMatrix(0, phi, 0,NewtonBodyGetPositionX(ownship), NewtonBodyGetPositionY(ownship), NewtonBodyGetPositionZ(ownship), mat[])
NewtonBodySetMatrix(ownship, mat[])
Danke danke danke!!!

Aber mir bleibt da noch eine Frage wegen dem Timer! Und zwar benutze ich

Code (glbasic) Select
FUNCTION lost_timer:

//+++++++++++++++++++++++++++++++++++
GT=(GETTIMERALL()-Old_Timer)/1000
Old_Timer=GETTIMERALL()
//+++++++++++++++++++++++++++++++++++
lost_GT = GT * lost_zeitlupe
//+++++++++++++++++++++++++++++++++++

ENDFUNCTION
Jetzt habe ich das Problem, daß das Spiel auf meinem Laptop langsamer, aber auf meinem Rechner viel schneller läuft. Dabei sollte der Echtzeittimer Frameratenunabhängig laufen. Hast du da eine Idee???

Gruß

W.
Title: Mathe für Schranz0r
Post by: Kitty Hello on 2008-Jan-26
Newtonupdate(GT, 4);
Title: Mathe für Schranz0r
Post by: WPShadow on 2008-Jan-26
Habe ich gerade auf beiden Rechnern ausprobiert. Am PC ist das Bild ca. 4mal so schnell, auch mit deiner Einstellung. Habe herum experimentiert. Habe den Wert auf (GT, 10) raufgestellt, macht aber keinen Unterschied. Da kann ich machen was ich will...
Title: Mathe für Schranz0r
Post by: BumbleBee on 2008-Jan-26
Hi WPShadow

Das kann gar nicht sein. Das lief doch vor 2 Jahren (oder wie lang ist das schon her):D auch normal. Ich hab das schon auf mehreren PC's getestet. Von alt bis neu. Immer gleich. Starte mal und sag mir wie lang  das Quadrat auf deinem Rechner von  links nach rechts braucht Alle Auflösungen durch, mit dem Beispiel unten.
Code (glbasic) Select
LIMITFPS -1 //Ganz wichtig

Speed=100;X=-50

                   //Loop
//---------------------------------------------------

WHILE TRUE

               //GameTimer
  //+++++++++++++++++++++++++++++++++++
    GT=(GETTIMERALL()-Old_Timer)/1000
    Old_Timer=GETTIMERALL()
  //+++++++++++++++++++++++++++++++++++
                 
   X=X+Speed*GT
   DRAWRECT X,100,50,50,RGB(255,0,0)        

//Bei einer Auflösung von 640 * 480 Pixel und einem Speed von 100 Pixel
//beträgt die Zeit 640 / 100 = 6.4 Sekunden bis zum rechten Rand

//Bei einer Auflösung von 800 * 600 Pixel und einem Speed von 100 Pixel
//beträgt die Zeit 800 / 100 = 8 Sekunden bis zum rechten Rand

                    //Zeit messen
  t2=GETTIMERALL()
   IF t2 > t1 + 1000 //Sekunden
     Time=Time+ 1
     t1=t2
   ENDIF

                   
  PRINT "Time " + Time , 50,50

SHOWSCREEN
WEND
Das Quadrat braucht also bei der Auflösung von 800 * 600 = 8 Sekunden von links nach rechts
wenn Speed = 100 ist. (800 / Speed = 8). Bei Speed = 50 halt dann doppelt so lang. Das wär dann vielleicht deine Zeitlupe.;)  


Cheers
Title: Mathe für Schranz0r
Post by: WPShadow on 2008-Jan-26
Das ist nicht das Problem! So wie du das Programm geschrieben hast, läuft das problemlos, aber wenn man das mit

NewtonUpdate

zusammen benutzt, dann läuft das auf verschiedenen Rechnern verschieden schnell! Und das ist irgendwie seltsam...
Title: Mathe für Schranz0r
Post by: Schranz0r on 2008-Jan-26
Und wenn du den Timer bei NewtonUpdate reinpackst, als übergabewert?!
Title: Mathe für Schranz0r
Post by: WPShadow on 2008-Jan-26
Ok, keine Ahnung, wie du meinst?!?

Ich habe im Prinzip den Wert GT als Timer reingepackt...
Code (glbasic) Select
 //+++++++++++++++++++++++++++++++++++
    GT=(GETTIMERALL()-Old_Timer)/1000
    Old_Timer=GETTIMERALL()
  //+++++++++++++++++++++++++++++++++++

...

Newtonupdate(GT, 4)
Title: Mathe für Schranz0r
Post by: Schranz0r on 2008-Jan-26
ah hast du schon Hmmmm
Title: Mathe für Schranz0r
Post by: Kitty Hello on 2008-Jan-27
Hmm. mach mal Netwonupdate (20,4)
Title: Mathe für Schranz0r
Post by: WPShadow on 2008-Jan-27
Geht auch nicht! Ca. 4 facher Geschwindigkeitsunterschied, ganz egal was ich mache.

Ich teste immer mit identischem Programm.