Ich brauche Hilfe bei Grafishcenanwendung in OpenGL.
-
hi, ich schreibe zur zeit an einer jahresarbeit in Mathe. das thema lautet "Punkte im 3D-Raum", und da dachte ich mir ich frische mein Material etwas auf mit einer Grafischenanwendung.
soviel zur vorgeschichte. jetzt zu meiner idee. ich dachte mir ich verwende das NEHE-Tutorial um ein OpenGL fester zu erstellen. weiterhin wollte ich dann ein paat funktionen schreiben und diese dann in die in die glDraw() funktion reinstecken, die die das tut kennen wissen wass ich meine.
so die erste funktion soll einen Raum erschaffen in der sich der punkt bewegen soll:void Room( float x, float y, float z ) { glColor3ub( 255, 255, 255 ); glTranslatef( 0.0f, 0.0f, -10.0f ); glBegin( GL_LINES ); // bottom glVertex3f( -x, -y, -z ); glVertex3f( x, -y, -z ); glVertex3f( x, -y, -z ); glVertex3f( x, -y, z ); glVertex3f( x, -y, z ); glVertex3f( -x, -y, z ); glVertex3f( -x, -y, z ); glVertex3f( -x, -y, -z ); // top glVertex3f( -x, y, -z ); glVertex3f( x, y, -z ); glVertex3f( x, y, -z ); glVertex3f( x, y, z ); glVertex3f( x, y, z ); glVertex3f( -x, y, z ); glVertex3f( -x, y, z ); glVertex3f( -x, y, -z ); // back glVertex3f( -x, -y, -z ); glVertex3f( x, -y, -z ); glVertex3f( x, -y, -z ); glVertex3f( x, y, -z ); glVertex3f( x, y, -z ); glVertex3f( -x, y, -z ); glVertex3f( -x, y, -z ); glVertex3f( -x, -y, -z ); // face glVertex3f( -x, -y, z ); glVertex3f( x, -y, z ); glVertex3f( x, -y, z ); glVertex3f( x, y, z ); glVertex3f( x, y, z ); glVertex3f( -x, y, z ); glVertex3f( -x, y, z ); glVertex3f( -x, -y, z ); // left glVertex3f( x, -y, -z ); glVertex3f( x, -y, z ); glVertex3f( x, -y, z ); glVertex3f( x, y, z ); glVertex3f( x, y, z ); glVertex3f( x, y, -z ); glVertex3f( x, y, -z ); glVertex3f( x, -y, -z ); // right glVertex3f( -x, -y, -z ); glVertex3f( -x, -y, z ); glVertex3f( -x, -y, z ); glVertex3f( -x, y, z ); glVertex3f( -x, y, z ); glVertex3f( -x, y, -z ); glVertex3f( -x, y, -z ); glVertex3f( -x, -y, -z ); }das ganze sieht dann erst einmal so aus in der glDraw()
int DrawGL() { glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glLoadIdentity(); Room( 2.0f, 2.0f, 2.0f ); return 0; }dann will ich eine funktion shcreiben die einen punkt erstellt(sphere), die sich dann später mit einer weiteren funktion in diesem raum bewegt. doch nun erst einmal zu meinen problem. ich erstelle also mit der folgenden funktion eine kugel:
void Sphere( GLUquadricObj *sphere, float &x, float &y, float &z ) { glTranslatef( x, y, z ); glColor3ub( 255, 255, 255 ); sphere = gluNewQuadric(); gluQuadricNormals( sphere, GL_SMOOTH ); gluQuadricDrawStyle( sphere, GL_FILL ); gluSphere( sphere, 0.1f, 40.0f, 40.0f ); glLoadIdentity(); }und binde sie so in die glDraw ein:
int DrawGL() { glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glLoadIdentity(); Room( 2.0f, 2.0f, 2.0f ); Sphere( s, posX, posY, posZ ); return 0; }ok, der cube(raum) und die kugel(punkt) sind zu sehen, doch das Problem ist egaöl wie ich die koordinaten der kugel aendere sie bleibt stehts in der mitte des Raumes. aber wieso ist das so? könntet ihr mir helfen, fuer folgende hilfe bn ich sehr dankbar.
-
T0bi schrieb:
das Problem ist egaöl wie ich die koordinaten der kugel aendere sie bleibt stehts in der mitte des Raumes.
Zeig doch mal, wie du posX, posY und posZ änderst. Im gezeigten Code ist davon nichts zu sehen.
-
wieso spielt doch im mom keine rolle. die pos... variablen sind static und ich habe ihnen erst mal 1.0f als wert zugeteilt, aber auch wenn ich da 10.0f oder 10000000.0f reinschreibe bleibt die position vom punkt in der mitte des raumes. also es aendert sich gar nichts.
-
hat keiner ne Idee?
-
T0bi schrieb:
hat keiner ne Idee?
Macht es einen unterschied wenn man die kammera und die kugel um 10 einheiten verschiebst - oder die Kammera und die Kugel um 100 einheiten verschiebt?
-
Mach doch nochmal glIdentity() vor dem Zeichnen der Kugel.
-
was macht glIdentity()?, ja aber wie mach ich denn nun bdeides unabhaengig von einander?
-
glIdentity();
gltranslate()
raum malenglIdentity();
gltranslate(andere werte)
kugel malen
-
ach du meinst sicher glLoadIdentity(), hab ich alles schon probiert, bringt aba gar nichts....
-
einfacher ist es doch sicherlich mit hilfe von Matrixstacks (glPush/PopMatrix)
Auf jeden fall ist dein Problem, das du nicht weißt wie die Matrizen richtig miteinander Multipliziert werden muss bzw. was die Modelview Matrix den genau ist
-
hmm... ich habe keine ahnung wie man mit glPush/glPopMatrix arbeitet?, kannst dus mir erklären?
-
deine methode "Room" hat zum "glBegin(GL_LINES)" kein zugehoeriges "glEnd()".
matrix-operationen innerhalb eines begin/end-blocks sind unzulaessig und deshalb wird die translation fuer deine kugel ignoriert.
darueber hinaus waere es geistreich, nicht fuer jeden zeichnenvorgang der kugel ein neues gluquadric-objekt zu erzeugen ohne es jemals wieder zu loeschen.
-
T0bi schrieb:
hmm... ich habe keine ahnung wie man mit glPush/glPopMatrix arbeitet?, kannst dus mir erklären?
Im OpenGL Buch "Red Book" wird es ausführlich beschrieben - das Buch kann man kostenlos als HTML Seite lesen - einfach mal googeln
Allerdings wenn dir die Mathematik hinter den Matrizen nicht klar ist wird dir das auch nicht helfen - in diesem fall kannst du das hier lesen:
http://turing.fh-landshut.de/~jamann/MatrizenfuerDummies.pdf