Problem mit structuren ...
-
hallo ich habe vor das sonnensystem mal nach zu basteln... ich habe alle bahnen der planeten mit kreisen dargestellt und darauf will ich dann die planeten kreisen lassen... ich will dies mit einer struct loesen.
struct planet { float pradius; // radius des planeten float erot; // eigene rotations geschwindigkeit float posx; // wird benötigt um die kreisbahn zu berechnen float posy; // - " - float weite; // entfernug zur sonne double dGrad; // gibt den winkel zur sonne auf der äquatorialebene an int geschw; // bahnengeschwindigkeit } merkur, venus, erde, mars, jupiter, saturn, uranus, neptun, pluto;und dann eine funktion fuer jeden planeten machen....
GLUquadricObj *pmerkur, *pvenus, *perde, *pmars, *pjupiter, *psaturn, *puranus, *pneptun, *ppluto; void LoadPlanetMerkur() { pmerkur = gluNewQuadric(); gluQuadricNormals( pmerkur, GL_SMOOTH ); gluQuadricTexture( pmerkur, true ); gluQuadricDrawStyle( pmerkur, GL_FILL ); glColor3ub( 0, 0, 255 ); merkur.pradius = 0.45f; merkur.weite = 12.8f; merkur.geschw = 52; if( merkur.dGrad <= 360.0f ) { if( merkur.dGrad == 360.0f ) { merkur.dGrad = 0.0f; } merkur.posy = merkur.weite * sin( merkur.dGrad ); merkur.posx = merkur.weite * cos( merkur.dGrad ); glTranslatef( merkur.posx, merkur.posy, 0.0f ); gluSphere( pmerkur, merkur.pradius, 40.0f, 40.0f ); merkur.dGrad += 0.025f; Sleep( merkur.geschw ); glLoadIdentity(); } } void LoadPlanetVenus() { pvenus = gluNewQuadric(); gluQuadricNormals( pvenus, GL_SMOOTH ); gluQuadricTexture( pvenus, true ); gluQuadricDrawStyle( pvenus, GL_FILL ); glColor3ub( 0, 255, 0 ); venus.pradius = 0.7f; venus.weite = 17.8f; venus.geschw = 65; if( venus.dGrad <= 360.0f ) { if( venus.dGrad == 360.0f ) { venus.dGrad = 0.0f; } venus.posy = venus.weite * sin( venus.dGrad ); venus.posx = venus.weite * cos( venus.dGrad ); glTranslatef( venus.posx, venus.posy, 0.0f ); gluSphere( pvenus, venus.pradius, 40.0f, 40.0f ); venus.dGrad += 0.025f; Sleep( venus.geschw ); glLoadIdentity(); } }das problem ist das der erste planet also merkur gezeichnet wird und auch auf seiner bahn verlaeuft doch der naechste vernus... wird nicht gezeichnet... wieso nicht??? ist etwas nicht richtig????
fuer hilfe bin ich dnakbar...
-
Dieser Thread wurde von Moderator/in flenders aus dem Forum WinAPI in das Forum Spiele-/Grafikprogrammierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Sleep( merkur.geschw );sollen das einzelne threads sein, oder wie?
zeig mal den code der das effektive rendering ausloesen soll.
warum passiert das ueberhaupt in "LoadPlanet" ?
alles 'n bischen merkwuerdig.if( venus.dGrad == 360.0f )das waere aber schon grosses glueck...
-
das is die DrawGl() funktion
int DrawGL() { glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glLoadIdentity(); glTranslatef( 0.0f, 0.0f, zoom); glRotatef( -45.0f, 1.0f, 0.0f, 0.0f ); GLUquadricObj *sonne; sonne = gluNewQuadric(); gluQuadricNormals( sonne, GL_SMOOTH ); gluQuadricDrawStyle( sonne, GL_FILL ); glColor3ub( 255, 0, 0 ); gluSphere( sonne, 7.0f, 40.0f, 40.0f ); LoadBahnen(); LoadPlaneten(); return 0; }das die wo die planeten entstehen
#ifndef planeten_h #define planeten_h void LoadPlaneten(); struct planet { float pradius; // radius des planeten float erot; // eigene rotations geschwindigkeit float posx; // wird benötigt um die kreisbahn zu berechnen float posy; // - " - float weite; // entfernug zur sonne double dGrad; // gibt den winkel zur sonne auf der äquatorialebene an int geschw; // bahnengeschwindigkeit } merkur, venus, erde, mars, jupiter, saturn, uranus, neptun, pluto; GLUquadricObj *pmerkur, *pvenus, *perde, *pmars, *pjupiter, *psaturn, *puranus, *pneptun, *ppluto; void LoadPlanetMerkur() { pmerkur = gluNewQuadric(); gluQuadricNormals( pmerkur, GL_SMOOTH ); gluQuadricTexture( pmerkur, true ); gluQuadricDrawStyle( pmerkur, GL_FILL ); glColor3ub( 0, 0, 255 ); merkur.pradius = 0.45f; merkur.weite = 12.8f; merkur.geschw = 52; if( merkur.dGrad <= 360.0f ) { if( merkur.dGrad == 360.0f ) { merkur.dGrad = 0.0f; } merkur.posy = merkur.weite * sin( merkur.dGrad ); merkur.posx = merkur.weite * cos( merkur.dGrad ); glTranslatef( merkur.posx, merkur.posy, 0.0f ); gluSphere( pmerkur, merkur.pradius, 40.0f, 40.0f ); merkur.dGrad += 0.04f; Sleep( merkur.geschw ); glLoadIdentity(); } } void LoadPlanetVenus() { pvenus = gluNewQuadric(); gluQuadricNormals( pvenus, GL_SMOOTH ); gluQuadricTexture( pvenus, true ); gluQuadricDrawStyle( pvenus, GL_FILL ); glColor3ub( 0, 255, 0 ); venus.pradius = 0.7f; venus.weite = 17.8f; venus.geschw = 65; if( venus.dGrad <= 360.0f ) { if( venus.dGrad == 360.0f ) { venus.dGrad = 0.0f; } venus.posy = venus.weite * sin( venus.dGrad ); venus.posx = venus.weite * cos( venus.dGrad ); glTranslatef( venus.posx, venus.posy, 0.0f ); gluSphere( pvenus, venus.pradius, 40.0f, 40.0f ); venus.dGrad += 0.025f; Sleep( venus.geschw ); glLoadIdentity(); } } void LoadPlaneten() { LoadPlanetMerkur(); LoadPlanetVenus(); } #endif
-
soweit ich weiss sind doch nun die beiden planeten 2 verschiedene von einander unabhaengige Objecte oder??? aber trotzdem wird nur der erste der aufgerufen wird geyeichnet wieso?
-
Vielleichtwird es auch gezeichnet, aber du siehst es nicht? f'`8k
AutocogitoGruß, TGGC (\-/ has leading)
-
wie kommst du darauf???
-
Erstmal ist es ein Zeichen von schlechtem Design, wenn du mehrere fast identisch Funktionen hast - schonmal etwas von "Parameter" gehört?
Zweitens: Was macht die Funktion glLoadIdentity(), die du am Ende der LoadXXX()-Funktionen aufrufst? Ich tippe auf eine Endlosschleife oder -rekursion, aus der du nicht mehr rauskommst (Venus wird erst geladen, wenn Merkur fertig ist). Außerdem solltest du deine Arbeit trennen in Laden (und Initialisieren) der Planeten und Zeichnen ALLER vorhandenen Planeten - ist vielleicht übersichtlicher.
-
Das Design is echt recht fürn Arsch und wird in totalem Copy&Paste enden, bis du dich dann letztlich entschließt es wegzuwerfen weil es total vermurkst ist ^^:
Erstmal mach eine Klasse Planet, statt ein Struct, eine Methode und ein GLUquadricObj, die Dinge gehören zusammen und globale Variablen macht man in der Regel eh nicht.
Dann machst du das Ganze zeitgesteuert, also die Position von einem Zeitwert abhängig, so das du so oft durch die Methode laufen kannst wie es der Rechner hergibt, Framebremsen sind böse.
Mit Sleep hast du eh das Problem nicht die Arbeitszeit des Rechners mit einzukalkulieren, selbst wenn du jeden Planeten in einen Extra Thread packst.Dann speicherst du die Planeten noch in einer Liste und rufst im Programm in einer Schleife immer ein Idle für alle Planeten auf, mit der aktuellen Zeit
Ich würds etwa so machen, das ist dann sehr leicht wartbar und lesbar, modular und flexibel:
struct planet_data { planet_data(float pradius .....){this->pradius = pradius ....} float pradius; // radius des planeten float erot; // eigene rotations geschwindigkeit float posx; // wird benötigt um die kreisbahn zu berechnen float posy; // - " - float weite; // entfernug zur sonne double dGrad; // gibt den winkel zur sonne auf der äquatorialebene an int geschw; // bahnengeschwindigkeit }; class Planet : private planet_data { private: // wenn du es noch ändern willst GLUquadricObj* qobj; void init( planet_data& data ) { // hier dein Load rein mit data... ... // Werte dann gleich in Planet speichern // Extra Methode und nicht in Konstruktor, falls du es nochmal in voller // Fahrt ändern willst(Todesstern kommt und macht bumm Planet etc, du // willst n paar Millionen Jahre vorscrollen usw), dann aba das alte qobj // löschen bevor neues angelegt wird. } public: Planet( planet_data& data ) { init_planet(data); } void Idle(long long time) { // position = time%umlaufdauer etc } }; int main(void) { std::list<Planet*> planets; planets.push_back(new Planet(planet_data(1,2,3,2,1,2,3,4) ); // Erde planets.push_back(new Planet(planet_data(1,2,3,4,1,2,3,4) ); // Mars planets.push_back(new Planet(planet_data(1,2,3,2,1,2,3,4) ); // Bounty while(programm ende) { long long time = gettimebla; // halt Zeit in ms oder so auslesen, gibts diverse Sachen für for(iterator<Planet*> pit = planets.begin(); pit++; pit < planets.end()) { (*pit)->Idle(time); } // hier kannst dann alles mögliche weitere zeichnen etc } // hier dann brav alles wieder löschen aus planets for(iterator<Planet*> pit = planets.begin(); pit++; pit < planets.end()) { delete *pit; } return 1; }
-
T0bi schrieb:
wie kommst du darauf???
Weil ich den Zeichenaufruf gelesen hab. f'`8k
Gruß, TGGC (\-/ has leading)