![]() |
Kamerafahrt über ein Bild realisieren
Hallo zusammen!
Ich weiß nicht ob ich den richtigen Titel gewählt habe. Ich möchte ein Programm schreiben, das in einem Fenster Bilder anzeigt die viel größer als das Fenster selbst sind. Das ganze soll animiert werden, so dass der tatsächlich angezeigte Bereich sich ändert, quasi als würde man durch eine Kamera auf das Bild schauen und die Kamera würde sich bewegen. Es sollte auch möglich sein, den aktuellen Zoom anzupassen, so dass ein größerer Bereich des Bildes im Fenster dargestellt wird. Mein Problem ist nun, dass ich mich mit dem Thema Animationen quasi gar nicht auskenne. Ich habe sehr gute Kenntnisse von Delphi allgemein und kenne mich einigermassen mit GDI+ aus. Meine GDI+-Erfahrung beschränkt sich aber auf statische Bilder. Ich habe es schon ganz billig mit Timer und selbstzeichnen auf ein Control ausprobiert, das ist aber leider zu langsam. Meine Frage ist nun ob mir jemand sagen kann wie ich das am Besten realisiere oder ob es alternative Suchbegriffe nach denen ich suchen könnte. Ich finde nämlich keine brauchbare Übersetzung von Kamerafahrt und bekomme Myriaden an Tutorials wie man eine Kamera im 3D-Raum bewegt. Vermutlich ist das der Wink mit dem Zaun und ich komme an DirectX nicht vorbei? Die Bilder können übrigens bis zu 70 MP groß sein... |
AW: Kamerafahrt über ein Bild realisieren
Was du realisieren möchtest, benötigt keine speziellen Animationskenntnisse, sondern eine Scrollbox, in die du dein TImage legst, selbiges auf AutoSize stellst, Left und Top des TImage auf 0 stellst und ein Bild hineinlädst. Durch das Property AusoSize paßt sich das TImage der Bildgröße automatisch an. Ist das TImage nun größer als der Clientbereich der Scrollbox, erscheinen in selbiger Scrollbalken, mit denen du Ausschnitte des Bildes anzeigen kannst – wie in jedem Mal- und Grafikprogramm üblich.
|
AW: Kamerafahrt über ein Bild realisieren
Zitat:
Warum jedesmal all 70 MP verarbeiten, wenn man doch nur maximal 2 MP davon braucht? Je menr Daten man verarbeiten muß, um so langsamer wird es. :zwinker: Auch hängt es von den Zoommechianissmen an, denn es gibt Langsamere und Schnellere, aber dank vorberechnerer Zwischenbilder kann man auch da schneller arbeiten. Sieh dir mal Google-Maps und Dergleichen an. Dort gibt es das Bild in kleineren Stücken und vorallem schon fertig in verschiedenen Größen/Zoomstufen. So brauch man nicht mehr all zu stark zoomen, da man bei großen Zoomstufen bereits auf ein kleineres Bild zugreifen kann. und man braucht auch nur die Bildausschnitte zu behandeln, welche überhaupt sichtbar sind. |
AW: Kamerafahrt über ein Bild realisieren
Zitat:
![]() Die Technik kennst du von Google Maps. |
AW: Kamerafahrt über ein Bild realisieren
Die eigentliche Frage ist doch:
Woher kommen die Bewegungs- und Zoomdaten? Willst Du das "OnTheFly" berechnen oder einen Film davon erzeugen? Mavarik |
AW: Kamerafahrt über ein Bild realisieren
Die 70 MP machen einen ja fertig? Wenn du nur Delphi Werkzeuge verwenden willst: z.B. das Bild in eine Metafile erträglicher Größe umwandeln und dann ganz klassisch zoomen. Scrollbox, Paintbox rein, Paintboxabmessungen aus dem Zoom setzen und ein Strechdraw der Metafile in Paintboxpaint. Die Scrollbox ggf. doublebuffered setzen. Um einen Punkt zommen ist etwas tricky, geht aber. Ich hab hier zum Teil DIN A0 Pläne (ca. 15 MP), da geht's so sehr gut.
|
AW: Kamerafahrt über ein Bild realisieren
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Im Grunde soll das sowas ähnliches werden wie die Lockscreen-Slideshow von Windows 8, falls die jemand kennt. Was ich bisher versucht habe: - Timergesteuert auf die Zeichenfläche des Formulars zeichnen. Das flackert und ist träge. - Zeichnen in OnPaint des Formulars und timergesteuert das Formular invalidieren. Das flackert nicht, ist aber sehr träge. - Zeichnen in OnPaint des Formulars und in OnPaint das Formular invaldiieren. Das flackert nicht, ist aber sehr träge und ist vermutlich generell keine so gute Idee ;P Mein eigentliches Problem ist also primär, dass ich nicht weiß wie ich es hinbekomme, ein Control so upzudaten, dass die "Animation" flüssig aussieht. |
AW: Kamerafahrt über ein Bild realisieren
OpenGL
|
AW: Kamerafahrt über ein Bild realisieren
Was auch noch zu berücksichtigen ist: TTimer hat keine besonders feine Auflösung. Je nach dem, was für dich flüssig bedeutet, kann auch das schon der Knackpunkt sein. 60 FPS und mehr sind mit TTimer eher problematisch. Google mal nach "Game Loop" für Alternativen.
|
AW: Kamerafahrt über ein Bild realisieren
Liste der Anhänge anzeigen (Anzahl: 1)
@flipdascript
Ich hab zwar nicht ganz verstanden was du brauchst, aber da ich in der letzten Zeit wenig geprogt habe und vor Ende des Jahren nochmal Delphi anwerfen wollte, habe ich etwas geschrieben. Vielleicht ist es das was du brauchst (vielleicht auch was anderes). Das Programm ist selbsterklärend, zuerst aber ein Bild laden. |
AW: Kamerafahrt über ein Bild realisieren
Hallo Popov!
Das kommt dem was ich mir vorgestellt habe sehr nahe. Danke! Muß heut abend mal schauen was Du da groß anders machst. Habe das grad nur kurz kompiliert und ausprobiert. |
AW: Kamerafahrt über ein Bild realisieren
Du meinst
![]() Wenn es nicht alles in Delphi sein muss kann man auch ![]() ![]() |
AW: Kamerafahrt über ein Bild realisieren
@flipdascript
Das "Problem" ist, dass der Timer das Problem ist. Dass eine Prozeduren in 1/1000 Sekunde aufgerufen werden können, ist eher ein urbaner Mythos. Erfahrungsgemäß (ob gefühlt oder tatsächlich) sind es eher 10/1000, womit das Bild pro Sekunde nur um die 100 Pixel verschoben werden kann. --Schnipp-- Um mein Gefühl zu überprüfen habe ich gerade einen Counter geprogt. Wenn ich da keinen Gedankenfehler habe, dann zählt der Timer wie oft er in der Sekunde aufgerufen wird (benötigt wird ein Timer und ListBox):
Delphi-Quellcode:
Bei mir sind es 64 mal (ist ja auch ein alter Rechner).
uses
DateUtils; var S1, S2, T: Word; procedure TForm1.Timer1Timer(Sender: TObject); begin S1 := SecondOfTheHour(Now); if S1 <> S2 then begin ListBox1.Items.Add(IntToStr(T)); T := 0; end; Inc(T); S2 := S1; end; procedure TForm1.FormCreate(Sender: TObject); begin Timer1.Interval := 1; end; Die "Lösung": pro Takt nicht ein Pixel verschieben, sondern mehrere Pixel. |
AW: Kamerafahrt über ein Bild realisieren
(Application.)OnIdle wird völlig überschätzt :thumb:
Deshalb sollte es hier auch nicht erwähnt werden! MfG |
AW: Kamerafahrt über ein Bild realisieren
Zitat:
Soweit ich das sehe wird SDTV mit 25 und HDTV mit 50 Bilder je Sekunde ausgestrahlt. Ein guter analoger Videorecorder hat ebenfalls 50 Bilder je Sekunde. Normal sollten 50 bis 60 Bilder je Sekunde vollkommen ausreichen. |
AW: Kamerafahrt über ein Bild realisieren
Mein Fernseher läuft mit 400Hz, das mag mein Kanarienvogel. Der guckt schneller als ich ;)
Zum Thema... Ich denke 1000 Bilder pro Sekunde sind nicht das Begehren des TE, sondern eher 1000 Schritte in der Sekunde, so dass ein Bild zur Not 1000 Pixel pro Sekunde gescrollt werden kann. Das kann man aber auch anders erreichen - einfach paar Pixel überspringen. |
AW: Kamerafahrt über ein Bild realisieren
Schön, dass Dein Fernseher 400 Hz hat. Meiner hat nur 100 Hz und zeigt damit nicht weniger Bilder in der Sekunde an als Deiner. 8-)
Wozu 1000 Schritte tun, wenn nur jeder 20. wahrgenommen wird? Dann reichen 50. Also nicht 1000 * 1 sondern dann 50 * 20. |
AW: Kamerafahrt über ein Bild realisieren
Wer glaubt bei 400Hz auch 400 Bilder/s zu bekommen, der liest sich einmal dieses hier durch
![]() Es geht dabei nicht ums schlecht reden oder machen, sondern nur um die Klarstellung, was es mit diesen 100/200/400Hz auf sich hat. |
AW: Kamerafahrt über ein Bild realisieren
|
AW: Kamerafahrt über ein Bild realisieren
Zitat:
Zitat:
Zitat:
Zitat:
Hier ein Video in dem man sich das anschauen kann: ![]() Zitat:
|
AW: Kamerafahrt über ein Bild realisieren
@flipdascript
Also die Flüssigkeit in anderen Programmen kommt ja nicht davon, weil da mehr Zwischenschritte sind. Ich weiß das, weil ich im Grunde einen alten PC habe und wenn ich ein aktuelles Game drauf ausführe, z. B. bei einem 3D Shooter, dann sehe ich die Bewegungen auch (sozusagen) in Zeitraffer. Da springt das Bild auch alle paar Meter weiter. Du solltest die Bewegung nicht unbedingt Schritt für Schritt zeigen, sondern Zeitabhängig. Damit meine ich, dass immer nur das Bild gezeigt wird, das zu dieser bestimmten Zeit auch gezeigt werden sollte, und nicht jedes Frame nach und nach. Das Auge kompensiert das und alles wird flüssig. Mal etwas verständlicher: nehmen wir an du hast eine Animation mit 24 Bildern pro Sekunde. Nach einer 1/2 Sekunde hackt es für eine 1/4 Sekunde, weil ein anderes Programm kurz etwas mehr Leistung brauchte. Nun gibt es das Problem, dass nach der 1/2 Sekunde einen Aussetzer für 1/4 Sekunde gibt. Wie soll der behandelt werden? Sollen die fehlenden 6 Frames gezeigt werden? Das ist die Menge Frames die in einer 1/4 Sekunde gezeigt werden. Werden die 6 Frames nachgeschoben, merkt man den 1/4 Sekunde Aussetzer. Werden sie verworfen, eher nicht. Ich hab mal an einer Animation gearbeitet und ein ähnliches Problem wie du gehabt. Das Hacken sieht man nur wenn man unbedingt jeden Schritt zeigt. Stattdessen sollte man an der Zeit orientieren. |
AW: Kamerafahrt über ein Bild realisieren
@Popov :thumb:
Es ist viel wichtiger, dass sich ein Objekt nach dem Neuzeichnen an der erwarteten Stelle befindet, als alle Zwischenschritte auch wirklich anzuzeigen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz