QGLWidget - Szene/Objekte per Maus smooth verschieben

Alles rund um die Programmierung mit Qt
Antworten
shapoc
Beiträge: 33
Registriert: 31. Mai 2009 12:18

QGLWidget - Szene/Objekte per Maus smooth verschieben

Beitrag von shapoc »

Folgendes Problem: Ich habe meine Objekte (Quads+Textur) in einer QGLWidget Klasse untergebracht und möchte nun meine Szene per Maus verschieben. Das funktioniert soweit auch, nur ist die Genauigkeit noch unzureichend.

Konkret: Meine Quads liegen alle z.b. auf der x-y-Ebene, ich schaue die z-Achse entlang. Beim Verschieben mit der Maus lese ich nun die Mauskoordinaten aus und berechne mir die Differenz zur vorherigen Maus-Event-Position. Das ist im kleinsten Fall ein Pixel :-)
Das muss ich nun irgendwie in mein OpenGL-Koordinatensystem mappen. Denn wenn ich einfach alle Objekte um eine Einheit verschiebe, ist das zu grob bzw. springen dann die Objekte. Ich möchte aber ein weiches Verschieben erreichen, so als ob man die Szene wirklich anfässt und verschiebt.
Mein Problem ist zudem, dass ich standardmäßig die Kamera so weit weg habe, dass ich alle Objekte sehe. Ich muss also abhängig von meiner "Zoom"-Stufe die Verschiebungsschritte anpassen. Meine Objekte sind alle der Einfachheit halber in ganzen OpenGL-Einheiten angeordnet, also das erste Quad bei 0 mit der Länge 1, das zweite bei 1 ... usw.

Hier mal meine aktuelle Methode für die Berechnung:

Code: Alles auswählen

void GLWidget::mouseMoveEvent(QMouseEvent *event)
{
	double dx = event->x() - lastPos.x();
	double dy = event->y() - lastPos.y();

	if (event->buttons() & Qt::LeftButton) 
	 {

		//xTrans = dx/(20.0*xScale);
		//yTrans = dy/(20.0*yScale);
		 //xTrans = dx/35.0;
		 //yTrans = dy/35.0;
		 xTrans = dx/10;
		 yTrans = dy/10; 

		isMoving = true;

		updatePositions();
        updateGL();

	 }
	 else
	 {
		isMoving = false;
	 }
		
	lastPos = event->pos();
}

Ich bekomme einfach keinen Faktor, der mir abhängig von der Entfernung meiner Objekte eine "gute" Verschiebung ermöglicht... :-(

Also nochmal konkret gefragt:
1. Wie berechne ich mir den Verschiebungsfaktor, damit ich die Szene per Drag'n'Drop "genau" verschieben kann, egal wie weit ich entfernt bin.

2. Gibt es eine Möglichkeit, irgendwie die Mausposition auf die OpenGL-Position zu mappen und darüber die Verschiebung zu realisieren?

Ich hoffe irgendjemand kann mir dabei weiterhelfen. Wäre für Hilfe sehr dankbar!!!
Antworten