Doch, wie funktioniert das denn? Wie kann bei "unscharfem" hinschauen was anderes sichtbar werden, als bei "scharfem"? Unser Auge kann 3-dimensional sehen, da die betrachteten Objekte aus zwei leicht versetzen Perspektiven gesehen werden. Deswegen haben wir auch 2 Augen :) . Wenn man nun einen Punkt fixiert, stellen sich beide Augen auf diesen Punkt ein. Vereinfacht ausgedrückt, treffen sich an diesem Punkt die Sehstrahlen der Augen. Behält man nun diese Augeneinstellung bei und bewegt das Objekt näher zu den Augen hin, werden von den Augen zwei dicht bei einander liegende Punkte fixiert, aber nicht mehr der selbe Punkt. Dies nutzt man bei den magischen Bildern aus und verzerrt das Muster, wenn eine 3-dimensionale Wirkung entstehen soll, entsprechend.
Ich habe dazu mal ein kleines Programm geschrieben, was solche Bilder erzeugt. Einige erzeugte Bilder könnt ihr euch hier anschauen:
Jetzt seid ihr gefragt. Was ist auf den Bildern zu sehen. Manche sind wirklich schwer. Schreibt die Lösung einfach in die Kommentare!
Nochmal die Anleitung, wie man die 3D-Objekte sehen kann: Haltet euch das Bild relativ nahe vor die Augen, versucht nun die Aktuelle Augeneinstellung beizubehalten und bewegt das Bild ganz langsam nach vorne/hinten. Wenn ihr das Gefühlt habe, dass da was erscheinen könnte, dann bleibt bei der Stelle und bewegt das Bild nur sehr leicht.
Ein anderes Vorgehen ist, einen Punkt im Raum zu fixieren und sich da die ganze Zeit drauf zu konzentrieren. Dann das Bild langsam in den Blickbereich schieben, ohne dabei die Augeneinstellung zu verändern. Dann wieder das Bild nach vorne oder hinten bewegen, bis das 3D-Objekt erscheint.
Das Programm zum Erzeugen der Bilder habe ich ganz plump in PHP geschrieben, ohne viele Fehlerkontrollen oder Sonstiges - Hauptsache es funktioniert und erfüllt seinen Dienst
php Code
- <?
- $muster = @ImageCreateFromJPEG ("muster.jpg");
- $relief = @ImageCreateFromJPEG ("relief.jpg");
- // Breite und Höhe von Quellbild und Muster auslesenn
- list($w,$h) = getImageSize("muster.jpg");
- list($breit,$hoehe) = getImageSize("relief.jpg");
- if ($muster && $relief) {
- $img = imageCreateTrueColor ($breite, $hoehe);
- $weiss = ImageColorAllocate ($relief, 255, 255, 255);
- $schwarz = ImageColorAllocate ($relief, 0, 0, 0);
- // Pixel für Pixel das 3D-Bild erzeugenn
- for($z=0; $z<$hoehe; $z++) {
- for($s=0; $s<$breite; $s++) {
- if($s/$w<1)
- $newColorindex = imageColorAt($muster,$s,$z%$h);
- else {
- $colorindex = imageColorAt($relief,$s,$z);
- $p = $colorindex / $weiss;
- $pos = $s - (1 - 0.25*$p)*$w;
- $newColorindex = imageColorAt($img,$pos,$z);
- }
- imageSetPixel($img,$s,$z,$newColorindex);
- }
- }
- if(imageJpeg($img,"resultat.jpg"))
- echo 'Bild wurde erstellt.';
- }
- ?>
Die zweite Variante ist etwas verbessert, da die Ergebnisbilder nicht zu sehr verzerrt werden. Der Algorithmus fängt in der Mitte des Bildes an und setzt dann nach dem selben Verfahren, wie oben, nach rechts und links fort.
php Code
- <?
- $musterFileName = "muster.jpg";
- $reliefFileName = "relief.jpg";
- $muster = @ImageCreateFromJPEG ($musterFileName);
- $relief = @ImageCreateFromJPEG ($reliefFileName);
- list($musterBreite,$musterHoehe) = getimagesize($musterFileName);
- list($reliefBreite,$reliefHoehe) = getimagesize($reliefFileName);
- if ($muster && $relief) {
- $img = imagecreatetruecolor ($reliefBreite, $reliefHoehe);
- $weiss = ImageColorAllocate ($relief, 255, 255, 255);
- $schwarz = ImageColorAllocate ($relief, 0, 0, 0);
- $faktor = 0.2;
- // mittleren Muster-Streifen zeichnen
- $mitte = (int)( $reliefBreite/2 );
- echo "Reliefbreite: ".$reliefBreite."<br />";
- echo "Reliefhoeh: ".$reliefHoehe."<br />";
- echo "Musterbreite: ".$musterBreite."<br />";
- for($z=0;$z<$reliefHoehe;$z++) {
- for($s=0;$s<$mitte;$s++) {
- // Nach links Muster fortsetzen
- $colorindexLinks = imagecolorat($relief,$mitte-$s-1,$z);
- $pLinks = $colorindexLinks / $weiss;
- $posLinks = (int)( (1 - $faktor*$pLinks)*$musterBreite );
- if(2*$s<$posLinks)
- $newColorindexLinks = imagecolorat($muster,(-$s-1+$posLinks+$musterBreite)%$musterBreite,$z%$musterHoehe);
- else
- $newColorindexLinks = imagecolorat($img,$mitte-$s-1+$posLinks,$z);
- imagesetpixel($img,$mitte-$s-1,$z,$newColorindexLinks);
- // Nach Rechts Muster fortsetzen
- $colorindexRechts = imagecolorat($relief,$mitte+$s,$z);
- $pRechts = $colorindexRechts / $weiss;
- $posRechts = (int)( (1 - $faktor*$pRechts)*$musterBreite );
- if(2*$s<$posRechts)
- $newColorindexRechts = imagecolorat($muster,($s-$posRechts+$musterBreite)%$musterBreite,$z%$musterHoehe);
- else
- $newColorindexRechts = imagecolorat($img,$mitte+$s-$posRechts,$z);
- imagesetpixel($img,$mitte+$s,$z,$newColorindexRechts);
- }
- //eventuell zusätzlichen rechten Streifen einfügenen
- if(($reliefBreite-$musterBreite)%2==1) {
- $colorindexRechts = imagecolorat($relief,$reliefBreite-1,$z);
- $pRechts = $colorindexRechts / $weiss;
- $posRechts = $reliefBreite-1 - (1 - $faktor*$pRechts)*$musterBreite;
- $newColorindexRechts = imagecolorat($img,$posRechts,$z);
- imagesetpixel($img,$reliefBreite-1,$z,$newColorindexRechts);
- }
- }
- if(imagejpeg($img,"resultat.jpg"))
- echo 'Bild wurde erstellt.';
- }
- ?>
Im Program habe ich auf zwei Bilder verwiesen (relief.jpg und muster.jpg). Diese sollten sich im selben Verzeichnis wie die PHP-Datei befinden, damit sie gefunden werden. Das Relief ist eine Grafik, die die selben Ausmaße wie das Endbild haben muss. Der Hintergrund wird schwarz gefärbt und um so weißer das Bild wird, um so höher erscheint das Objekt im 3D-Bild. Oftmals habe ich die Bilder nur aus 2 Farbe erstellt, damit die Kanten im 3D-Bild deutlicher zu sehen sind und es somit einfacher wird die Objekte zu erkennen. Auf den von mir erstellten Bildern sind unter Anderem dieses Fahrrad, eine Ente, ein Apfel, Hund oder Schmetterling zu sehen.
Das zugrunde liegende Muster ist so zwischen 50 und 75 Pixel groß und sollte im 3D-Bild nicht breiter sein, als der Abstand der Augen, d.h. etwa 2-3cm. Musterdateien findet man z.B. über Google.
kann das jeder?!
Es kann fast jeder! Die Schwierigkeit besteht darin, die Augen die Bilder nicht automatisch scharf stellen zu lassen, sondern das bewusst zu unterdrücken. Es gibt ein paar Tricks, wie oben beschrieben, aber das kann dann trotzdem noch nicht jeder. Es ist sicher einfacher, wenn man sich die Bilder ausdruckt, als am Bildschirm zu machen. Da geht das zwar auch, ist aber viel anstrengender, als auf Blatt Papier.
ist nicht schlecht
aber kein richtiger kontrast man erkent die sachen zb. den apfel nicht richtig die pyramide dagegen ist sehr gut
@celebro Wenn du dich ein wenig mit dem Verfahren auskennst, würde ich mich über einen Tipp freuen, wie ich mein kleiner Programm noch verbessern kann. Ich z.B. fand die Pyramide recht schwierig, andere Bilder dafür einfach.
Leider sehen die Resultate noch nicht so gut aus, wie in den diversen Heften und Büchern, aber das Prinzip funktioniert schon.
das dritte von links ist ein schmetterling^^
komplett geil!! ^^
müll