JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Problem mit Gravitation
Gehe zu Seite Zurück  1, 2, 3  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
TheMillenium
Dark JLI'ler



Anmeldedatum: 21.07.2002
Beiträge: 1427
Wohnort: World
Medaillen: Keine

BeitragVerfasst am: 20.07.2003, 13:50    Titel: Antworten mit Zitat

oh sorry, stimmt das ist mit welcher Geschwidigkeit man kollidiert...

dann nehm doch das

v= a*t;

a=9,81m/s²

das sehe dann so aus:

vg=a/FRAME_RATE;

vg ~= Velocity Gravity


v= v + vg;

und du hast deine Berechnung dann machst du das noch so:


Wenn Körper über dem Boden
{
vg=a/FRAME_RATE;
v += vg;
}
Wenn Körper kollidiert mit Boden
{
a *=-1;
v *=-1;
}

damit müsste das funktionieren. Das hier gilt aber nur für elastische Körper!!!
_________________
The source of all power is in its destiny...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Mr.X
Junior JLI'ler



Anmeldedatum: 15.04.2003
Beiträge: 88

Medaillen: Keine

BeitragVerfasst am: 20.07.2003, 15:04    Titel: Antworten mit Zitat

KI hat Folgendes geschrieben:
Man kann auch noch den Faktor t (Zeit) mit unterbringen und somit die Geschwindigkeit zu einer beliebigen Zeit (also für jeden Frame) neu berechnen.


TheMillenium hat Folgendes geschrieben:
...v= a*t;
...
vg=a/FRAME_RATE;
...


@Alle
Warum so kompliziert, die CPU sollte ihre Zeit für was besseres nutzen!

Da die Fallgeschwindigkeit eine Konstante!!!! ist, für die Entfernungen wie Ihr sie alle darstellt (Oder simuliert Ihr auf Euren 768 im Schnitt in der Höhe dargestellten Pixeln etwa mehrere hundert Kilometer, dann wäre sie natürlich nicht konstant? Ich glaube nicht!) reicht es doch, wenn Ihr diese Konstante in jedem Durchlauf nur zur Geschwindigkeit hinzuaddiert!!! Also nixs mit Multiplikation und Division in jedem Frame neu errechnen!!! Eine einfache Addition bewirkt dasselbe Ergebnis und ist zudem in weniger Takten abgearbeitet als Multiplikation und Division.

@TheMillenium
Man sollte versuchen, seine spielrelevanten Daten unabhängig von der Anzahl der dargestellten Frames zu berechnen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
under_construction
Junior JLI'ler


Alter: 36
Anmeldedatum: 12.11.2002
Beiträge: 52

Medaillen: Keine

BeitragVerfasst am: 20.07.2003, 15:15    Titel: THX Antworten mit Zitat

Hi @ all!

erst mal vielen Dank für die menge an antworten!!!

Das ist erst ma der Codeauschnitt für die Bewegung des Sprites.
Erklärung: r2 ist das Rect für das Sprite, das für die Kollision verwendet
wird
g_x und g_y sind die Koordinaten der linken oberen Ecke des
Sprites.
Gravitation beträgt jetzt 0.3f.
Sp ist der Speed und beträgt 5 bzw -5
NO_COLL bedeute, dass keine Kollision auftritt
Y_CH heisst: das Sprite dotzt an der oberen/unteren Seite auf
Der Code ist nach Mr.X geändert funzt aber trotzdem noch net.
Code:

...
r2.left=g_x;
r2.top=g_y;
r2.right=g_x+29;
r2.bottom=g_y+29;
if(Start==true)
{
Sp=Sp+Gravitation;
g_y+=Sp;
g_x+=0.1f;
r2.left=g_x;
r2.top=g_y;
r2.right=g_x+29;
r2.bottom=g_y+29;
int a=Kollision(r1,r2);
if(a!=NO_COLL)
{
    if(a==Y_CH)
    {
   Sp=-(Sp);
   g_y+=Sp;
    }
}
}...


@TheMillenium
So genau wollt ich des gar net machen

