Kamera
-
Theoretisch könnte ich es aber in der praxis bekomme ich es nicht hin.
Das raumschiff eiert so komisch.
-
Das eiert, wenn du was machst? Wenn du gar nichts machst, oder wenn du lenkst?
-
Also in Open Gl gibt es diese Funktion
OpenGL bietet keinen direkten Zugriff auf die Kameraposition. Mit der GLU Funktion gluLookAt() ist es aber möglich die Kamera bzw. die Szene relativ dazu zu positionieren.
gluLookAt(kameraX, kameraY, kameraZ, /* hier stehe ich /
szeneX, szeneY, szeneZ, / hier schaue ich hin /
obenX, obenY, obenZ); / dieser Vektor zeigt senkrecht nach oben */
Diese Funktion berechnet aus den Parametern die notwendigen Transformationen der Szene. Der Aufruf sollte am Anfang der Zeichenroutine, vor eigenen Transformationen, erfolgen.So wie ich verstanden habe, muss ich 3 vectoren speichern.
Also am Anfang
vorne 1.0.0
rechts 0.1.0
unten 0.0.1Ist das so richtig?
-
Genauso machst du das. Diese 3 Vektoren speicherst du so am Anfang, und jedesmal, wenn du dich drehst (zum Beispiel nach rechts, dann drehst du dich um den HochVektor (nimm oben statt unten, oder sind bei OGL positive Z-Werte unten???)) drehst du die beiden anderen Achsen um die Achse, um die du dich drehen willst, und das Raumschiff auch. Du drehst dich dann also nicht mehr um die statischen StandardAchsen, sondern um deine relativen Achsen, die du immer mitdrehen musst. Dann sinds auch realistische Drehungen...
-
Also sind die 3 ersten Koordinaten mit dem Kommentar /* hier stehe ich */
die forne koordinaten ?Kannst du mir sagen wie die Drehmatrix aussieht?!
-
Die ersten Koordinaten sind die, wo sich dein Raumschiff befindet... Vergiss die "Drehmatrix". Bevor sich dein Raumschiff das erste Mal drehen kann, stellst du die Vektoren VVorn, VRechts, VOben so ein, dass sie jeweils in die Richtung zeigen. Wenn du jetzt nach rechts drehen willst, musst du dass um den Vektor VOben tun, verstehst du das? Dabei musst du das Raumschiff drehen, und diese drei Vektoren (VOben ändert sich in diesem Falle nicht). Wenn du danach nach oben drehen willst, musst du das um den Vektor VRechts drehen, der jetzt genau in die richtige Richtung zeigt, um richtig nach oben zu drehen, verstehst du das? Du musst immer bei deinen 3 Vektoren gucken, um welchen du drehen musst, und wenn du den richtigen gefunden hast, drehst du dein Raumschiff um diese Achse, danach drehst du die beiden anderen Vektoren um dieselbe Achse, alles klar? Somit zeigen die Vektoren immer(egal, wie du drehst) nach vorn, rechts und oben...
mfG D1B
-
Ja verstehe ich!
Ich suche nur die Formel oder Funktion mit der ich die Dreheung um die entsprechende Achse berechnen kann!
-
Vielleicht hilft dir das Tutorial von Stefan Zerbst
-
gluLookAt(kameraX, kameraY, kameraZ, /* hier stehe ich /
szeneX, szeneY, szeneZ, / hier schaue ich hin /
obenX, obenY, obenZ); / dieser Vektor zeigt senkrecht nach oben */Zum Verständnis: Hiermit stellst Du Deine virtuelle "Kamera" ein. Also im Endeffekt das, was Dir die GraKa nachher über den Moni raushaut.
Die Kamera selbst befindet sich im 3D-Raum an XYZ-Koordinate kameraX,kameraY,kameraZ.
Sie "guckt" zum Punkt szeneX,szeneY,szeneZ hin. Dies dient also nur, um eine Richtung anzugeben, wohin die Kamera gedreht ist. Die Entfernung von diesem Punkt z.B. spielt keine Rolle.
Zudem wird der Vektor obenX,obenY,obenZ angegeben, der quasi das "Kamerastativ" darstellt. In den HighLevel-APIs ist das Kamera-Objekt also wirklich fast identisch mit einer "realen" Kamera. Dieser Vektor steht also im Normalfall immer nach oben (entlang der Y-Achse). Wenn Du jetzt einen "szeneXYZ"-Punkt angibst, wird sich die Kamera wie in der realen Welt um 2 Achsen drehen (hoch/runter - links/rechts) und auf den Punkt schauen. Wenn Du Dich aber um die 3. Achse drehen willst (also "schräg gucken"), mußt Du diesen obenXYZ-Vektor entsprechen ändern (quasi das Kamerastativ kippen).Übrigens gibt es diese Funktion in Direct3D genauso.
(nimm oben statt unten, oder sind bei OGL positive Z-Werte unten???)
OpenGL hat ein rechtsseitiges Koordinatensystem, Direct3D benutzt ein linksseitiges. D.h. im Klartext: In OpenGL schaut die Kamera entlang der negativen Z-Achse "in den Raum hinein", bei Direct3D entlang der positiven Z-Achse. Also ist nur die Z-Achse gespiegelt, die anderen Achsen verhalten sich völlig gleich. Und das "nimm oben statt unten" bezieht sich ja auf die Y-Achse! Von daher müßte es sowohl in OpenGL als auch Direct3D "oben" heißen. Ach quatsch! Es heißt ja nicht "oben" weil da die Y-Achse nach "oben" geht - es heißt ja so, weil damit beschrieben wird, wo "oben" an der Kamera ist. Wenn Du diesen Vektor spiegelst, müßte die Kamera auf dem Kopf stehen. Wenn in Deinem 3D-Raum natürlich nur ein Würfel rotiert, wirst Du kaum'n Unterschied feststellen...
Okay, cu, Sarge
-
Jetzt bin ich richtig verwirrt!!!
Also geht das mit dem drehen um die jeweilige Achse nicht?
Hat denn noch keiner sowas gemacht? kann mal jemand den code dazu posten?