Seite 1 von 1

QGL_Widget / Update ohne alles neu zu zeichnen?

Verfasst: 29. Juni 2009 14:04
von curator
Hallo Gemeinde,

ich habe es geschafft mit qgl_widget eine Szene darzustellen, in der sehr viele einzelne Gerade sind (Teilweise > 1000).
bb
geschrieben habe ich ich die painGL() in etwa folgendes.

Code: Alles auswählen

float GeometryScale; //Skalierungsfaktor Auflösung -->Szene
QPoint GeometryMiddle; //Mittelpunkt der geometrischen Szene

// Hintergrund weiß
glClearColor(1,1,1,0);
glClear(GL_COLOR_BUFFER_BIT);

// Matrix um Bild einzuzeichnen
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
	
glOrtho(-this->width()/2,this->width()/2,-this->height()/2,this->height()/2,-m_kMax,1);

	
// Matrix um Bild einzuzeichnen
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glScalef(m_Scale,m_Scale,1); //m_Scale wird per Mausraus mit 1.1 dividiert oder multipliziert --> Zoom

glTranslatef(m_qcurrentPosition.x,m_qcurrentPosition.y,0); // kann mehr Maus verschoben werden (Drag & Drop der Geometrischen Szene)

glScalef(1/GeometryScale,1/GeometryScale,1);

glTranslatef(-GeometryMiddle.x,-GeometryMiddle.y,0);

//Ab hier wird einfach gezeichnet, gerade für Gerade etc.
/*
*/
Nun zu meinem Problem. Die eigentliche Geometrische Szene ändert sich nur sehr selten, daher Frage ich mich, ob des nicht möglich ist bei einem Mausrad drehen, bei dem jetzt alles neu gezeichnet wird, nur die "Blickposition zu ändern". So würde das wegbewegen der Kamera das Bild verkleinern, würde ich erwarten, ein entsprechendes Verschieben der Kamera der gewünschten Moveeffekt bringen.

Ziel ist es für für also, die Szene einmal zu zeichnen, Sie mir dann per Mausoperationen nur aus anderen Positionen anzuschauen.

1. Geht das
2. Wenn ja, wohin müsste ich die Aufrufe aus der paintGL() verschieben?

Vielen Dank für alle Tipps, werde leider allein nicht fündig.

Alex
P.S.: Der MouseWheel

Code: Alles auswählen

	if(event->delta()<0.0f)
		m_Scale*=1.1f;
	else
		m_Scale/=1.1f;
	updateGL();

Verfasst: 1. Juli 2009 16:58
von curator
Hat hier keine eine Idee, geht das was ich vorhabe nicht, oder habe ich meine Frage falsch gestellt.

Wäre nett, wenn mir jemand helfen könnte.

Verfasst: 1. Juli 2009 17:14
von Superheftig
Wenn du bei opengl die kamera verschiebst musst du auch die szene neu zeichnen. Da führt nichts dran vorbei!

Verfasst: 1. Juli 2009 19:14
von upsala
Bei OpenGL muß immer alles neu gezeichnet werden.
Man kann aber (einen Teil?) der Daten in Listen abspeichern lassen und diese dann immer wieder wiederholen lassen.

Verfasst: 2. Juli 2009 09:18
von curator
Ok, dann werde ich wohl damit leben müssen, dass es bei höherer Geradenanzanzahl ruckelt.

Vielen Dank für die Info!

Gruß

Verfasst: 2. Juli 2009 14:51
von macman
Aber noch nicht bei 1000. Da muss schon mehr kommen, oder Du hast einen recht betagten Rechner :-)

Verfasst: 2. Juli 2009 17:02
von curator
Ok, 1000 war eine untertriebene Schätzung.

Geht um ein Strahlverfolgungsverfahren, sind also deutlich deutlich mehr

Ruckeln tuts ab gaaanz leicht ab ca. 30.000 Strahlen.

Mal gespannt was das erst in 3D wird :-)

Verfasst: 6. Juli 2009 16:49
von Superheftig
Dann such mal nach display lists oder vertex buffer objects...dabei werden die daten im ram der grafikkarte gespeichert und du bekommst nen risesigen performance boost im gegensatz zu glBegin() / glEnd().
DisplayLists funktionieren nur in statischen szenen in denen sich die objekte nicht bewewgen
http://nehe.gamedev.net/data/lessons/le ... ?lesson=12
http://www.opengl.org/documentation/spe ... de123.html
Vertex Buffer Objects hingegen funktionieren auch mit sich bewegenden objekten
http://nehe.gamedev.net/data/lessons/le ... ?lesson=45