Seite 1 von 1

[gelöst] Qt und opengl - problem mit rotation

Verfasst: 25. April 2010 11:09
von Gorn
Hi, hab derzeit ein Problem mit OpenGL unter Qt.

Programmiere schon länger Qt und bin da bereits gut drin, nur OpenGL bin ich jetzt neu am lernen (brauch es für ein Projekt) und versuche mich grade durch das NeHe Tutorial zu schlagen. Ich habe jetzt ein Problem mit der Rotation. Wenn ich ein Rechteck und ein Dreieck rotieren lasse, verschwinden teile der Polygone teilweise, sie werden scheinbar vom Hintergrund überdeckt. Es sieht seltsam aus. Wenn ich gar nicht oder nur in der z-Achse drehe, bleibt alles sichtbar, wenn ich jedoch die x- oder y-Achse rotieren lasse, schneidet es mir einfach einige Dinge ab.

Hab hier mal ein Bild des Problems:
Bild

Ich habe bereits einige Dinge in der Initialisierung ausprobiert, jedoch scheint keine der Standard Initialisierungsbefehle, die ich bisher gefunden habe, bei diesem Problem zu helfen. Ich nehme an das es sich eher um ein Problem seitens Qt handelt.

Bzgl. der Daten:
Benutze Win7 - 32Bit
Qt Version 4.6.2 unter Visual Studio 2008

Hier noch der Code, einige Dinge die auskommentiert sind habe ich mal benutzt, hat allerdings überhaupt nichts am Problem verändert:

Code: Alles auswählen

#include "displayWidget.h"
#include <QColor>

#ifndef GL_MULTISAMPLE
#define GL_MULTISAMPLE  0x809D
#endif

displayWidget::displayWidget(QWidget *parent) 
		: QGLWidget(QGLFormat(QGL::SampleBuffers), parent){
	xRot = 0;
	yRot = 0;
	zRot = 0;

	rtri = 0;
	rquad = 0;

	qtGreen = QColor::fromCmykF(0.40, 0.0, 1.0, 0.0);
	qtPurple = QColor::fromCmykF(0.39, 0.39, 0.0, 0.0);
}

displayWidget::~displayWidget(){
	makeCurrent();
	glDeleteLists( object, 1 );
}

QSize displayWidget::minimumSizeHint() const {
	return QSize(50, 50);
}

QSize displayWidget::sizeHint() const {
	return QSize(400, 400);
}

void displayWidget::initializeGL(){
/*	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glOrtho(-.5, .5, .5, -.5, -1000, 1000);
	glMatrixMode(GL_MODELVIEW);
*/

	glShadeModel(GL_SMOOTH);	// Enable Smooth Shading
	qglClearColor(Qt::black);	// Black Background
	glClearDepth(1.0f);			// Depth Buffer Setup

//	glEnable(GL_CULL_FACE);
/*	glEnable(GL_MULTISAMPLE);
	glEnable(GL_DEPTH_TEST);	// Enables Depth Testing
	glDepthFunc(GL_LEQUAL);		// The Type Of Depth Testing To Do
	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);	// Really Nice Perspective Calculations
*/

	object = makeObject();		// Generate an OpenGL display list
}

void displayWidget::paintGL(){
	object = makeObject();
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	glMatrixMode(GL_MODELVIEW);
	glPushMatrix();
	glEnable(GL_MULTISAMPLE);
	glCallList(object);
	glPopMatrix();

	glLoadIdentity();
	glRotatef(xRot, 1.0, 0.0, 0.0);
	glRotatef(yRot, 0.0, 1.0, 0.0);
	glRotatef(zRot, 0.0, 0.0, 1.0);
	glCallList(object);
}

void displayWidget::resizeGL(int width, int height){
    glViewport( 0, 0, (GLint)width, (GLint)height );
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 15.0 );
    glMatrixMode( GL_MODELVIEW );
}

void displayWidget::setXRotation(int angle){
	normalizeAngle(angle);
	if(angle != xRot){
		xRot = angle;
		emit xRotationChanged(angle);
		updateGL();
	}
}

void displayWidget::setYRotation(int angle){
	normalizeAngle(angle);
	if(angle != yRot){
		yRot = angle;
		emit yRotationChanged(angle);
		updateGL();
	}
}

void displayWidget::setZRotation(int angle){
	normalizeAngle(angle);
	if(angle != zRot){
		zRot = angle;
		emit zRotationChanged(angle);
		updateGL();
	}
}

void displayWidget::normalizeAngle(int& angle){
	while(angle >= 360)
		angle -= 360;
	while(angle < 0)
		angle += 360;
}

GLuint displayWidget::makeObject(){
	GLuint list;
	list = glGenLists(1);

	glNewList(list, GL_COMPILE);
	{

		qglColor(Qt::white);				// means qglColor(white)
		glTranslatef(-1.5f,0.0f,-15.0f);

		//glRotatef(rtri,0.0f,1.0f,0.0f);

		glBegin(GL_TRIANGLES);				// Drawing Using Triangles
			glColor3f(0.0f,0.0f,1.0f);		// RGB: Blue
			glVertex3f( 0.0f, 1.0f, 0.0f);	// Top
			glColor3f(0.0f,1.0f,0.0f);		// RGB: Green
			glVertex3f(-1.0f,-1.0f, 0.0f);	// Bottom Left
			glColor3f(1.0f,0.0f,0.0f);		// RGB: Red
			glVertex3f( 1.0f,-1.0f, 0.0f);	// Bottom Right
		glEnd();							// Done drawing the Triangle

		glTranslatef(3.0f,0.0f,0.0f);		// Move Right 3 Units

		//glRotatef(rquad,1.0f,0.0f,0.0f);

		glBegin(GL_QUADS);					// Draw A Quad
			glVertex3f(-1.0f, 1.0f, 0.0f);	// Top Left
			glVertex3f( 1.0f, 1.0f, 0.0f);	// Top Right
			glColor3f(0.0f,1.0f,0.0f);
			glVertex3f( 1.0f,-1.0f, 0.0f);	// Bottom Right
			glVertex3f(-1.0f,-1.0f, 0.0f);	// Bottom Left
		glEnd();							// Done drawing the Quad

		//rtri += 0.2f;
		//rquad -= 0.15f;
	}
    glEndList();

	return list;
}
PS: ka warum der ganze Code jetzt grün ist ~

Verfasst: 25. April 2010 11:56
von solarix
Das hat nichts mit Qt zu tun... ist eine reine OpenGL-Angelegenheit:

Ich schätze mal du renderst die Objekte ganz am Ende des sichtbaren Bereiches:
glTranslatef(-1.5f,0.0f,-15.0f);
...
glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 15.0 );
Wie sähe es denn aus mit einem grösseren Clipping-Bereich (znear. zfar):
glFrustum( -1.0, 1.0, -1.0, 1.0, 0.1, 20.0);

Verfasst: 25. April 2010 12:15
von Gorn
Super, funktioniert^^

Hätte jetzt nicht gedacht das es daran liegt, sondern eher an einer fehlenden oder falschen Init einstellung, so kann man sich täuschen^^

danke :D