die perfekte Ebene???



  • Hallo,

    hab mir eine normale Ebene erstellt

    void grid_x(int dia)
    			{
    				int i;
    				if (true) {
    					glBegin(GL_LINES);
    					glColor3f(153*0.00390625f,153*0.00390625f,153*0.00390625f);
    					for (i = -dia; i<= dia; i+=10) 
    					{
    						glVertex3f((float)i, 0, (float)dia);
    						glVertex3f((float)i, 0, (float)(-dia));
    					}
    					glEnd();
    					glBegin(GL_LINES);
    					glColor3f(153*0.00390625f,153*0.00390625f,153*0.00390625f);
    					for (i = -dia; i<= dia; i+=10)
    					{
    						glVertex3f((float)dia,0,(float)i);
    						glVertex3f((float)(-dia),0,(float)i);
    					}
    					glEnd();
    				}
    			}
    

    diese steuere ich mit einem Trackball.

    mir kommt es vor, dass meine Ebene (oberes) Bild
    nach vorne kippt - ich bekomme einfach nicht die Perspektive hin, welche der Lego Designer (unteres Bild) verwendet

    habt ihr einen Rat?
    mit freundlichen Grüßen
    Matthias Asselborn
    http://www.asselborn-matthias.de/ebene.jpg



  • Ich bin in der Materie momentan nicht so fit, insofern kann es an etwas völlig anderem liegen, aber...

    ...ich würde mal testweise den Öffnungswinkel Deiner Kamera verringern und die Ebene entsprechend ein gewisses Stück weiter von der Kamera entfernt positionieren.



  • Also für micht sieht es so aus, als würde der Lego-Editor eine Isometrische Darstellung der Szene erzeugen.

    Aber wie genau man das mit OpenGL macht, weiß ich nicht.

    http://gidf.de 😃



  • http://de.wikipedia.org/wiki/Axonometrie

    Einfach Projektionsmatrix selber setzen: Basis für Isometrie:

    u=122(110)u = \frac{1}{2} \sqrt{2} \left( \begin {array} {c} -1 \\ 1 \\ 0 \end {array} \right)
    v=166(112)v = \frac{1}{6} \sqrt{6} \left( \begin {array} {c} -1 \\ -1 \\ 2 \end {array} \right)
    n=133(111)n = \frac{1}{3} \sqrt{3} \left( \begin {array} {c} 1 \\ 1 \\ 1 \end {array} \right)



  • Hallo, danke für die vielen Beitrage!
    ja die Ebene vom Lego Designer ist Isommetrisch das hab ich vor ner Woche mit einem CAD Programm rausgemossen.



  • Einer der Parameter von gluPerspective ist dafür verantwortlich.



  • MatthiasA schrieb:

    ja die Ebene vom Lego Designer ist Isommetrisch

    Ganz sicher nicht.

    MatthiasA schrieb:

    das hab ich vor ner Woche mit einem CAD Programm rausgemossen.

    Wow. Ich kann mit bloßem Auge erkennen, dass da eine perspektive Verzerrung vorliegt. Die äußeren Begrenzungslinien sind nicht parallel. Wenn also nicht schon das dargestellte Gitter selbst verzerrt ist, ist das keine isometrische Projektion.



  • MatthiasA schrieb:

    ja die Ebene vom Lego Designer ist Isommetrisch das hab ich vor ner Woche mit einem CAD Programm rausgemossen.

    Nein, ist sie nicht. Eine isometrische Projektion ist eine Parallelprojektion unter einem bestimmten vorgegebenen Winkel. Das ist hier aber keine Parallelprojektion: Kannst Du ganz einfach daran erkennen, dass die Kästchen hinten kleiner als vorne sind. Bei einer Parallelprojektion wäre das nicht der Fall.



  • hat nicht so recht geklappt mit der isometrie Perspektive
    bei mir siehts so aus
    gluPerspective(45.0f,(float)width/(float)height,0.1f,3000.0f);//3000
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

    wie projeziere ich die Ebene richtig?
    auch die Rotation meines Trackballs passt nicht mit
    der Ebene vom LegoDesigner zusammen



  • gluPerspective erzeugt eine Matrix für eine perspektivische Projektion. Du gibst da ja ein View Frustum in Form eines Pyramidenstumpfs an, das dann auf einen Einheitswürfel abgebildet wird - ist klar, dass dann weiter entfernte Objekte kleiner dargestellt werden und du eine perspektivische "Verzerrung" bekommst.
    Die isometrische Perspektive hingegen ist eine Parallelprojektion.



  • okay aber wie kann ich den Winkel so einstellen dass es so aussieht wie
    bei dem Designer oder wie ändere ich das mit dem Pyramidenstumpf?

    also ist das von Lego verwendete eine isometrische Parallelprojektion?
    und ich habe eine perspektivische Projektion verwendet?

    Gruß Matthias



  • jaja ignoriere doch einfach meine antwort



  • Vertexwahn schrieb:

    jaja ignoriere doch einfach meine antwort

    Was mir diese angegebene Basis bringen sollte, ist mir auch nicht klar.

    @MatthiasA: Kennst du google?
    http://www.google.de/search?as_q=matrix+isometrische+projektion&hl=de&num=10&btnG=Google-Suche&as_epq=&as_oq=&as_eq=&lr=&cr=&as_ft=i&as_filetype=&as_qdr=all&as_occt=any&as_dt=i&as_sitesearch=&as_rights=&safe=images



  • der Fehler bei mir liegt in der Perspektive denke ich

    ich bette nun die 3x3 in eine 4x4 Matrix ein



  • MatthiasA schrieb:

    also ist das von Lego verwendete eine isometrische Parallelprojektion?

    Nein, ist es nicht. Wer Dir das hier sagt, hat entweder das Bild nicht genau angeguckt oder hat keine Ahnung.



  • bin nun soweit gekommen aber es ist noch nicht die gleiche Ebene wie die im Lego designer
    diese ist nun isometrische Perspektive
    mit Parralel Projektion
    gelöst durch die Projektionsmatrix

    -1 -1 1 0
    1 -1 1 0
    0 2 1 0
    0 0 0 80
    Gruß Matthiashttp://www.asselborn-matthias.de/para.JPG
    http://www.asselborn-matthias.de/para3.JPG

    die vom Legodesigner ist nicht isometrisch und auch keine Prallelprojektion weil vorne die Kästchen doch größer als die Hinteren sind!

    wie erstelle ich also solch eine Ebene?



  • MatthiasA schrieb:

    wie erstelle ich also solch eine Ebene?

    Das hat dir Gregor eigentlich schon gesagt, im zweiten Beitrag in diesem Thread.



  • habe nun

    gluPerspective(24.0f,(GLfloat)width/(GLfloat)height,0.1f,3000.0f);
    verwendet.
    Gregor hatte recht

    Nun sieht sie eigentlich gut aus.
    habt Ihr noch Verbesserungsvorschläge?
    Verschiedene Linenestärken und Anti Alasing werde ich noch hinzufügen.

    habe nun noch nicht gluLookAt verwendet
    sondern die Ebene mit den Funktionen

    [code]
    virtual System::Void Render(System::Void)
    {
    MySetCurrentGLRC();
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear screen and depth buffer

    glLoadIdentity(); // Reset the current modelview matrix

    glTranslatef(0.0f,0.0f,-800.0f);
    //gluLookAt(1,0,0,45,0,-1000,0,1,0);

    t2->arcball_rotate();
    glRotatef(38,1.0f,0.0f,0.0f);
    glRotatef(45,0.0f,1.0f,0.0f);
    grid_x(200);
    code]

    dargestellt
    ich finde das 2 mal Rotate aber nicht sonderlich schön
    kann man das auch mit gluLookAt machen?

    http://www.asselborn-matthias.de/ebene.JPG

    Gruß Matthias



  • hab nun gluLookAt verwendet

    Mittelpunkt Ebene (0,0,0)

    Koordinaten Augpunkt
    (636 , 636, 900) oder
    sinus 45 grad * 900 = 636
    also gluLookAt(636,636,900,0,0,0,0,1,0);

    oder
    (900 , 1272 ,1800)
    sinus 45 grad * 1800 = 1272
    also gluLookAt(900,1272,1800,0,0,0,0,1,0);

    davor kein translatef und nicht s mehr
    nur das glulookat und gluperspective
    aber ich komme nur zu dem Ergebnis

    http://www.asselborn-matthias.de/ebene2.JPG

    Gruß matthias



  • es hat geklappt

    kleiner Denkfehler
    sollte gluLookAt(900,636,900...) heissen

    http://www.asselborn-matthias.de/ebene6.JPG

    aber warum steht die Ebene nun nicht 45 Grad nach vorne so wie wenn ich es mit dem rotatef mache ?

    Gruß Matthias



  • hab ich nun auch hinbekommen
    für die Nachwelt die Lego Designer Ebene steht in

    gluLookat(900,900,900,0,0,0,0,1,0);
    recht simpel eigentlich 😉

    http://www.asselborn-matthias.de/ent.JPG
    

Anmelden zum Antworten