Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 11:55

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: einfache gravitation mit timerfunc
BeitragVerfasst: Di Jan 06, 2009 17:29 
Offline
DGL Member

Registriert: Mo Jan 05, 2009 17:44
Beiträge: 7
hi ich hätte da mal ein problem :D

es geht um folgendes

ich habe eine umgebung die aus erstellten "plattformen" besteht nun habe ich eine abfrage gemacht ob ich mit einem 2ten würfel eine solche plattform berühre und wenn ja das ich nich durch sie hindurch kann sondern sozusagen an ihr hängen bleibe.
das funktioniert auch alles mehr oder weniger gut.
dann wollte ich, dass sobald man über einer dieser plattformen ist (also positive y achse) man eine gravitation erfährt. das hat auch so ganz gut funktioniert. jedoch hab ich es nur so hinbekommen das ich die gravitation nur jedesmal bei einer aktion(sprich tastendruck) erfahre.
also dachte ich mir ich benutze eine timerfunc um dies zeitlich zu steuern. allerdings funktioniert das nicht wirklich. ich zeige euch mal den code


erstmal der test ob man im gewünschten bereich ist
Code:
  1.  
  2.  
  3. int testgravitation(int plattform){
  4.     float x1,x2,y1,y2,z1,z2;
  5.    
  6.        //hier sind die einzelnen "eckkoordinaten" der plattformen angegeben
  7.     x1=(plattformposx[plattform]);
  8.     x2=(plattformposx[plattform]+(plattformbreite[plattform]*0.1));
  9.     y1=(plattformposy[plattform]+(plattformhoehe[plattform]*0.1));
  10.     y2=(y1+5);
  11.     z1=(plattformposz[plattform]);
  12.     z2=(plattformposz[plattform]+(plattformtiefe[plattform]*0.1));
  13.    
  14.        //hier die if abfrage ob man sich in dem "gravitationsbereich" befindet
  15.     if(((testposx1 >= x1 && testposx1 <= x2)||(testposx1 >= x1 && testposx1 <= x2)||(testposx2 >= x1 && testposx2 <= x2)) && ((testposy1 >= y1 && testposy1 <= y2)) &&((testposz1 >= z1 && testposz1 <= z2) || (testposz2 >= z1 && testposz2 <= z2))){
  16.                gravitation = 1; //gravitaion ist am anfang 0 wenn man in dem bereich ist wird es auf 1 gesetzt
  17. //      testposy1 = testposy1 - 0.01;                        <-- die 2 zuweisungen waren die "gravitation" ohne timer
  18. //      testposy2 = testposy2 - 0.01;
  19.     }
  20.     else{
  21.         gravitation = 0; //falls man nicht im bereich ist wird gravitation auf 0 gesetzt
  22.  
  23.     }
  24. }
  25.  



und nun die timerfunc

Code:
  1.  
  2.  
  3. static void gravitationTimer(int gravitation){
  4.  
  5.         testgravitation(0);
  6.     testgravitation(1);
  7.     testgravitation(2);
  8.     testgravitation(3);
  9.     testgravitation(4);
  10.  
  11.  
  12. if(gravitation = 1){ //wenn man im bereich ist soll der timer die höhe immer um 0.01 verringern
  13.         testposy1 = testposy1-0.01;
  14.         testposy2 = testposy2-0.01;
  15.     }
  16.     if(gravitation = 0){
  17.         testposy1 = testposy1;
  18.         testposy2 = testposy2;
  19.     }
  20.     glutPostRedisplay();
  21.     glutTimerFunc(55,gravitationTimer,0);
  22. }
  23.  
  24.  


ich hoffe es ist ein bisschen verständlich was mein problem ist ich bin leider nicht so geübt in c oder programmieren überhaupt.

wenn ich jetzt einfach starte geht er automatisch immer um 0.01 runter obwohl ich nicht über einer plattform bin. setze ich gravitation = 0 in der if abfrage passiert gar nichts obwohl gravitation von anfang an 0 gesetzt ist.
eigentlich müsste es doch wenn dann umgekehrt sein oder?

