maus in opengl kordinatensystem anpassen
-
sry wegen doppelposting aber hab mein edit schon eingelöst^^
ich glaub das obere problem liegt daran, dass ich beim ausgeben des 3-ecks nicht auf der z-achse 0.0f sondern z-ache < 0.0f damit das auch angezeigt wird. aber dadruch verrutscht warscheinlich die koordinaten der maus in openGL. kann man auch auf z-ache 0.0f was ausgeben?
-
deine koordinaten werden zur perspektivischen transformation durch z geteilt, also ist z=0 (im koordinatensystem deiner kamera) numerisch unmoeglich.
-
aah ok , divide by zero ok!thx!
aber warum is die konvertierung so scheisse:(
die mauskoordinaten sind jetz zwar von links unten nach rechts oben (von der mitte halt) (wie openGL) aber nicht in openGL einheiten, die recht gross sind, angegeben.
dh ich muss die mauskoordinaten von glunproject zb durch 25 teilen (25 mauseinheiten ergaben bei mir eine openGL einheit)
gut
per mausklick soll an der mauskoordinate ein 3 eck erstellt werden, was auch gut geht...aber nur in der mitte des fensters. weiter aussen weischt das 3-eck von den koordinaten der maus immer mehr ab:( FUCKnochwas: die berechnete mauskoordinate is im fenster bei mir -95 und am rand +4..
-
zwischenzeitlich mal den matrixstack gepoppt?
-
den was gewast?
-
damit deine polygone auf den screen kommen, werden deren koordinaten mit modelview- und projection-matrix multipliziert und perspektivisch tranformiert.
glunproject macht diese operation rueckgaengig indem es die x,y-screenkoordinaten plus zbuffer z-koordinate mit dem entsprechenden inversen transformiert.
hat sich eine der matrizen zwischenzeitlich geaendert wird das nicht funktionieren.
-
den matrix stack. den stack (stack, so wie in "lifo queue") der wo deine transformations matritzen hält, und wo die "oberste" eben die aktuell verwendete ist. matrix stack eben, matrix stack, matrix stack, matrix stack. man kann nicht OGLn ohne zu wissen was der matrix stack ist

bzw. die, weils nämlich 3 gibt.
guckste mal glPushMatrix und glPopMatrix.
-
-
mein problem is warscheinlich, dass ich in der 9. klasse bin un da nochnie das wort "matrix" ausgesprochen wurde
-
es geht aber zu OGLen ohne zu wissen was ein matrix ist,... is macht nur kein spass^^
-
also ein vector ist ja wie ein kraftpfeil (eine richtung und/oder länge)
eine matrix ist (in OGL) eine 4x4 array:
1000
0100
0010
0001un dieses matrix wird dann mit den koordinaten multipliziert damit eine perspektieve herauskommt? dh die koordinaten sind auch eine matrix
bsp ein 3eck auf der x achse 1 y=-2 z=-5 wird mit dem matrix
1 0 0 0
0-2 0 0
0 0-5 0
0 0 0 1multipliziert um ihn an die gewünscte stelle zu transformieren?
un diese matrix (unmittelbar obendrüber) ist der modelview oder projectionsmatrix? und verändert sich manschmal sodass man ihn poppen muss?^^
-
-
Mit dem Wissen aus der 9. Klasse ist es natürlich schwer, aber ich würd mich wirklich zuerst mal hinsetzen und lineare Algebra (in der Schule heißt es vllt. auch nur Vektorgeometrie) lernen, danach die Grundprinzipien der 3D-Grafik.
So wirst du zwar einfache Dinge hinbekommen und Tutorials nachprogrammieren können, aber sobald du darüber hinaus willst stoßt du unweigerlich auf Probleme stoßen.
-
ok du hast recht^^ ich lern ma so gut wie möglich vektoren, matrizen,... im inet. hab jetz schon gelernt, dass ich da oben nur stuss geschrieben hab
nun ja was bringt mir aber wenn ich eine matrix vom stack wegnehm oder die aktuelle drauftuhe
(ich weiss ich nerv euch aber im gegenzug versuch ich anfängern im thread "C++" zu helfen^^)
-
Den Stack braucht man, wenn man mit lokalen Koordinatensystemen für bestimmte Objekte arbeitet, also Trafos, die nur auf bestimmte Objekte angewendet werden sollen, und nicht auf alle.
Wenn man alle Objekte im lokalen KS gerendert hat, will man ja die Ursprungsmatrix wiederherstellen. Dazu nutzt man den Stack
1. Matrix pushen
2. neue Trafos ausführen
3. Objekte rendern, die das betrifft
4. Matrix poppen^^ (also die Matrix wiederherstellen, die wir gepusht haben)
-
aber ich hab nochnie eine matrix gepusht oder gepoppt aber trotzdem schon drehende objecte irgentwo im OGL KS gezeichnet. dh der matrix wird automiatsch gepusht und gepoppt un das müsste theorätisch in glBegin und glEnd passiern.
dh:
tranform3f : schiebt den zeichner auf den punkt, der in den parametern angegeben ist (vector)
glBegin: pusht einen transform-matrix auf den obersten stack platz
3dvertex: vectoren zu den punkten des objectes
glend: poppt den matrix vom stack raus? rischtig?
aber wenn die mauskoordinaten nicht machen was ich will , wie muss ich dann popmatrix un pushmatrix einsätzen?(ich weiss, so fragen stellt man nicht in foren weil man das auch in einem tutorial lesen kann aber ich find gerade kein gescheites, das dadrauf so gut eingeht, dass ich es auch versteh wie man mit matrizen umgeht (sobald ich eins gefunden hab, sehen die fragen von mir anders aus;) ))
-
Fachmann schrieb:
aber ich hab nochnie eine matrix gepusht oder gepoppt aber trotzdem schon drehende objecte irgentwo im OGL KS gezeichnet. dh der matrix wird automiatsch gepusht und gepoppt un das müsste theorätisch in glBegin und glEnd passiern.
Nix is, da wird nichts selber gepusht.
Von alleine dreht sich da nix.tranform3f?
-
also doch, man kann objecte rendern ohne zu wissen was ein matrix is:
int DrawGLScene(GLvoid) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Die vorherige Szene wird vom Bildschirm gelöscht, // damit die neuen nicht einfach über die alten // Objekte gezeichnet werden glLoadIdentity(); // modelview-Matrix wird zurückgesetzt glTranslatef(0.0f,2.0f,-5.0f); glBegin(GL_QUADS); // Ein Dreieck soll gezeichnet werden glColor3f(0.0f,0.0f,1.0f); // es soll blau werden glVertex3f( 0.0f, 0.0f, 0.0f); // Die obere Ecke des Dreiecks glVertex3f( 1.0f, 0.0f, 0.0f); // unten links glVertex3f( 1.0f,-1.0f, 0.0f); glVertex3f( 0.0f,-1.0f, 0.0f);// unten rechts glEnd(); // Zeichenaktion beenden return TRUE; }*g* da wird ein 3-eck gerendert aber wo wird der matrix dafür gepusht? in glLoadIdentify? da wird einer aber zurückgesetzt
in translate (was ich vorhin auch meinte)?
oder in glBegin (angeblich nicht) ?
-
Da wird auch nirgendwo gespusht, Alle Operationen wirken sich auf die aktuell gesetzte Matrix aus.
LoadIdentity() setzt dir die Einheitsmatrix und dein Translate verschiebt das Objekt,
Frage: ist dort auch wirklich die ModelView-Matrix aktiv und nicht noch die Projektionsmatrix?Ach ja ein Dreieck rendert man meistens eher mit GL_TRIANGLES^^
-
ja ok du hast recht, hab mir ma bei DGLwiki en matrix tutorial durchgelesen un kenn mich jetz en furts besser aus.
und ich habe auch mit glMatrixMode GL_MODELVIEW_MATRIX aktiviert und das mit GL_TRIANGLE war ein kleiner fehler meinerseits^^nun gut also könnte man ja wieder zum eigentlichen problem zurückkehren:
warum geht das so scheisse mit der mausdh ich fang jetz wieder von vorne an aber wenigstens weiss ich was matrizen sind, was der matrixstack ist un wie man (einigermaßen) mit ihnen umgeht.
hab jetz gluUnProject gestartet, dass einem die koordinaten zurückgibt.
diese hab ich ma in nem edit anzeigen lassen. sieht auch ganz gut aus:
im rechten oberen teil sind die X sowie die Y koords positiv
im rechten unteren teil sind die X koords positive, die Ys negativ
uswaber wenn ich jetzt mit translate den zeichner auf die von gluUnPorject zurückgegebenen koordinaten setzt un an dieser stelle dann ein quad mal, dann is das garnicht an dieser stelle. das einziggute ist:
wenn ich en quad an einer stelle mal ist es wo anders
wenn ich en quad weiter unten mal ist es auch woanders aber auch weiter unten. kp warum...ich will auf jedenfall dass es da ist wo die mausdann wurd mir vorgeschlagen den matrix ma zu poppen
hab ich gemacht, un zwar unmittelbar vor gluUnproject ging net, also normal:
vor translate und nach glEnd
...geht nix(nebenbemerkung: gluUntproject weiss ja garnicht die koordinaten des fensters)