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.
Also, die Koordinaten, wenn Du ein Quadrat mit einer schrägen linie schneidest?
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...
*Cough*ATAN2*Cough* request :P
force[0] = cos(phi) * kraft
force[1] = -sin(phi) * kraft
ATAN is ATAN"2" (has 2 parameters)
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! ;)
Supersupersuper Danke!
atan returns -180 ... +180
atan2 returns the full -180 ... 180 ... -180
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.
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.
Haste Code dazu ?
Hier ist der Code. Wie genau kann ich da machen?
//================================
// 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...
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.
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ß?
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->
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
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?
X, Y, Y ???
Ja, und dann hast Du eine Matrix - aber was machst Du damit?
NewtonBodySetMatrix(ownship, mat[])
Hi!
Funzt super! Des Rätsels Lösung war eigentlich ganz simpel!
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
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.
Newtonupdate(GT, 4);
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...
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.
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
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...
Und wenn du den Timer bei NewtonUpdate reinpackst, als übergabewert?!
Ok, keine Ahnung, wie du meinst?!?
Ich habe im Prinzip den Wert GT als Timer reingepackt...
//+++++++++++++++++++++++++++++++++++
GT=(GETTIMERALL()-Old_Timer)/1000
Old_Timer=GETTIMERALL()
//+++++++++++++++++++++++++++++++++++
...
Newtonupdate(GT, 4)
ah hast du schon Hmmmm
Hmm. mach mal Netwonupdate (20,4)
Geht auch nicht! Ca. 4 facher Geschwindigkeitsunterschied, ganz egal was ich mache.
Ich teste immer mit identischem Programm.