Registriert: Do Jun 09, 2005 13:48 Beiträge: 117 Wohnort: Sankt Augustin
Nachdem ich viel Zeit damit verbracht habe eine funktionierende Kamera
zu bauen und es nun endlich geschafft habe, wollte ich diese Funktionalität
auch anderen zur Verfügung stellen.
Da mir schon viel geholfen wurde, kann ich so einen Teil meiner "Schuld"
zurück zahlen.
Die folgend beschriebene Kamera kann sich um alle drei Achsen drehen und sich
in allen ebenen bewegen. Der Drehpunkt um den sich die Kamera dreht wird mit
dem Aufruf der Prozedur PositionCamera festgelegt. Sollte man diesen Dreh-
punkt benötigen (z.B. zum anzeigen eines Koordinatenkreuzes, ...) so kann man
auf die property PointOfRotation zugreifen (read only).
Die Kamera kann bis zu zehn Positionen speichern und auch wieder herstellen.
(SavePosition, RestorePosition)
Die Kamera kann sich selber zu jeder Zeit unter Beibehaltung der aktuellen
Position senkrecht zur Welt ausrichten.
(Adjust)
Um sicher zu sein, dass auch alle nötigen Definitionen und Funktionen zur
Verfügung stehen habe ich einfach mal einen Großteil meiner Funktionssammlung
beigefügt (OpenGLUtil.pas). Diese Funktionen/Prozeduren werden so oder in leicht
abgeänderter Form wohl bei jedem OpenGL Programmierer existieren.
Sollte es noch irgendwelche Fragen zu diesem Modul geben so stehe ich gerne
zur Verfügung.
Camera.pas
Gebrauch der Funktionen:
1. PositionCamera mit Vektoren für Position, Blickrichtung und Ausrichtung
aufrufen. Die Blickrichtung gibt auch gleichzeitig den Drehpunkt der Szene
an um den dann mit RotateCamera gedreht werden kann.
2. Aufruf der Funktionen RotateCamera und TranslateCamera um die Ausrichtung/Lage der
Kamera zu verändern. z.B.:
Code:
// FRightMousePressed, FLeftMousePressed,
// FxDelta, FyDelta, FxStart, FyStart,
// FxRot und Fyrot sind als var im aktuellen Modul definiert.
//Dragging is happening only if the mouse button is down
ifnot(FRightMousePressed or FLeftMousePressed)thenexit;
//Calculate how much the mouse has moved
FxDelta := FxStart-X;
FyDelta := FyStart-Y;
//Adjust rotation and scale so it is'nt too fast
FxRot := FxRot - FyDelta/20;
Fyrot := FyRot - FxDelta/20;
//Next time, we start from here
FxStart := X;
FyStart := Y;
if FRightMousePressed then
begin
if FxRot <> 0then FCamera.RotateCamera(FxRot,0,0);
if FyRot <> 0then FCamera.RotateObject(0, FyRot,0);
end;
if FLeftMousePressed then
begin
if FxRot <> 0then FCamera.TranslateCamera(FxRot,0,0);
if FyRot <> 0then FCamera.TranslateCamera(0, FyRot,0);
end;
Paint;
FxRot :=0;
FyRot :=0;
end;
Dieses Beispiel is vereinfacht dargestellt und es kann sein, dass man
daran noch etwas herumspielen muss. Ich habe noch das Mausrad eingesetzt
um in den Bildschirm hinein- oder aus ihm herauszuzoomen (TranslateCamera(0,0,?)).
3. Szene zeichnen:
Lichteigenschaften setzen
Materialeigenschaften setzen
halt die üblichen Vorbereitungen treffen
Ein großes Danke von mir. Ich hoffe das mir ein Vergleich mit meinem Projekt zeigt was ich noch falsch mache, bevor mein Haupthaar noch komplett zur Neige geht.
Grüße, DNA
_________________ Heute code ich, morgen debug ich, und übermorgen caste ich die Königin auf int.
http://www.2ndmoon.de
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Da sag ich glatt mal DANKE. Das man in so konkreter form etwas an die Community zurückgibt ist leider viel zu selten. Und da du da noch nen schönen Wikiartikel draus gemacht hast ist das noch toller. SUPER...
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Mitglieder in diesem Forum: 0 Mitglieder und 13 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.