einfache 3D-Rendering Engine

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Würgeschlange
User
Beiträge: 5
Registriert: Donnerstag 6. August 2009, 20:53

Guten Tag Forum!
Ich hatte ein Wochenende Langeweile, also hab ich mir überlegt, was man denn mal so programmieren könnte. Es sollte irgendetwas mathematik-lastiges sein, bei dem man am Ende ein nettes Bild/Video bekommt, was man anderen zeigen kann. Irgendwann bin bin ich auf die Idee gekommen eine simple 3D-Engine zu schreiben, die in der Lage ist einen Punkt mit 3 Koordinaten auf ein zweidimensionales Bild zu projezieren.
Ein durchwachte Nacht und ein bisschen Kaffe später ist das hier herausgekommen: Rotating Cube

Da das aber noch nicht wirklich beeindruckend ist ("Ein rotierender Würfel, na und?") habe ich einfach kurzerhand ein Python Script für Blender geschrieben, mit dem ich Meshes aus Blender in meine Engine exportieren kann.

Das ganze sieht dann mit dem Monkeyhead von Blender so aus .

Nachdem ich also gezeigt habe, dass es möglich ist beliebige Meshes mit meiner Engine zu zeichnen bin ich noch einmal in die Vollen gegangen: Raumschiff Enterprise

Für alle, die Interesse an dem Quellcode haben: 3D-Engine.zip

Ich freue mich auf Eure Kommentare und konstruktive Kritik.
MFG Würgeschlange
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo!

Obwohl die Ergebnisse für einen Tag nicht schlecht sind, kommt dein Programm einer 3D-Engine so nahe wie eine Banane einer Rakete ;-) Es fehlen schon die grundlegensten Dinge zu einem Renderer: Flächen, allgemeine Strukturen und von der Mathematik will ich gar nicht erst anfangen. Ich habe noch einen kurzen Blick über den Code geworfen, daher mal einige Dinge die mir aufgefallen sind:

- Warum bentutz du kein Numpy?
- Die OutOfViewException ist falsch. Nur weil mein einen Punkt einer Linie nicht sehen kann heißt dies nicht, dass nicht wenigstens Teile der Linie sichtbar sind. Auch die __init__-Methode ist nicht korrekt: du überschreibst damit das Verhalten von Exception, was du sicherlich in dieser Form nicht machen möchtest.
- Dein Code ist voller Wiederholungen und magischer Zahlen.
- Was du zbuffer nennst ist kein Z-Buffer
- Klassen sollten bei Python<3 von object erben.
- Warum schleppst du Winkelangaben immer in Grad mit rum? Das Bogenmaß ist, abgesehen von Benutzereingaben und Ausgaben, die richtige Einheit.
- Was macht denn bitte "getAngleDegrees"? Und was soll die Exception "Wrong implementation of getAngleDegrees()"?
- Üblicherweise verwendet man für Transformationen Matrizen. Das macht die Berechnung einfacher und viel allgemeiener.
- Der Median ist nicht der Durchschnitt.
- getZBufferFace: kennst du die zip-Funktion?
- Ähhm: range(0,360,360)?
- Warum exportierst du die Modelle in Python-Module? Code und Daten sollten getrennt werden.
- Wenn man versucht etwas zu speichern, dann sollte man vorher auch den Ordner erzeugen ;-)
- *-Import solltest du sofort vergessen.
- Wenn andere dein Programm testen sollen, dann sollte man dazu schreiben, wie man das Programm aufrufen soll. Raten und nachschauen macht es unnötig schwer.
- Versuche dich an PEP8 zu halten. Im besonderen Funktionsnamen und Leerzeichen zwischen Operatoren.

Sebastian
Das Leben ist wie ein Tennisball.
Würgeschlange
User
Beiträge: 5
Registriert: Donnerstag 6. August 2009, 20:53

danke für die Antwort
ich muss zugeben, dass ich noch nicht so viel Ahnung von Python habe und mir bei diesem Script nicht viele Gedanken zur Struktur gemacht habe. Deswegen passen einige Funktionen auch nicht so ganz ins Gesamtbild. (Für Berechnung von Faces hab ich drei verschiedene Ansätze, die alle nicht funktionieren :( )
Ich werde mal sehen, dass ich mir deine Tipps zu Herzen nehme und mich ein bisschen mehr mit gutem Code Stil beschäftige :wink:
Antworten