Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
HI,
ich möchte ne Kamera programmieren, die einem bestimmten Objekt folgt und dabei auf einem bestimmten Abstand bleibt. Ich hab aber keine Ahung, wie ich anfangen soll. Das ganze soll sich erstmal in der XZ-Ebene abspielen. Ich hab's schon so probiert, aber da wird die Kamera genau auf das Objekt gesetzt und nich dahinter:
Code:
Camera.X:= Camera.X-(Camera.X-Object.X);
Camera.Z:= Camera.Z-(Camera.Z-Object.Z);
Das Objekt soll die Kamera aber sozusagen hinter sich her siehen. Den Effekt hab ich mit dem Code oben erreicht, den könnte man ja jetzt noch irgendwie so erweitern, das die Kamera auf Distanz bleibt, aber wie gesagt: Ich weiß nich wo ich anfangen soll.
Es geht nur um die Position der Kamera, die Drehung hab ich schon erledigt, In ner extra Prozedur "PointTo(X,Y,Z)". Die hab ich b is jetzt immer vor dem Berechnen der Position aufgerufen.
MfG & Thx Bergmann.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Registriert: Di Mai 18, 2004 16:45 Beiträge: 2623 Wohnort: Berlin
Programmiersprache: Go, C/C++
Camera.X := Camera.X - (Camera.X-Object.X);
Camera.Z := Camera.Z - (Camera.Z-Object.Z);
Das wird auch zu
Camera.X := Object.X;
Camera.Z := Object.Z;
und dann sollte auch klar werden, wieso diese Variante nicht so dem Ziel entspricht.
In den meisten Spielen, die ich kenne, wird das über Winkel geregelt.
Camera.X:=Object.X+cos(PI/180*Camera.AngleY)*Camera.Distance;
Camera.Z:=Object.Y+sin(PI/180*Camera.AngleY)*Camera.Distance;
Distance und AngleY kannst du dann super einfach per cubic,linear oder sinus interpolieren und somit weiches hinterherschwenken realisieren.
Kleines ungetestetes Beispiel:
if (Camera.AngleY<>0) then
begin
Camera.AngleY:=Camera.AngleY-sin(PI/180*(abs(Camera.DefaultY-Camera.AngleY) mod 90))*Camera.RotationSpeedY;
if (Camera.AngleY<Camera.SnapInDeltaForAngleY)
Camera.AngleY:=0;
if (Camera.AngleY>-Camera.SnapInDeltaForAngleY)
Camera.AngleY:=0;
end;
Das sollte die Camera erst sehr schnell und dann immer langsammer an 0 anschmiegen.
SnapInDeltaForAngleY ist ein Wert, bei dem der Winkel auf 0 gesetzt werden soll, damit die Camera aufhört die rechenaufwändigen sinus durch den Prozessor zu jagen, wenn wir eh keinen Unterschied mehr wahrnehmen. Ausserdem kann man somit Fehlern vorbeugen, wenn z.B. er aufeinmal mit dem Vorzeichen kippt und in die andere richtung setzt.
Ich denke das Prinzip lässt sich aus den Codefetzen schon sehr gut ableiten.
_________________ "Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren" Benjamin Franklin
Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast
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.