Verdrehte Achsen
-
Hi,
ich habe das Problem, dass bei mir die Achsen (x,y,z) vertauscht sind. Ich hatte als Vorgabe die gluLookAt-Funktion mit gegebenen Parametern. Um zu überprüfen ob die Achsen korrekt sind, habe ich ein Koordinatensystem verwendet. Ergebnis: die eigentliche z-Achse ist die x-Achse, die eigentliche y-Achse ist die z-Achse und die eigentliche x-Achse ist die y-Achse.
Ich habe nun schon probiert die gluLookAt-Funktion mit anderen Parametern zu benutzen jedoch scheint das dann auch nicht zu stimmen :(. Alternativ zur gluLookAt-Funktion habe ich versucht mir mit glTranslated und glRotated zu helfen, allerdings wurde es auch nur bedingt besser. Wenn ich weder die gluLookAt-Funktion, noch die glTranslated und glRotated verwende, zeigt es mir nichts an
. Hier mal mein Quellcode:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using Tao.OpenGl; namespace CGV_Aufg1 { public partial class Form1 : Form { int width=400,height=300; double rot = 0; public Form1() { InitializeComponent(); this.simpleOpenGlControl1.InitializeContexts(); Gl.glClearDepth(1.0); Gl.glClearColor(0, 0, 0, 0); Gl.glEnable(Gl.GL_DEPTH_TEST); Gl.glDepthMask(Gl.GL_TRUE); Gl.glViewport(0, 0, width, height); Gl.glMatrixMode(Gl.GL_PROJECTION); Gl.glLoadIdentity(); Glu.gluPerspective(40.0f, (double) width / (double) height, 0.01f, 5000.0f); Gl.glEnable(Gl.GL_CULL_FACE); Gl.glCullFace(Gl.GL_BACK); } private void simpleOpenGlControl1_Paint(object sender, PaintEventArgs e) { Gl.glClear(Gl.GL_COLOR_BUFFER_BIT|Gl.GL_DEPTH_BUFFER_BIT); Gl.glMatrixMode(Gl.GL_MODELVIEW); Gl.glLoadIdentity(); Glu.gluLookAt(2.0, 2.0, 4.0, 0.5, 0.5, 0.5, 0.0, 1.0, 0.0); //Gl.glTranslated(0, 0, -5); //Gl.glRotated(75, -25, 5, 5); //wenn Würfel ausgewählt ist dann: if (radioButton2.Checked == true) { if (checkBox1.Checked == true) { Gl.glRotated(rot, 0, 0, 1); //bei Bedarf Rotation einschalten } //Koordinatensystem Gl.glBegin(Gl.GL_LINES); Gl.glColor3f(1.0f, 0.0f, 0.0f); Gl.glVertex3f(0.0f, 0.0f, 0.0f); Gl.glVertex3f(1.0f, 0.0f, 0.0f); Gl.glColor3f(0.0f, 1.0f, 0.0f); Gl.glVertex3f(0.0f, 0.0f, 0.0f); Gl.glVertex3f(0.0f, 1.0f, 0.0f); Gl.glColor3f(0.0f, 0.0f, 1.0f); Gl.glVertex3f(0.0f, 0.0f, 0.0f); Gl.glVertex3f(0.0f, 0.0f, 1.0f); Gl.glEnd(); } else { //wenn Drahtgittermodell ausgewählt ist dann: if (checkBox1.Checked == true) { Gl.glRotated(rot, 0, 0, 1); //bei Bedarf Rotation einschalten } //oben Gl.glBegin(Gl.GL_LINE_LOOP); Gl.glColor3f(0.0f, 1.0f, 0.0f); Gl.glVertex3f(1.0f, 1.0f, -1.0f); Gl.glVertex3f(-1.0f, 1.0f, -1.0f); Gl.glVertex3f(-1.0f, 1.0f, 1.0f); Gl.glVertex3f(1.0f, 1.0f, 1.0f); Gl.glEnd(); //unten Gl.glBegin(Gl.GL_LINE_LOOP); Gl.glColor3f(1.0f, 0.5f, 0.0f); Gl.glVertex3f(1.0f, -1.0f, 1.0f); Gl.glVertex3f(-1.0f, -1.0f, 1.0f); Gl.glVertex3f(-1.0f, -1.0f, -1.0f); Gl.glVertex3f(1.0f, -1.0f, -1.0f); Gl.glEnd(); //vorn Gl.glBegin(Gl.GL_LINE_LOOP); Gl.glColor3f(0.0f, 0.0f, 1.0f); Gl.glVertex3f(1.0f, 1.0f, 1.0f); Gl.glVertex3f(-1.0f, 1.0f, 1.0f); Gl.glVertex3f(-1.0f, -1.0f, 1.0f); Gl.glVertex3f(1.0f, -1.0f, 1.0f); Gl.glEnd(); //hinten Gl.glBegin(Gl.GL_LINE_LOOP); Gl.glColor3f(1.0f, 1.0f, 0.0f); Gl.glVertex3f(1.0f, -1.0f, -1.0f); Gl.glVertex3f(-1.0f, -1.0f, -1.0f); Gl.glVertex3f(-1.0f, 1.0f, -1.0f); Gl.glVertex3f(1.0f, 1.0f, -1.0f); Gl.glEnd(); //links Gl.glBegin(Gl.GL_LINE_LOOP); Gl.glColor3f(0.0f, 1.0f, 1.0f); Gl.glVertex3f(-1.0f, 1.0f, 1.0f); Gl.glVertex3f(-1.0f, 1.0f, -1.0f); Gl.glVertex3f(-1.0f, -1.0f, -1.0f); Gl.glVertex3f(-1.0f, -1.0f, 1.0f); Gl.glEnd(); //rechts Gl.glBegin(Gl.GL_LINE_LOOP); Gl.glColor3f(1.0f, 0.0f, 1.0f); Gl.glVertex3f(1.0f, 1.0f, -1.0f); Gl.glVertex3f(1.0f, 1.0f, 1.0f); Gl.glVertex3f(1.0f, -1.0f, 1.0f); Gl.glVertex3f(1.0f, -1.0f, -1.0f); Gl.glEnd(); } } private void timer1_Tick(object sender, EventArgs e) { rot++; this.simpleOpenGlControl1.Invalidate(); } } }
Danke fürs lesen.
-
Verstehe das Problem bzw. die Frage nicht ganz.
Durch Transformationen wie gluLookAt und glRotate wird natürlich deine ModelViewMatrix geändert. Dadurch ändern sich die Achsenrichtungen im Object-Space in Relation zum World-Space.
Was wären für dich denn korrekte Achsen?
-
inter2k3 schrieb:
Was wären für dich denn korrekte Achsen?
Mit "korrekten Achsen" meine ich, dass wenn ich das Koordinatensystem:
//Koordinatensystem Gl.glBegin(Gl.GL_LINES); Gl.glColor3f(1.0f, 0.0f, 0.0f); Gl.glVertex3f(0.0f, 0.0f, 0.0f); Gl.glVertex3f(1.0f, 0.0f, 0.0f); Gl.glColor3f(0.0f, 1.0f, 0.0f); Gl.glVertex3f(0.0f, 0.0f, 0.0f); Gl.glVertex3f(0.0f, 1.0f, 0.0f); Gl.glColor3f(0.0f, 0.0f, 1.0f); Gl.glVertex3f(0.0f, 0.0f, 0.0f); Gl.glVertex3f(0.0f, 0.0f, 1.0f); Gl.glEnd();
auch so dargestellt bekomme wie die Koordinaten angegeben sind. Wie ich jedoch bereits versucht habe zu erklären, ist keine Achse des Koordinatensystem an richtiger Stelle.
so solls aussehen:
http://s1.directupload.net/file/d/2325/yjaplwf2_jpg.htm
so siehts aber mit obrigen Quellcode aus:
-
bluethunder schrieb:
so solls aussehen:
nope.
bluethunder schrieb:
so siehts aber mit obrigen Quellcode aus:
und genau so sollte es auch aussehen. Wenn du etwas anderes willst musst du dir selbst die entsprechenden Matritzen zusammenbauen. Die glu Funktionen liefern dir jedenfalls genau dieses Koordinatensystem.
-
Hm - also mir ist immernoch nicht klar, wie du darauf kommst, dass die Achsen gemäss deiner Vorstellung ausgerichtet werden müssten.
Ohne jegliche Transformationen befindet sich der Viewpoint an Position (0,0,0) im World-Space mit Blickrichtung entlang der negativen Z-Achse (d.h. die Z-Achse kommt sozusagen aus dem Monitor herraus und zeigt genauf auf dich, wenn du dich vor ihm befindest).
Dass dann die X-Achse "nach rechts" hin positive Werte hat ist klar denke ich.Mit gluLookAt gibst du den Viewpoint, die Blickrichtung und den up-Vektor an. Da es aber sowas wie eine Kamera in OpenGL nicht gibt (deswegen wird die Model-Matrix und die Viewing-Matrix auch zusammengefasst zur ModelviewMatrix) macht die Funktion nicht anderes als einige Rotations- und Translations-Calls.
Ob man eine Kamera nämlich irgendwo positioniert oder die gesamte Szene verschiebt / rotiert macht letztendlich keinen Unterschied.Du legst mit gluLookAt ja den ViewPoint auf (2,2,4) mit Blickrichtung auf (0.5,0.5,0.5).
Das von dir gepostete Bild wie es mit dem code aussieht entspricht absolut dem, was ich erwarten würde.
Du scheinst noch nicht ganz verstanden zu haben, wie die Achsen angeordnet sind.