Seite 1 von 1

[Gelöst] Brauche Hilfe bei OpenGL Widget

Verfasst: 6. November 2010 23:45
von snowflake
Hei Leute,

kann mir mal jemand auf die Sprünge helfen ?

ich will das "Hello GL" auf allgemeine 3D Daten umschreiben und stehe gerade auf dem Schlauch.

Meine 3D Daten werden aus stl (stereolithography) Dateien ausgelesen und auch angezeigt, allerdings stimmen Rotation um x und y Achse nicht und die Beleuchtung krieg ich nicht in den Griff.

Die Rotation um x und y scheint das komplette Koordinatensystem zu drehen anstatt die Objektkoordinaten meines einzelnen Objektes. Was mach ich falsch ?

Es soll sich das Objekt im Raum bei gehaltenem Cursor drehen, so wie im Beispiel und die Kamera relativ dazu aber stehenbleiben

hier mal die 2 wichtigsten Methoden

Code: Alles auswählen

void GLWidget::initializeGL()
{
	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

	glEnable(GL_DEPTH_TEST);
	glShadeModel(GL_SMOOTH);
	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);
	static GLfloat lightPosition0[4] = { 5.0, 5.0, 7.0, 1.0 };
	glLightfv(GL_LIGHT0, GL_POSITION, lightPosition0);

	glEnable(GL_LIGHT1);
	static GLfloat lightPosition1[4] = { -5.0, 5.0, 7.0, 1.0 };
	glLightfv(GL_LIGHT1, GL_POSITION, lightPosition1);

	GLfloat mat_amb_diff[] = { 1.0, 1.0, 1.0, 1.0 };
	glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_amb_diff);
}

void GLWidget::paintGL()
{
	qglClearColor(qtPurple.dark());

	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	glTranslatef(0.0, 0.0, zPos);
	glRotatef(xRot / 16.0, 1.0, 0.0, 0.0);
	glRotatef(yRot / 16.0, 0.0, 1.0, 0.0);
	glRotatef(zRot / 16.0, 0.0, 0.0, 1.0);

	int normalCounter = 0;

	glColor3f( 0.0, 0.0, 0.5 );

	for (int i = 0; i < vertices.size(); i+=3)
	{
		glBegin(GL_TRIANGLES);
			glNormal3f( normals[normalCounter].x(), normals[normalCounter].y(), normals[normalCounter].z());
			glVertex3f( vertices[i].x(), vertices[i].y(), vertices[i].z());
			glVertex3f( vertices[i+1].x(), vertices[i+1].y(), vertices[i+1].z());
			glVertex3f( vertices[i+2].x(), vertices[i+2].y(), vertices[i+2].z());
		glEnd();

		normalCounter++;
	}
}
bei der Beleuchtung sauft mir eine Hälfte des Objektes ab, weil die Ambient Beleuchtung ja nur generell aufhellt.

Gibt es hier noch eine omnipräsente Lichtquelle oder muss ich einen Spot pro Ecke in einem gedachten umgebenden Quadrat setzen ?

Bitte entschuldigt meine Fragen, ich habe eigentlich schon probiert mich wieder in OpenGL einzulesen, aber da nun nach ner knappen Woche immer noch nicht alles so funktioniert, wie es soll, muss jetzt mal beschleunigt werden.

Achso noch was, in einem WheelEvent soll noch skaliert werden, aber das sollte ja recht einfach zu machen sein

Re: Brauche Hilfe bei OpenGL Widget

Verfasst: 7. November 2010 17:50
von solarix
snowflake hat geschrieben: Die Rotation um x und y scheint das komplette Koordinatensystem zu drehen anstatt die Objektkoordinaten meines einzelnen Objektes.
Und woher soll denn OpenGL wissen, wo das Zentrum deines Objektes liegt? Daher: selbstverständlich wird hier das Koordinatensystem gedreht.. Aber: weil die Vertexes deines Models ja um 0/0/0 angeordnet sind, kannst du das Problem ganz einfach lösen: zuerst drehen und dann verschieben:

Code: Alles auswählen

   // Objekt um Nullpuntk drehen:
   glRotatef(xRot / 16.0, 1.0, 0.0, 0.0);
   glRotatef(yRot / 16.0, 0.0, 1.0, 0.0);
   glRotatef(zRot / 16.0, 0.0, 0.0, 1.0);

   // gedrehtes Objekt verschieben..
   glTranslatef(0.0, 0.0, zPos);

Bei der Beleuchtung kann ich dir leider nicht helfen.. Aber weil Beleuchtung auch kein ganz einfaches Thema ist, würde ich eher in einem OpenGL-Forum nachfragen..

Viel Glück noch!

Verfasst: 17. November 2010 14:35
von snowflake
danke für deine Hilfe, das Problem war mehr als dämlich ^^

die Objekte wurden von einem externen Punkt aus referenziert, hab mir jetzt den Mittelpunkt des Objektes berechnet und alle Punkte systematisch davon abgezogen, damit der Mittelpunkt mittig im Objekt liegt, dann klappts auch mit der Drehung ;)

und die Beleuchtung hab ich auch im Griff, die wurde entsprechend dem obigen Fehler auch am falschen Punkt im Raum gesetzt ...