Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 04:34

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: objektverfolgende Kamera
BeitragVerfasst: Mo Aug 18, 2008 09:50 
Offline
DGL Member
Benutzeravatar

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:
  1. Camera.X := Camera.X - (Camera.X-Object.X);
  2. 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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 18, 2008 14:09 
Offline
DGL Member
Benutzeravatar

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

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 19, 2008 00:55 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
HI,

hast Recht: mein Code ergibt kein Sinn, weil ich was vergessen hab:
Code:
  1. Camera.X := Camera.X - (Camera.X-Object.X)/10;
  2. Camera.Z := Camera.Z - (Camera.Z-Object.Z)/10;


Das mit den Winkeln werd ich mal ausprobieren.

Und die Rotation hab ich bei mir so gelöst:
Code:
  1. if fRoll <> fRollTo then
  2.   begin
  3.     fRoll := fRoll - (fRoll-fRollTo)*fTurnSpeed/1000*Delta;
  4.     if RoundTo(fRollTo,-2) = RoundTo(fRoll,-2) then fRoll := fRollTo;
  5.   end;

Auch erst schnell, dann immer langsamer, bis der Schwellenwert erreicht ist und die Kamera stehen bleibt.
So kann ich den Sin umgehen^^

MfG Bergmann.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

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.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 14 Queries | GZIP : On ]