@Hazel und Mr.X
Ich hab versucht bei Kollision das Objekt wieder zurückzusetzen
aber es bleibt trotzdem am Boden.

@The Lord of Programming
Ok, das wär auch möglich, aber ich will das nich mit Hilfe von
gleichbleiben Formeln abhängig machen sondern das Sprite einfach mal runterfallen lassen.

Ciao and thx @ all!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Mr.X
Junior JLI'ler



Anmeldedatum: 15.04.2003
Beiträge: 88

Medaillen: Keine

BeitragVerfasst am: 20.07.2003, 15:26    Titel: Re: THX Antworten mit Zitat

under_construction hat Folgendes geschrieben:
...
r2.left=g_x;
r2.top=g_y;
r2.right=g_x+29;
r2.bottom=g_y+29;
if(Start==true)
{
Sp=Sp+Gravitation;
g_y+=Sp;
g_x+=0.1f;
r2.left=g_x;
r2.top=g_y;
r2.right=g_x+29;
r2.bottom=g_y+29;
int a=Kollision(r1,r2);
if(a!=NO_COLL)
{
if(a==Y_CH)
{

Sp=-(Sp);
g_y+=Sp;
}
}
}...

Nimm mal das rot Markierte raus! Ich kenn Deine Kollisionberechnung nicht genau, aber wenn Y_CH lediglich bedeutet, daß das Sprite aufsetzt, dann tritt dieser Fall ja nur ein, eben wenn es aufsetzt. Was ist aber, wenn das Sprite schon wesentlich weiter im Objekt ist, dann setzt es ja schon längst nicht mehr auf, aber eine Kollision ist es trotzdem.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
TheMillenium
Dark JLI'ler



Anmeldedatum: 21.07.2002
Beiträge: 1427
Wohnort: World
Medaillen: Keine

BeitragVerfasst am: 20.07.2003, 16:26    Titel: Antworten mit Zitat

Zitat:
@TheMillenium
Man sollte versuchen, seine spielrelevanten Daten unabhängig von der Anzahl der dargestellten Frames zu berechnen.


muss man aber!!!

Ansonsten zeig mir mal nen besseren Weg wie das geht!!!

Geht eben nicht weil der Abstand immer gleich sein muss, außer du schreibst deine Funktionen nur für eine bestimmte FRAME_RATE z.B. 60, aber wenn du sie irgendwann woanders übernehmen willst, wirst du Probleme bekommen...
_________________
The source of all power is in its destiny...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Mr.X
Junior JLI'ler



Anmeldedatum: 15.04.2003
Beiträge: 88

Medaillen: Keine

BeitragVerfasst am: 20.07.2003, 16:31    Titel: Antworten mit Zitat

Man trennt die Berechnung von Spieldaten und die Berechnung von Daten zur grafischen Darstellung!
Wenn Du bei jeder Spieldaten-Berechnung Deine Frames mit einbeziehen musst, dann verschwändest Du Performance durch ständiges Dividieren durch die FRAME_RATE.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
TheMillenium
Dark JLI'ler



Anmeldedatum: 21.07.2002
Beiträge: 1427
Wohnort: World
Medaillen: Keine

BeitragVerfasst am: 20.07.2003, 17:06    Titel: Antworten mit Zitat

FRAME_RATE hat überhaupt nichts direkt nur mit dem Grafischen zu tun, also wirklich du solltest dir wirklich mal mehr Gedanken darüber machen und vielleicht nochmal das Buch durchlesen! Wink


Die Frame_rate bestimmt wieoft deine Spielschleife in 1 Sekunde durchlaufen wird. Ist auf jeden Fall bei mir so. Und deshalb ist automatisch alles vom Spiel verbunden, die Grafikausgabe & die Berechnung von allen Objekten in der Spieleschleife.

Und ich glaube nicht, dass du weißt, was rechenintensiv ist und was nicht.

Außer du hast die Bücher von Stefan Zerbst & Co gelesen...
weil die Beschleunigung eines Objektes immer gleich bleibt teil ich den Wert einmal durch die Frame_rate und dann ist es ja nur noch eine Addition bzw. eine Subtraktion. Und die ist nicht wirklich Performanceintensiv, okay?
_________________
The source of all power is in its destiny...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Mr.X
Junior JLI'ler



