Raytracer in Python programmieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
Weltbesiedler
User
Beiträge: 103
Registriert: Dienstag 2. Februar 2010, 18:44
Wohnort: Bayern

Ist es möglich einen Raytracer in Python zu programmieren der am Ende der Berechnung ein gerendertes Bild ausgibt? Wenn ja, wie viel Arbeit wäre damit verbunden (welche Arbeitsschritte)? Die Frage ist rein hypothetisch :).
BlackJack

@Weltbesiedler: Ja das ist möglich. Wie viel Arbeit das macht, hängt davon ab was der alles können soll.
Benutzeravatar
Weltbesiedler
User
Beiträge: 103
Registriert: Dienstag 2. Februar 2010, 18:44
Wohnort: Bayern

Danke für deine Antwort. Also er soll halt ein vorher definiertes Objekt mit Farbe / Shader / Kaustiks berechnen können. Alle Objekte in der Szene werden vorher definiert (im Code nicht in einer GUI).
deets

Wenn du viel zeit hast - denn sowas in Python zu implementieren wird das ganze sehr, sehr langsam machen.

Warum verwendest du nicht POV Ray? Vll.it einem Python Skript zum generieren?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Einen simpler raytracer ist nicht wirklich kompliziert, siehe: http://www.python-forum.de/viewtopic.php?f=21&t=27696

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Weltbesiedler
User
Beiträge: 103
Registriert: Dienstag 2. Februar 2010, 18:44
Wohnort: Bayern

Wieso würde das so langsam gehen? Weil Python eine Interpreter Sprache ist? Und wie soll ich POV-Ray in ein Python Script implementieren wenn ich den Source-Code gar nicht habe zudem ist POV-Ray nicht in Python geschrieben.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Weltbesiedler hat geschrieben:Und wie soll ich POV-Ray in ein Python Script implementieren wenn ich den Source-Code gar nicht habe
Da gäbe es zig Möglichkeiten, angefangen bei einem simplen `subprocess`-Aufruf ;-) Dazu brauchst Du keinen Quellcode - den könntest Du Dir übrigens leicht besorgen...
Weltbesiedler hat geschrieben: zudem ist POV-Ray nicht in Python geschrieben.
Ja und? Ist Qt auch nicht, dennoch existieren dafür Python-Bindings!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Weltbesiedler
User
Beiträge: 103
Registriert: Dienstag 2. Februar 2010, 18:44
Wohnort: Bayern

Danke für die hilfreichen Antworten, ich merke schon das ich noch einige Zeit brauche bis ich das alles ganz verstanden habe. Jetzt hab ich auch gemerkt das es den Source Code auf der Home Page zum Downloaden gibt :).
deets

Du sollst nicht Python in POV-Ray machen. Sondern Python benutzen, um eine POV-Ray Scene zu erzeugen, als Textfile. Und die dann dem POV-Ray Programm zum Frass vorwerfen.

Und ja, in Python geschrieben waere der Rendere arschlahm, weil es eine interpretierte Sprache ist.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

deets hat geschrieben: Und ja, in Python geschrieben wäre der Renderer arschlahm, weil es eine interpretierte Sprache ist.
Hui... das riecht nach Off-Topic Diskussion ;-) Prinzipbedingt würden das doch eher die wenigsten unterschreiben...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Weltbesiedler
User
Beiträge: 103
Registriert: Dienstag 2. Februar 2010, 18:44
Wohnort: Bayern

Ein bisschen Off-Topic schadet ja nicht. Was ist denn Deiner Meinung nach der Grund für die Langsamkeit eines Python Raytracers, Hyperion? Außerdem wäre es mein Traum so einen Renderer wie POV-Ray selber zu programmieren. Er scheint nämlich schon ziemlich angestaubt wenn ich mir da einzelne Bilder bzw. Testszenen so anschaue. "Versteht" denn POV-Ray überhaupt Python?
Testszene Landschaft: http://www.fotos-hochladen.net/uploads/ ... qktlvy.png
deets

@Weltbesiedler

Nein, er versteht seine eigene Szenenbschreibungssprache. Die kannst du aber mit Python generieren.

Und was das angestaubte angeht... erstens denke ich sagt das mehr ueber die Gestalter die ihn benutzt haben aus, als ueber den Renderer selbst. Der beherrscht AFAIK so ziemlich alles, was geht.

Und zweitens... mach's mal erst genauso gut. Egal worin... bis du da bist, dauert's ne weile. Es ist ja schoen, dass du sowas selbst machen willst, und als Lernprojekt sicher spannend - insofern, fang ruhig an. Nur bin skeptisch, dass du da bahnbrechend wirken wirst ;)
deets

@Hyperion

Jaja, ich habe gerade gestern nett mit Christian Tismer ueber PyPy geredet, und wie toll das ist. Ich bin auch ehrlich begeistert, und vielleicht arbeite ich daran ein bisschen mit. Doch ein drop-in-replacement fuer alles, was man so macht, ist es noch nicht.

Aber bist du wirklich der Meinung, fuer diese Disukssion hier ist das relevant? CPython ist *langsam*. Und interpretiert. *Punkt*. Ich liebe es, aber jetzt hier mit "aber, aber, aber wenn man dies und jenes tut" zu kommen, dann kann man hier jede Diskussion in's unendliche strecken...
Benutzeravatar
Weltbesiedler
User
Beiträge: 103
Registriert: Dienstag 2. Februar 2010, 18:44
Wohnort: Bayern