liegt es daran, das ich den wert von gravitation nicht zurück gebe mit return oder ähnlichem? das hab ich zwar auch schon probiert aber das bringt nichts.(habs aber sehr wahrscheinlich falsch gemacht.

ich hoffe mein problem ist verständlich und ihr könnt mir helfen

danke schonmal


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 06, 2009 19:40 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 27, 2005 12:44
Beiträge: 393
Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Hallo ecki,

die Gleichheit wird in c mit '==' getestet, nicht mit '=', vielleicht liegt da das Problem... ;)

Viele Grüße
dj3hut1

_________________
Wenn Gauß heute lebte, wäre er ein Hacker.
Peter Sarnak, Professor an der Princeton University


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 07, 2009 13:10 
Offline
DGL Member

Registriert: Mo Jan 05, 2009 17:44
Beiträge: 7
hi danke für die antwort
das hab ich gestern dann nochmal ausprobiert und es selbst rausgefunden aber es löst leider mein problem nicht

jetzt ändert er die ypos nicht mehr da gravitation ja 0 ist aber es funktioniert immer noch nicht so, dass wenn ich über einer plattform bin gravitation auf 1 gesetzt wird.

hat sonst noch jemand eine idee?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 07, 2009 13:26 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Anstatt der Timerfunc solltest du das mit der graphischen Darstellung synchronisieren. Wenn du den Würfel irgendwo runterfallen läßt, dann muss das Fallen ja sowieso in einer Schleife immer wieder dargestellt werden. Das kennst du ja von OGL.

Ansosten. Hast du mal in deiner Timerfunc nen breakpoint gesetzt und geguckt, ob die aufgerufen wird?

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 07, 2009 13:40 
Offline
DGL Member

Registriert: Mo Jan 05, 2009 17:44
Beiträge: 7
hi flash

meinst du mit dem synchronisieren glutPostRedisplay(); in die funktion einfügen?
wenn ja hab ich das grad getan und es funnzt. zumindest zeichnet er den würfel jetzt immer schnell nacheinander eine position weiter unten.
kann ich das so auch machen, das es nicht bei jedem zeichnen runter geht sondern nur 2 ma pro sekunde zb oder ist das nicht möglich?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 07, 2009 16:25 
Offline
DGL Member

Registriert: Mo Jan 05, 2009 17:44
Beiträge: 7
so ich hab das ganze nun so gelöst das ich in der abfrage am ende glutPostRedisplay(); aufrufe
und dann nachher in einer timerfunktion dann die abfrage aufrufe

das klappt dann auch wunderbar

allerdings hab ich noch ein problem was aber wohl mit meinem code zusammenhängt

Code:
  1.  
  2.  
  3. int testgravitation(int plattform){
  4.     float x1,x2,y1,y2,z1,z2;
  5.    
  6.     x1=(plattformposx[plattform]);
  7.     x2=(plattformposx[plattform]+(plattformbreite[plattform]*0.1));
  8.     y1=(plattformposy[plattform]+(plattformhoehe[plattform]*0.1));
  9.     y2=(y1+15);
  10.     z1=(plattformposz[plattform]);
  11.     z2=(plattformposz[plattform]+(plattformtiefe[plattform]*0.1));
  12.    
  13.  
  14.     if(((testposx1 >= x1 && testposx1 <= x2)||(testposx1 >= x1 && testposx1 <= x2)||(testposx2 >= x1 && testposx2 <= x2)) && ((testposy1 >= y1 && testposy1 <= y2)) &&((testposz1 >= z1 && testposz1 <= z2) || (testposz2 >= z1 && testposz2 <= z2))){
  15.         g1=g1+plattformgrav[plattform];
  16.         testposy1 = testposy1 - g1;
  17.         testposy2 = testposy2 - g1;
  18.     }
  19.     else{
  20.         //g1=0.01;
  21.     }
  22. glutPostRedisplay();
  23. }
  24.  
  25.  


mein problem ist nun folgendes wenn ich g1=0.01 im else zweig nicht auskommentiere ist die gravitation immer fest 0.01 und ändert sich nicht mehr
wenns auskommentiert ist funnzt es wunderbar.

