Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

1

18.06.2015, 20:45

Bild Entzerrung / Verzerrung (Algortihmus)

Hi,
kennt ihr ein Verfahren / einen Algorithmus mit dem man bestimmte Teile aus einem Bild (einer Bitmap-Grafik) verzerren, entzerren kann?
Zum Beispiel so wie dieses Gitter:


Eine passende Library, oder ähnliches wäre auch super.

Ich hatte mir schon überlegt, die Grafik in kleinere Rechtecke wie in dem Raster aufzuteilen und dann versuchen diese in einem drei dimensionalen Raum so angeordnet zu rendern, dass es dem oben zu sehenden Effekt entspricht. Wäre das ein möglicher Ansatz? Dann stelle ich mir aber die Frage, wie ich mögliche Lücken zwischen den Bildern verhindern / auffüllen will. Und dann gäbe es noch die Frage, ob es einen Algorithmus gibt, um herauszufinden wie das Objekt im Raum platziert werden soll, damit es auf der zwei dimensionalen Projektion dem oben zu sehenden Effekt entspricht.

Edit: Mir fällt auf, dass durch das Betrachten aus einer anderen Position nicht alle Verzerrungen möglich sind, sondern nur solche, bei denen jeweils die Gegenüberliegenden Seiten parallel verlaufen, oder?

Edit2: Gerade kam mir noch eine Idee, wenn ich das Bild auf einem drei dimensionales Objekt das eine bestimmte Form hat als Textur rendere, dann müsste es doch so in der Art aussehen. Die Frage dabei wäre dann, wie das Objekt geformt sein müsste und ob ich irgendwie die Position der zweidimensionalen Punkte der Rechtecke (oder sind es Polygone?) auf die Punkte des räumlichen Objekts umrechnen könnte.

Danke schon mal.

Schönen Gruß,
MitgliedXYZ

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »MitgliedXYZ« (18.06.2015, 20:58)


David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

18.06.2015, 20:56

Du brauchst keine dreidimensionale Grafik. Teile das Bild in Rechtecke auf, deren Eckpunkte du dann wie gewünscht verschiebst. Dann die Rechtecke rendern und fertig. Je feiner die Unterteilung, desto "kurviger" kann die Verzerrung sein.

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

3

18.06.2015, 21:03

Ok, so in der Art habe ich es schon vermutet. Es würde allerdings stören, wenn dabei leere Zwischenräume, oder Überlappungen zwischen den einzelnen Bildteilen, entstehen würden. Aber das wird sich dann so nicht verhindern lassen...

Und solche Verzerrungen wie in der untersten Reihe (bei der nur ein Punkt des vier Ecks verschoben wurde) wären dann auch nicht möglich, oder?

4

18.06.2015, 21:05

Wenn du es wirklich so wie im Bild mit "Rechecken" machen möchtest würde ich folgendermaßen vorgehen:
1. Bild in die Rechecke wie im linken Bild aufteilen.
2. Alle "Rechtecke" im 2. Bild durchgehen und jeweils den Pixel zuweisen, der in Relation am Besten passt, d.h. der Pixel, der zuvor an 10%Höhe 10% Breite saß kommt auch im Anschluss wieder dorthin, bzw. da die alten Pixel nie genau erwischt werden wird zwischen allen passenden interpoliert.

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

5

18.06.2015, 21:20

@ChrisvA
Bei deiner Idee würde ich dann für jeden Bildabschnitt ein neues Bild erstellen, dass dann eine Größe besitzt bei der alle vier Punkte des verformten Kastens darin liegen, also z.B. für den ersten Kasten so:


Befüllen würde ich dann aber nur die Pixel, die innerhalb der vier Punkte liegen, und dann umrechnen, welche Pixel jetzt wo liegen würde.

Hört sich nach einem ziemlich guten Ansatz an, dass teste ich mal. Das Bild wird dabei zwar etwas verwischen, aber immerhin entstehen dabei vermutlich keine solchen Lücken, wie bei dem Vorschlag von David.

Edit:
Moment, hab ich dich falsch verstanden, David? Gibt es eine Möglichkeit Objekten, welche nur aus vier Punkten bestehen, eine Textur zuzuweisen, die dann automatisch passend verzehrt wird? Das wäre genau das, was ich versuche umzusetzen. Kann so etwas DirectX, oder was würde man da nehmen?

Edit Nummer zwei:
DirectX scheint dafür wirklich etwas mitzuliefern. Ich hab DirectX noch nie verwendet, aber das werde ich morgen mal testen:
https://msdn.microsoft.com/en-us/magazine/dn630652.aspx

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »MitgliedXYZ« (18.06.2015, 22:08)


6

19.06.2015, 06:37

Die beiden Lösungen werden zum selben Ergebnis führen, einmal wird eben DirectX genutzt und einmal wird der Algorithmus selbst implementiert.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

19.06.2015, 07:03

Ok, so in der Art habe ich es schon vermutet. Es würde allerdings stören, wenn dabei leere Zwischenräume, oder Überlappungen zwischen den einzelnen Bildteilen, entstehen würden. Aber das wird sich dann so nicht verhindern lassen...

Und solche Verzerrungen wie in der untersten Reihe (bei der nur ein Punkt des vier Ecks verschoben wurde) wären dann auch nicht möglich, oder?
Weder entstehen Lücken, noch überlappt etwas. Jedenfalls nicht wenn Du nur so weit wie in Deinem Beispiel verschiebst. Auch die untere Reihe funktioniert problemlos. Eigentlich musst Du nur Dein Beispielbild nehmen, es als Vertices und Quads (also Polygone) interpretieren, eine Textur drauf packen und hast Dein gewünschtes Ergebnis.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

8

19.06.2015, 07:35

Die Rasterasation Rules werden dafür sorgen, daß es dabei nie zu Lücken kommt.

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

9

19.06.2015, 12:03

Klingt schon mal gut.

Hab jetzt auch eine Bibliothek (AForge.Net) gefunden, die mir noch mehr Arbeit abnehmen würde, da sie genau die Funktionen anbietet, die ich benötige. Allerdings ist diese unter GPL veröffentlicht...

Edit:
Hab eine andere Implementierung gefunden, die unter einer besseren Lizenz steht: Quadrilateral-Distortion
Hab den Code mal getestet und er funktioniert so, wie ich mir das vorgestellt habe. Jetzt muss ich ihn noch im mein Projekt integrieren.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »MitgliedXYZ« (19.06.2015, 13:10)


10

19.06.2015, 16:33

[...]ist diese unter GPL veröffentlicht [...]
andere Implementierung [...] unter einer besseren Lizenz

Darüber lässt sich offensichtlich streiten, was nun besser ist! Sie ist allenfalls geeigneter für dein Vorhaben.

MfG
Check

Werbeanzeige