[gelöst] Qt und opengl - problem mit rotation
Verfasst: 25. April 2010 11:09
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:

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:
PS: ka warum der ganze Code jetzt grün ist ~
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:

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;
}