also muss es ja damit zusammen hängen das ich bei der ifabfrage obwohl ich im gravitationsbereich bin totzdem auch in den else zweig komme oder?
ich könnte auch eine andere if abfrage machen damit ich nur g1 auf den standard wert zuück setze wenn ich nicht in dem bereich bin das wäre mein näcshter lösungsansatz gewesen aber ich bin nicht sicher obs dann tut weil im prinzip dachte ich das die abfrage stimmt.

ich weiß nicht ob man mit dem codefetzen so viel anfangen kann aber vielleicht könnt ihr mir ja trotzdem helfen

danke schonmal bis hierhin


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 07, 2009 17:34 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
ecki hat geschrieben:
if(
((testposx1 >= x1 && testposx1 <= x2)||(testposx1 >= x1 && testposx1 <= x2)||(testposx2 >= x1 && testposx2 <= x2)) &&
((testposy1 >= y1 && testposy1 <= y2)) &&
((testposz1 >= z1 && testposz1 <= z2) || (testposz2 >= z1 && testposz2 <= z2))
)


Du hast da 2mal die selbe Bedingung drin - (testposx1 >= x1 && testposx1 <= x2) - entweder kann das raus, oder da sollte was anderes stehen.

Außerdem, wo kommen eigentlich die "testpos"-Werte her?
Und die Plattformen sind nur Gravitationsfelder oder? Weil mit dem was du da hast kann man nicht darauf stehen.

Ach und das mit dem Fehler, testest du nur eine Plattform oder mehrere, weil wenn es mehrere sind ist die Testposition wahrscheinlich immer bei mindestens einer außerhalb, sodass der Else-Zweig ausgeführt wird. D.h. es würde nur richtig funktionieren, wenn die Plattform über der man sich befindet die letzte zu testende ist.
Um das zu lösen kann man den Else-Zweig weglassen und die Gravitation vor dem ersten Test auf den Standartwert setzen, sodass sie nur bei Bedarf (wenn man über einer Plattform ist) überschrieben wird.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 07, 2009 17:59 
Offline
DGL Member

Registriert: Mo Jan 05, 2009 17:44
Beiträge: 7
hi

zu der if abfrage ja der eine teil ist zuviel danke hab ich gar nicht bemerkt.

die testpos werte sind vorgegeben und werden mit der tastatur verändert. die geben die kantenpositionen eines würfels mit dem ich die gravitation teste an.

zu den plattformen
ich hab auch noch eine kollisionserkennung in ähnlichem stil d.h. dass sobald ich an den rand komme nicht durch die plattform komme(funnzt aber auch nicht 100%)

und das mit dem fehler hab ich dann auch gemerkt als ich es mit den werten ausprobiert habe die eine plattform hat und dann als ich gesehen hab das es für die eine funnzt und für alle nicht kams mir dann :roll:

aber wenn ich g1 ja nur einmal auf 0.01 setze hab ich ja das problem das sobald ich wieder über eine plattform fliege g1 nicht den startwert sondern schon den veränderten wert hat oder?

deswegen wollte ich ja eigentlich den else zweig einbauen.


hoffe es ist etwas klarer geworden
also falls ihr eine idee habt wie ich es anstelle das die gravitation wieder bei "null" anfängt sobald ich aus einem gravitationsfeld bin wäre ich euch dankbar!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 07, 2009 18:15 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
ecki hat geschrieben:
aber wenn ich g1 ja nur einmal auf 0.01 setze hab ich ja das problem das sobald ich wieder über eine plattform fliege g1 nicht den startwert sondern schon den veränderten wert hat oder?


Ich denke mal du hast jetzt die Timerfunction. Und in der wird doch über die Anzahl der Plattformen iteriert und jedes mal testgravitation aufgerufen
Also in der Art:
Code:
  1.  
  2. for (int i=0;i<Plattformanzahl;i++)
  3. {
  4.     testgravitation(i);
  5. }
  6.  


