ubuntuusers.de

openGL Kamera

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

Yoschi

Anmeldungsdatum:
11. April 2009

Beiträge: 454

Hallo !

Ich versuche mich seit letzter Woche in der 3D Programmierung mit openGL.

Leider habe ich das Problem, dass ich es nicht hinbekomme, eine vernünftige Kamera zu simulieren. Hab schon mehrere Möglichkeiten durch:

  • Erst Kamera Rotieren, dann verschieben: Rotation funktioniert gut, beim verschieben ist allerdings das Problem, dass er nicht parallel zum Weltkoordinatensystem verschiebt.

  • Erst verschieben, dann rotieren: Jetzt funktioniert das verschieben, aber er rotiert nicht mehr um die eigendliche Kamera bei (0,0,0).

  • Erst Kamera Rotieren, dann nach Objekt verschieben, Kamera zurückdrehen, nach Kamera verschieben, Kamera und Objekt drehen: jetzt funktioniert es einigermaßen, leider ist aber noch ein Fehler beim Drehen drin, sodass es die Objekte verzieht (die Kanten z.B. bei einem Würfel stimmen nicht mehr zusammen, zwschen den Seiten sind Lücken), wenn sie aus mehreren Primitiven bestehen ( ich resette für jede Primitive die Matrix, weil ich mir einen OO - Wrapper gebaut habe... )

Bei "verschieben" oder "drehen / rotieren" sind immer glTranslate bzw. glRotate Befehle gemeint.

Die Ideallösung wäre halt eine Kombination der ersten beiden (hab ich ja bei der 3. probiert)...

Die Funktion gluLookAt funktioniert auch nicht wirklich, wahrscheinlich gebe ich der aber die falschen Parameter mit ( gluLookAt(camera.x, camera.y, camera.z, camera.xrotation, camera.yrotation, camera.zrotation, 0, 1, 0); )

Hab mir auch schon das Kamera Tutorial bei delphigl durchgelesen, werde daraus aber nicht schlau...

Dazu muss ich sagen, dass wir in der Schule Matrizen und Vektoren noch nicht durchgenommen haben (wenn überhaupt noch (9. Kl. Gym)). Mein gesamtes Wissen darüber beschränkt sich quasi auf das, was so in div. openGL Tutorials beschrieben wird und was mir mein Mathelehrer gezeigt hat (auch nicht viel: was sind Vektoren o. Matrizen, rotationsvektoren...).

Kennt hier jemand eine Methode, sodass es wirklich wie eine frei im Raum schwebende Kamera aussieht, oder einen Link, wo das beschrieben wird (am besten so, dass ich es auch verstehe) ?

Mfg, Yoschi

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

Hi,

ich hab mich dazu mal vor einem Jahr im Blog ausgelassen. Das fängt recht weit vorne an mit der „Definition“ eines Koordinatensystems, in welcher Reihenfolge die Transformationen stattfinden, wie man sie verkettet und so weiter. Die grundlegenden Operationen, also wie man zwei Matrizen multipliziert oder so, sind aber nicht mit drin. Neben dem PDF findest du da auch eine kleine OpenGL-Demo mit Quellcode, bei der du dir das mal „live und in Farbe“ 😉 anschauen kannst.

In PDF und Demo sind zwei Methoden beschrieben, einmal mit Matrizen und einmal mit Quaternionen. Ich würde dir empfehlen, dich auf die Sache mit den Matrizen zu beschränken, weil das imo leichter verständlich sein müsste. Wie weit du mit dem Wissen der 9. Klasse kommst, kann ich dir nicht sagen – wir hatten das damals erst in der Oberstufe gemacht und Matrizen gab es sogar erst in der Uni. 😉 Bei konkreten Fragen kann ich dir gerne helfen, aber ich glaube fast, dass du mit Mathebuch oder besser -lehrer, der dir das Fehlende mal persönlich erklärt, eigentlich besser bedient bist.

Yoschi

(Themenstarter)

Anmeldungsdatum:
11. April 2009

Beiträge: 454

Hallo Vain !

Danke für deinen Link, das PDF ist sehr interessant. Habe jetzt eine Lösung mit Trigonometrie gefunden:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
//move - Methode
void move(double forback, double leftright, double updown) {
	//For - Back
	if (forback != 0) {
		const int factor = ((position.yrotation > 90 && position.yrotation < 210) ? -1 : 1);
		const int direction = (forback < 0) ? -1 : 1;
		
		position.x -= cos((position.yrotation+90*direction) / 180f * PI) * abs(forback);
		position.z -= sin((position.yrotation+90*direction)/180f * PI) * abs(forback);

		position.y += cos((position.xrotation+90*direction*factor)/180f * PI) * factor * abs(forback);
	} else if (leftright != 0) {
	//Left - Right
		position.x += cos((position.yrotation*PI) / 180f) * leftright;
		position.z += sin((position.yrotation*PI) / 180f) * leftright;
	} else if (updown != 0) {
		//Up - down
		position.y += updown;
	}
}

Beipsiel:

camera.rotate(30,0,0); //Drehe Kamera um 30 Grad
camera.move(1,0,0); //Bewege Kamera 1 Schritt in Blickrichtung (nach vorne)

Mfg, Yoschi

Antworten |