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

Aktuelle Zeit: Fr Jul 11, 2025 04:27

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Kamera auf Splines bewegen
BeitragVerfasst: Sa Nov 22, 2008 17:45 
Offline
DGL Member
Benutzeravatar

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

ich hab mich heut mit Splines beschäftigt. Das Spline soll gezeichnet werden und die Kamera soll dann darauf lang fahren und immer in Richtung des Splines gucken. Das Zeichnen und Bewegen der Kamera ist kein Problem, aber ich komm nich mit der Rotation der Kamera klar! Normalerweiße brauch ich doch bloß den Standpunkt der Kamera, und einen Punkt auf dem Spline, der etwas weiter vorn liegt. Dann rechne ich mir DeltaX, DeltaY, DeltaZ und den Abstand Zwischen Pkt1 ud Pkt2 aus. Und damit kann ich mir dann Tilt und Turn berechnen:
Code:
  1. var DeltaX, DeltaY, DeltaZ, d, Turn, Tilt: Real;
  2. var TempPoint1, TempPoint2: TGLVector3f;
  3.  
  4.   DeltaX := TempPoint[0]-TempPoint2[0];
  5.   DeltaY := TempPoint[1]-TempPoint2[1];
  6.   DeltaZ := TempPoint[2]-TempPoint2[2];
  7.  
  8.   d := SQRT(SQR(DeltaX)+SQR(DeltaY)+SQR(DeltaZ));
  9.  
  10.   Turn := ArcSin(DeltaZ/d)/Pi*180;
  11.   Tilt := ArcSin(DeltaY/d)/Pi*180;

Nun hab ich mir 2 Test-Splines erstellt, das eine ist ein Kreis auf der Y-Z-Ebene (um Tilt zu testen) und das andere ist ein Kreis auf der X-Z-Ebene, um Turn zu testen. Nach einigen Fehlerkorrekturen der Winkel hab ich bei beiden fast das richtige Ergebnis. Nun ist es aber so, das es, wenn es mit dem 1. Test-Spline geht, nich mehr mit dem 2. geht und anderes rum. Ist mein Ansatz falsch, oder hab ich einfach bloß irgendwo einen Fehler drin?

Mfg Bergmann.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 24, 2008 10:26 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Ich habe das gleiche mal in ein Projekt Implementiert und verweise erstmal nur drauf, statt was zu sagen.
Wenn das nicht weiter Hilft schreib dann halt nochmal.
https://svn.linuxprofessionals.org/filedetails.php?repname=xdream&path=%2Fbranches%2F0.2v%2Fcore%2FXD_Path.pas

_________________
"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: Mo Nov 24, 2008 16:30 
Offline
DGL Member
Benutzeravatar

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

ich hab zwar einen Befehl in deiner Camera-Unit gefunden, der mir das ganze gerechne erspart (gluLookAt), aber mein Problem is immer noch da. Ich hab ma das Projekt mit hochgeladen. Das Spline beschreibt eine Kreisbahn auf der Y-Z-Ebene, und sobald die Z-Koordinate das Vorzeichen wechselt dreht dich die Kamera. Und das muss ich irgendwie vermeiden! Wenn ich das so mach
Code:
  1. if DeltaZ < 0 then Roll := Roll + 180;

dann geht alles. Aber nun dreht sich die Kamera auch wenn ich mich nur auf der X-Z-Ebene bewege, und das soll nich sein!
Deinem Projekt konnt ich jetzt nix weiter entnemhen, was mir helfen könnte?!

€: UPS, da bin ich wohl ausversehen auf Enter gekommen, kann ma bitte jmd den Beitrag vorher löschen?

MfG Bergmann.


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 25, 2008 01:14 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
du erhälst die Richtung der Camera nicht in dem du einfach den Standpunkt der Camera und den nächsten Standpunkt auf dem Spline vergleichst, sondern in dem du die Ableitung ( Differentialrechnung) in dem Standpunkt deiner Camera machst. Dadurch erhälst du die Steigung der Kurve am aktuellen Punkt, die in diesem Fall die Blickrichtung des Punktes auf dem Spline darstellt, den du ja für die Camera verwenden willst. Umgesetzt hab ich das noch nie, aber das wäre mein Ansatz dafür.
Das was du machst ist vom aktuellen Punkt zum nächsten zu schauen, was nur bei extrem vielen und sehr na beieinander liegenden Punkten auf dem Spline gleich der Blickrichtung des aktuellen Punktes ist. Sobald die Punkte etwas weiter auseinanderliegen und der Spline kräftige Maxima/Minima aufweißt, können starke Richtungsabweichungen auftreten, die evtl. deinem Fehler entsprechen.
Wenn du den Spline nach Bezir berechnest, hast du sogar schon die Grundlage um die Richtung für jeden Punkt zuberechnen, denn dabei wird über mehrere Punkte interpoliert, was man sch mit von einem Punkt zum nächsten wandernden Geraden (beispiel gibts dazu bei wikipedia) vorstellen kann. Genau diese Geraden entsprechen den Vektoren die du suchst.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 25, 2008 13:33 
Offline
DGL Member
Benutzeravatar

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

mit Bezir Kurven geht das nich, da hab ich ncih das gewünchte ergenbis, weil die Linie ja nich durc h den Pkt geht sondern sich ihm nur nähert. Das mit der 1. Ableitung is ne Idee, da weiß ich aber nich wie ich da ran gehen soll. Und da die Punkte bei mir eh sehr nah bei ein ander liegen (siehe Projekt im letztn Post) würde das bei mir auch so gehen. Nochmal zu der Ableitung. Da hab ich zwar dann den Anstieg, aber den muss ich ja auch erst in Winkel umrechnen. Bsp: mein Anstieg ist m = 2 also würde ich den Winkel über tan(a) = 2/1, bzw. a = ArcTan(2/1) berechnen. Und dann hab ich wieder das gleiche Problem wie jetzt.

MfG Bergmann.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 25, 2008 15:43 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
aus welchem grund benötigst du den winkel? Wenn du die Glulookat benutzt gibst du doch einen Vektor an zu dem du guckst. Du errechnest die Steigung und addierst die Position drauf und hast den Punkt zu dem du gucken willst. Ein Spline ist ja im Prinzip nichts anderes als eine Kette aus n-gradigen Polynomen, die in ihren Schnittpunkten die selben Steigungswerte aufweisen und auf diese beschränkt werden. Es sollte also möglich sein, die Tangenten zu errechnen, da Ableitungen aus Polynomen ohne weiteres möglich sind. nebenbei musst du daran denken, dass Winkel in Delphi in Radiant angegeben werden und nicht in Grad. Um damit umher zuhantieren gibts die funktionen degtorad und radtodeg. Ich glaube die sind in der unit math enthalten. Was du genau mit den Winkeln anstellen möchtest weiß ich nicht.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 25, 2008 16:11 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Ich will die Winkel selbst berechnen, da gluLookAt mein Problem nicht löst (siehe Testprojekt)! Und dann will ich die Kamera über glRotatef selbst drehen. Und das umrechnen zwichen RAD und DEG hab ich beachtet, auch wenn ich die Fkt nich benutz hab, hab das selbst gemacht (RAD/Pi*180=DEG).


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 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.

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