Dann sollte vor das "for" noch "g1=0.01;" geschrieben werden.

Ich denke die Gravitation soll über einer Plattform "plattformgrav" sein und außerhalb NULL oder? g1 ist ja auch nicht die Graviation sondern die aktuelle Fallgeschwindigkeit. Wobei dann "plattformgrav" auch eher die Fallbeschleunigung ist.
Hm, wenn ich mir das überlege, dann sollte g1 garnicht verändert werden, weil wenn man über einer Plattform ist aber nicht auf ihr aufkommt, sondern sie vorher verlässt müsste man genausoschnell nach unten rauschen wie über der Plattform.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 09, 2009 17:07 
Offline
DGL Member

Registriert: Mo Jan 05, 2009 17:44
Beiträge: 7
mh

also wenn ich g1 = 0.01 in den timer schreibe dann wird das ja immer gesetzt wenn der timer aufgerufen wird das bedeutet das g1 auch immer auf 0.01 stehen bleibt.
also gehts so ja nicht!

und was die aktuelle fallgeschwindigkeit angeht kann ich erstmal damit leben, das wenn ich nicht mehr über einer plattform bin sie gleich null ist. das problem ist ja eher ein schönheitsfehler im gegensatz zu dem anderen!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 09, 2009 17:58 
Offline
DGL Member

Registriert: Mo Jan 05, 2009 17:44
Beiträge: 7
ich hab mir nochmal durch den kopf gehen lassen was du gesagt hast und mir ist dann endlich das licht aufgegangen :D

wenn ich die fallgeschwindigkeit auch außerhalb beibehalte brauch ich ja nicht abfragen ob ich mich noch über einer plattform befinde wenn ich wieder über eine drüber fliege wird einfach weiter dazuaddiert bzw subtrahiert zum aktuellen wert.

sorry für meine lange leitung^^

danke damit solte mein problem gelöst sein!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 13, 2009 09:20 
Offline
DGL Member

Registriert: Mo Jan 12, 2009 09:32
Beiträge: 8
Wäre es nicht schöner, die Gravitation mit dem einfachen Galilei-Fallgesetz s = g*t² / 2 zu implementieren?
(also Fallweg = (g*t*t)/2 wobei g~=9.81 wenn du dich auf der Erde befindest)

Wenn man es ganz genau möchte, könnte man noch die Stokes-Reibung oder das newtonsche Reibungsgesetz einbauen. Wird mathematisch ganz schön heftig dann.

Weiß jemand von euch wie es bei aktuellen Ego-Shootern gemacht wird?
Nehmen die eine Näherung der Differentialgleichung von Stokes, oder gibt es da andere Verfahren um gravitative Effekte so realistisch wie möglich zu machen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 13, 2009 15:37 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
clemens hat geschrieben:
Wäre es nicht schöner, die Gravitation mit dem einfachen Galilei-Fallgesetz s = g*t² / 2 zu implementieren?
(also Fallweg = (g*t*t)/2 wobei g~=9.81 wenn du dich auf der Erde befindest)


Es wäre sicherlich genauer, weil wenn die Funktion, die die Gravitation und Bewegung ausrechnet unterschiedlich oft pro Sekunde ausgeführt wird, würde sich der Weg ändern, selbst wenn man die Geschwindigkeit, die addiert wird von der Zeit abhängig macht.
Aber wenn der Timer immer gleichmäßig ausgelöst wird sieht man ja keinen Unterschied. Allerdings kann es auch sein, dass es ruckelt, wenn er zu selten ausgelöst wird. Und bei zu häufig kann es sein, dass das Ergebnis stark schwankt.

Ich denke mal, das Ergebnis muss nicht unbedingt 100% korrekt sein, sondern nur stimmig aussehen.
Außerdem fällt mir auch auf die Schnelle kein Weg ein wie man den Weg bei sich unstetig verändernder Fallgeschwindigkeit ausrechnen soll.

...Hm, oder vllt doch.
Man könnte immer wenn sich die Gravitation ändert, die Höhe speichern und von da aus den Weg berechnen.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 16 Queries | GZIP : On ]