Anmeldedatum: 15.04.2003
Beiträge: 88

Medaillen: Keine

BeitragVerfasst am: 20.07.2003, 18:04    Titel: Antworten mit Zitat

TheMillenium hat Folgendes geschrieben:
...Und ich glaube nicht, dass du weißt, was rechenintensiv ist und was nicht.

Außer du hast die Bücher von Stefan Zerbst & Co gelesen...

Hab ich zwar gelesen, aber darauf begründe ich nicht mein Wissen Wink

TheMillenium hat Folgendes geschrieben:
Die Frame_rate bestimmt wieoft deine Spielschleife in 1 Sekunde durchlaufen wird...

Bei dieser Erklärung geb ich nach ^^

TheMillenium hat Folgendes geschrieben:
...okay?

okay!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 20.07.2003, 19:17    Titel: Antworten mit Zitat

Wenn man einen Körper annähernd realistisch zu Boden fallen lassen möchte sollte man auf die altbewährten Formeln zurückreifen, die wir alle im Physikunterricht gelernt haben. Wink

Dazu gehört natürlich auch der Faktor a (Beschleunigung).
Die wichtigste Formel ist das
Weg-Zeit-Gesetz: s = 0.5 * g * t² (s = Strecke ; g = Erdbeschleunigung ; t = Zeit)
Am besten ich erläutere alles einfach mal an einem Beispiel:
Nehmen wir an, dass wir einen Stein (Gewicht ist irrelevant) vom Kölner Dom (150 m) nach unten fallen lassen.

Das nennt sich jetzt freier Fall und wir vernachlässigen den Luftwiederstand.
Man muss dazu wissen, dass der Stein nur fällt, weil er von der Erde angezogen wird.
Wink
Und zwar mit ungefähr 10 Newton. Diese Gewichtskraft ist überall auf der Erde etwas unterschiedlich.
(Pol: 9,84 N ; Köln: 9,81 N ; Äquator: 9,78 N)
[Man kann lustige Effekte erzielen, wenn man in seinen Programmen diese Konstante ändert. Nimmt man den Wert 1,62 N, so lässt sich die Gravitation des Mondes simulieren.]
Der Stein erfährt eine Beschleunigung und dadurch verändert sich die Geschwindigkeit!
Der Stein wird die ganze Zeit beschleunigt und wird somit immer schneller!
So hat er nach 2 Sekunden etwa eine Geschwindigkeit von 72 km/h und bei seinem Aufprall (nach 5,477 Sekunden) schon 197 km/h.
Aber die Geschwindigkeit müssen wir in diesem Fall gar nicht errechnen!


Wir wollen nun einfach mal wissen welche Strecke der Stein nach 2 Sekunden hinterlegt hat.
S(von 2 Sekunden) = 0.5 * 10 * 2² [Weg-Zeit-Gesetz]
10 -> Erdbeschleunigung
2² -> 2 Sekunden hoch 2 (t²)
Als Ergebnis erhalten wir 20
Die Einheit beträgt Meter!
Um nun herauszufinden wie viel Zeit verbleibt bis der Stein am Boden angelangt ist (150 m), müssen wir die Formel nur umformen.
150(von unbekannt Sekunden) = 0.5 * 10 * t²
nach t aufgelöst ->
t = √(2s / g)
sprich: t = Wurzel aus (2s durch g) bzw. Wurzel aus ((2 * 150) / 10)
Ergebnis: 5.477 Sekunden

Man braucht nur das Weg-Zeit-Gesetz zu benutzen und kann für jeden Zeitpunkt die hinterlegte Strecke herausfinden!
Was will man mehr? Wink


Zuletzt bearbeitet von KI am 20.07.2003, 22:27, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
TheMillenium
Dark JLI'ler



Anmeldedatum: 21.07.2002
Beiträge: 1427
Wohnort: World
Medaillen: Keine