Der beherrscht AFAIK so ziemlich alles, was geht.
Hab ich auch gerade gemerkt, ist ja fast sowas wie Kaustiken :D .
http://img3.fotos-hochladen.net/uploads ... iq7zec.png
Und zweitens... mach's mal erst genauso gut. Egal worin... bis du da bist, dauert's ne weile. Es ist ja schoen, dass du sowas selbst machen willst, und als Lernprojekt sicher spannend - insofern, fang ruhig an. Nur bin skeptisch, dass du da bahnbrechend wirken wirst
Ja ich weis leider selber das ich so einen Renderer wahrscheinlich nicht schreiben werde und klar ist auch das das Ergebnis (falls überhaupt was dabei rauskommt) nicht bahnbrechend wird. Brauche ich für das Thema Raytracer eine Literatur weil in das Thema eingearbeitet habe ich mich bis jetzt noch nicht, oder reichen Python Kenntnisse und Mathematik Kenntnisse aus? Entschuldigung wenn meine Fragen hier etwas naiv rüberkommen was vielleicht daran liegt das sie es auch sind :oops: .
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Weltbesiedler hat geschrieben:Brauche ich für das Thema Raytracer eine Literatur weil in das Thema eingearbeitet habe ich mich bis jetzt noch nicht, oder reichen Python Kenntnisse und Mathematik Kenntnisse aus? Entschuldigung wenn meine Fragen hier etwas naiv rüberkommen was vielleicht daran liegt das sie es auch sind :oops: .
Prinzipiell ist die Mathematik hinter Raytracern recht simpel (man kann es natürlich beliebig komplex werden lassen), aber woher sollen wir denn wissen, wie gute deine Python und Mathematikkenntnisse sind? Probiere doch einfach mal POV-Ray aus, frage die Suchmaschine deiner Wahl nach Raytracing und lese dich ein. Das ist für alle Seiten viel effizienter als nach irgendwelchen theoretischen Allgemeinplätzen zu fragen.

Sebastian
Das Leben ist wie ein Tennisball.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@deets: Ich wollte Dir auch nicht direkt widersprechen; evtl. hättest Du direkt etwas von Python oder besser noch CPython sagen sollen. Java / C# z.B. sind in ihren Standardumsetzungen ziemlich flott, obwohl sie interpretiert sind - aber das weißt Du ja mindestens genau so gut wie ich. Nur der OP vermutlich nicht, daher sollte man ihm zumindest so genau wie nötig beschreiben, worin die Kausalitäten liegen. Ansonsten rennt er durch die Welt und erzählt rum, dass interpretierte Sprachen per se langsam sind...

@Weltbesiedler: Mal ein Beispiel von mir. Man kann virtuelle LEGO-Modelle (LDraw-Format) in PovRay-Szenen-Dateien umwandeln und dann rendern lassen. Habe ich intensiv für meine Diplomarbeit verwendet.
Bild
Da ich mit dem Tool zur Umwandlung nicht wirklich zufrieden war, habe ich mal angefangen Python-Utilities zu schreiben, die so eine Umwandlung auf Basis von `jinja2` durchführen. Allerdings bin ich da nie wirklich so richtig weit gekommen...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@Hyperion: Du hast LEGO-Modelle für Deine Diplomarbeit gerendert? Jetzt bin ich aber neugierig! :-)
0x1cedd1ce
User
Beiträge: 31
Registriert: Sonntag 3. Oktober 2010, 12:21

@Hyperion: Natürlich sind interpretierte Sprachen langsamer als nicht interpretierte, da erst jeder Befehl durch den Interpreter muss und nicht direkt ausgeführt wird. Das kann zwar recht flott sein. Aber pures asm ist schneller.

Das Hauptproblem ist aber nicht der Interpreter, sondern die CPU. Ein Raytracer benutzt hauptsächlich Fließkomma-Opperationen und die sind extrem langsam auf ner CPU.

@weltenbesiedler:
Raytracer sind sehr simpel. Du brauchst dafür nur Schnittpunkte und etwas Wissen über Matrizen, Vektoren, Normalen. Wenn du dich erstmal auf einfache Objekte beschränkst. z.B. nur Kugeln nutzt. Dann kannst du sehr schnell etwas brauchbares herstellen. Achte sehr genau darauf das diese Objekte eine Oberklasse haben, damit du einfach neue hinzufügen kannst.
Die Funktionsweise findest du mittels Google, bei mir an der Uni gibt es die Vorlesung "Computer Graphik" die genau das behandelt. Vielleicht findest du Vorlesungsfolien im Netz.
Für diese Vorlesung hab ich auch ein Raytracer implementiert. Allerdings in C++, von dem ich keine Ahnung hatte. Arbeitsaufwand 1 bis 2 Tage
Nach dem eigentlichen Tracer brauchst du noch ein Shader, z.B. Phong-Shading. Das ist eigentlich nur ein Algorythmus mit dem man die Farbe eines Schnittpunktes berrechnet, geht ganz schnell.
Ein Schattenfühler um zu erkennen ob ein Schnittpunkt im Schatten liegt ist nur eine weiterführung des Raytraces.
Damit du auch Bildchen auf deine Objekte bekommst brauchst du noch etwas zum Mappen von Bitmaps.
Falls du dann noch Lust hast gibt es tolles Sachen wie Bump-Map, Environment-Mapping.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Es gibt eh schon einige Renderer, auch viele OpenSource Software. Ein paar Links hab ich hier: http://www.jensdiemer.de/de/Blog/312/3d-render-engines/

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

0x1cedd1ce hat geschrieben:@Hyperion: Natürlich sind interpretierte Sprachen langsamer als nicht interpretierte, da erst jeder Befehl durch den Interpreter muss und nicht direkt ausgeführt wird. Das kann zwar recht flott sein. Aber pures asm ist schneller.
Wenn man einen guten GC und JIT hat kann ein Interpreter durchaus schneller sein als der Code den ein Compiler generiert, so "natürlich" ist da gar nichts.
Antworten