Drehung eines gluCylinder() um zwei Achsen ,

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • meine Draw-Methode:

    Quellcode

    1. static float x = 0.0;
    2. static float y = 0.0;
    3. static float z = 0.0;
    4. x +=1.5;
    5. if(x>360) x-=360;
    6. y +=1.0;
    7. if(y>360) y-=360;
    8. z +=0.1;
    9. if(z>360) z-=360;
    10. glEnable(GL_DEPTH_TEST);
    11. glEnable(GL_BLEND);
    12. glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
    13. glShadeModel(GL_SMOOTH);
    14. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
    15. glEnableClientState(GL_VERTEX_ARRAY);
    16. glVertexPointer(3,GL_FLOAT,0,vertexArray);
    17. glMatrixMode(GL_PROJECTION);
    18. glLoadIdentity();
    19. glOrtho(-10.0,10.0,-10.0,10.0,-15.0,15.0);
    20. glMatrixMode(GL_MODELVIEW);
    21. glLoadIdentity();
    22. glPushMatrix();
    23. glRotatef(x,0.0,0.0,1.0);
    24. glRotatef(y,1.0,0.0,0.0);
    25. glRotatef(z,0.0,1.0,0.0);
    26. glCullFace(GL_FRONT_AND_BACK);
    27. glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
    28. glColor3f(0,0,1);
    29. glDrawArrays(GL_TRIANGLES,0, noElements/3);
    30. glPopMatrix();
    31. [[self openGLContext] flushBuffer]
    Alles anzeigen
  • snowman, du hilfst mir weiter, ich hab schon überlegt wie ich einen Zylider aus Dreiecken zusammen
    setze. Es bleiben aber noch zwei Fragen:
    1. Da ich das Licht eingeschaltet habe, brauche ich die Normalen der Dreiecke und das Berechnen
    von Normalen ist nocht klar. Übernimmt glDrawArrays() diese Aufgabe ?
    2. Du hast noElement nicht definiert, was macht dieser Zähler ?
    Uwe
  • ich berechne hier die Daten, darum nur als Beispiel, z.B. für einen Würfel:

    Quellcode

    1. static GLfloat cubeData[][3] = {
    2. {-0.5,0.5,-0.5},{0.5,0.5,-0.5},{0.5,-0.5,-0.5},{-0.5,-0.5,-0.5},
    3. {-0.5,0.5,0.5},{0.5,0.5,0.5},{0.5,-0.5,0.5},{-0.5,-0.5,0.5}
    4. };


    Rechts oder links ist im Prinzip egal, da gibt es eine Funktion, mit der man festlegen kann, was vorne ist. Habe jetzt aber leider keine Zeit im Redbook zu suchen, vielleicht morgen.
  • Wenn morgen heute ist liest du dies:
    Das Redbook habe ich auch, du meinst CW oder CCW, was mich irritiert ist, daß die vertices
    in Figure 2-6 rechts herum angegeben werden, währen CCW default ist.
    Was mir nicht klar ist, wie ordnet OpenGL ein GL_NORMAL_ARRAY dem korrespondierenden
    GL_VERTEX_ARRAY zu ?
    Schreibe ich einfach glVertexPointer(3,GL_FLOAT,0,normalArray);
    glVertexPointer(3,GL_FLOAT,0,vertexArray);
    Das wäre schön.
    Uwe
  • Original von Uwe
    snowman, du hilfst mir weiter, ich hab schon überlegt wie ich einen Zylider aus Dreiecken zusammen
    setze. Es bleiben aber noch zwei Fragen:
    1. Da ich das Licht eingeschaltet habe, brauche ich die Normalen der Dreiecke und das Berechnen
    von Normalen ist nocht klar. Übernimmt glDrawArrays() diese Aufgabe ?
    2. Du hast noElement nicht definiert, was macht dieser Zähler ?
    Uwe


    Wenn Du erstmal die Basics hinbekommen möchtest, würd' ich mit direktem Zeichnen anfangen, nicht mit Quadrics und nicht mit glDrawArrays. Sowas wie in etwa hier (die Normalen gehen so übrigens):

    Quellcode

    1. int steps=30;
    2. float radius=2.0;
    3. float height=4.0;
    4. glBegin(GL_QUAD_STRIP);
    5. int i;
    6. for (i=0;i<=steps;i++) {
    7. float angle=i*2.0*M_PI/steps;
    8. float x=sin(angle);
    9. float z=cos(angle);
    10. glNormal3f(x,0,z);
    11. glVertex3f(x*radius,-height/2.0,z*radius);
    12. glVertex3f(x*radius, height/2.0,z*radius);
    13. }
    14. glEnd();
    Alles anzeigen

    Optimieren kommt später... ;)
    Multigrad - 360°-Produktfotografie für den Mac
  • Lieber Mattik. optimizing is not the state I'm in. Ich brauche für meine Applikation eine Methode
    mit der ich einen Zylinder mit eiener beliebigen räumlichen Ausrichtung zeichnen kann, etwa
    mit folgender Deklaration : -(void)drawCylinderFromPointA: pt1 toPointB: pt2.
    Wenn das so einfach geht wie deine Antwort suggeriert, umso besser.
    Also her mit der kleinen Französin :)
    Uwe
  • Ok, das Zylindermalen ist also gar nicht das Problem, sondern die Ausrichtung. Da gibt's einen Haufen Möglichkeiten. Man kann natürlich die Geometrie des Zylinders gleich gedreht und verschoben berechnen, aber das ist umständlich. Ich würde eher einen Standardzylinder nehmen und per Transformation malen. Das sollte recht einfach sein:

    Ich nehme an, dass der Standardzylinder in der Richtung (0,1,0), also vertikal gemalt wird, und zwar um den Mittelpunkt zentriert (so wie im Beispielcode oben).

    Die Ausrichtung des Zylinders ist der Vektor: dir = pt2-pt1
    Dann ist die Länge des Zylinders die Länge von dir: len = |dir|
    Der Mittelpunkt des Zylinders: mid = (pt1+pt2)
    Die Verschiebung ist also einfach ein glTranslate(mid). Fehlt die Rotation. Dazu könnte man um alle drei Grundrichtungen drehen. Einfacher ist eine einzige Drehung um die richtige Achse. Diese Achse sowohl senkrecht zu der Ursprungsrichtung (0,1,0) sein als auch senkrecht zur gewünschten Richtung dir. Das erledigt das Kreuzprodukt: axis = (0,1,0) x dir.
    Wenn axis der Nullvektor ist, wird gar nicht gedreht. Sonst axis normieren: axis = ||(0,1,0) x dir||
    Nun fehlt noch der Winkel. Dazu könnte man z.B. das Skalarprodukt verwenden, denn das Skalarprodukt von A x B ist im 3D-Raum die Länge von A * die Länge von B * cosinus vom eingeschlossenen Winkel: angle = acos ((0,1,0)*||dir||)
    Jetzt hast Du Winkel und Achse zun drehen - lediglich das Vorzeichen des Winkels müsstest Du noch checken, das bleibt Übung für den Leser... :)

    Dü könntest sogar den Standardzylinder immer mit fester Länge und Breite malen und die Größe berücksichtigen, indem Du eine Skalierung in die Transformation einbaust.
    Multigrad - 360°-Produktfotografie für den Mac