BeitragVerfasst am: 20.07.2003, 19:29    Titel: Antworten mit Zitat

Nun ja dein Teil hat nur einen Haken....wir wollen wissen umwieviele Einheiten sich der Körper bis zum nächsten Frame also zur nächsten Zeiteinheit bewegt.

Ok wenn wir die Höhe wissen und dann die Zeit

dann hier in deinem Beispiel: 150m/5.477s = 27.39 m/s

also müssen wir in einer Sekunde um ca. 27.39 Maßeinheiten nach unten gehen..okay das klappt bestimmt auch aber warum nicht wie ich beschrieben einfach das Geschwindigkeit-Zeit-Gesetz verwenden?
_________________
The source of all power is in its destiny...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 20.07.2003, 19:56    Titel: Antworten mit Zitat

@TheMillenium
Aber du sprichst doch von der Geschwindigkeit! 27.39 Meter pro Sekunde!
Mithilfe des Weg-Zeit-Gesetzes kann man die hinterlegte Strecke ausrechnen!
Ohne irgendwelche Frameraten in die Berechnung mit einzubeziehen!!

Man lässt einfach einen Timer laufen, der die Zeit angibt von dem Zeitpunkt an dem das Objekt "fallen gelassen" worden ist. t0

Bei jedem Schleifendurchlauf wird überprüft wieviel Zeit vergangen ist.
Anschließend rechnet man die Strecke aus.


<edit>
Und alles ohne Framerate!
Jetzt kann die Framerate (Bildwiederhohlungsfrequenz) beliebig sein (z.B 300 fps) und das Objekt bewegt sich nicht schneller oder langsamer.
Es ist unabhängig! So wie es sein sollte. Very Happy


Zuletzt bearbeitet von KI am 20.07.2003, 20:25, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
TheMillenium
Dark JLI'ler



Anmeldedatum: 21.07.2002
Beiträge: 1427
Wohnort: World
Medaillen: Keine

BeitragVerfasst am: 20.07.2003, 20:15    Titel: Antworten mit Zitat

tschuldigung, und wie bewegst du dein Objekt? Um wieviele EINHEITEN?
_________________
The source of all power is in its destiny...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 20.07.2003, 20:31    Titel: Antworten mit Zitat

TheMillenium hat Folgendes geschrieben:
tschuldigung, und wie bewegst du dein Objekt? Um wieviele EINHEITEN?

Das Ergebnis ist ja in Metern.
Man muss also festlegen wieviele Meter einer Einheit in der Matrix entsprechen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 20.07.2003, 21:26    Titel: Re: THX Antworten mit Zitat

under_construction hat Folgendes geschrieben:
@The Lord of Programming
Ok, das wär auch möglich, aber ich will das nich mit Hilfe von
gleichbleiben Formeln abhängig machen sondern das Sprite einfach mal runterfallen lassen.


Da kann man doch auch alle möglichen Variablen mit rein packen. Die Formel ist doch nicht immer gleich.
Hattest du das schon in der Schule?

Code:
f(x)=ax²+bx+c


Da kannst du eigentlich alles einstellen. Mit a die Dehnung/Pressung und die Richtung der Parabel.
Aus der Formel rechnet man sich dann die Scheitelform, ich glaub das war so:
Code:
f(x)=x²-d+e


d=X-Koordinate des Scheitels
e=Y-Koordinate des Scheitels
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
TheMillenium
Dark JLI'ler



Anmeldedatum: 21.07.2002
Beiträge: 1427
Wohnort: World
Medaillen: Keine

BeitragVerfasst am: 20.07.2003, 21:50    Titel: Antworten mit Zitat

da muss ich dich glaub ich leider enttäuschen das ist zwar die schlussformel, aber mach's lieber so, das klappt immer:

x1,2 = (-b+-Wurzel_aus(b²-4ac))/2

Parabel kann bis zu 2 x Werte haben...

naja y kriegt man ganz leicht

y=ax²+bx+c
_________________
The source of all power is in its destiny...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Gehe zu Seite Zurück  1, 2, 3  Weiter
Seite 2 von 3

 
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