Raytracer in Python programmieren
- 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 .
@Weltbesiedler: Ja das ist möglich. Wie viel Arbeit das macht, hängt davon ab was der alles können soll.
- 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).
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?
Warum verwendest du nicht POV Ray? Vll.it einem Python Skript zum generieren?
- 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
- 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.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
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:Und wie soll ich POV-Ray in ein Python Script implementieren wenn ich den Source-Code gar nicht habe
Ja und? Ist Qt auch nicht, dennoch existieren dafür Python-Bindings!Weltbesiedler hat geschrieben: zudem ist POV-Ray nicht in Python geschrieben.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
- 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 .
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.
Und ja, in Python geschrieben waere der Rendere arschlahm, weil es eine interpretierte Sprache ist.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Hui... das riecht nach Off-Topic Diskussion Prinzipbedingt würden das doch eher die wenigsten unterschreiben...deets hat geschrieben: Und ja, in Python geschrieben wäre der Renderer arschlahm, weil es eine interpretierte Sprache ist.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
- 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
Testszene Landschaft: http://www.fotos-hochladen.net/uploads/ ... qktlvy.png
@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
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
@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...
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...
- Weltbesiedler
- User
- Beiträge: 103
- Registriert: Dienstag 2. Februar 2010, 18:44
- Wohnort: Bayern
Hab ich auch gerade gemerkt, ist ja fast sowas wie Kaustiken .Der beherrscht AFAIK so ziemlich alles, was geht.
http://img3.fotos-hochladen.net/uploads ... iq7zec.png
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 .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
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.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 .
Sebastian
Das Leben ist wie ein Tennisball.
- 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.
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...
@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.
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
assert encoding_kapiert
@Hyperion: Du hast LEGO-Modelle für Deine Diplomarbeit gerendert? Jetzt bin ich aber neugierig!
-
- 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.
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.
- 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/
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.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.