Forum: Mikrocontroller und Digitale Elektronik Eigene 3D-Engine - Einige Fragen


von Sean G. (atmega318)


Lesenswert?

Ich versuche im Moment eine 3D-Engine für Spiele und ähnliches zu 
schrieben. Zielplattform sieht wie folgt aus:

- STM32F4
- Greyscale LCD, im moment 96*64, ich möchte aber auch andere 
Auflösungen unterstützen
- Auf Texturen/Licht verzichte ich, weil eh nur 5 Graustufen zur 
Verfügung stehen
- Möglichst anwenderfreundlich

Ich habe vor ein paar Monaten mal hier
Beitrag "Gesucht: 3D Rendering Routinen in C"
nach Rendermöglichkeiten gefragt. Da das Projekt viele Teile beinhaltet 
gehts erst jetzt mit der Engine weiter...

Nachdem nun das Grundgerüst läuft, stellt sich mir natürlich die Frage 
der Schnittstelle:
Ich möchte Objekte kreieren können (z.B. einen Würfel), welche ich zu 
einem späteren Zeitpunkt skalieren, drehen etc. kann. Dazu hätte ich 
dann viele Klassen, welche jeweils zum Beispiel einen Würfel darstellen:
Parameter wie
-Mittelpunkt
-Kantenlänge
-Rotation

Jetzt sehe ich 2 Ansätze:

1. Es gibt einen Polygon-Buffer, der als Eingabe der Renderfunktion 
dient. Wenn zum Beispiel ein Würfel gereut wird, dann dient die Funktion 
würfel1.rotate() dazu, die 12 Einträge im Polygon-buffer zu 
aktualisieren. Vorteil wäre ein Schnelles erzeugen des Bildes.

2. Es gibt keinen Buffer, Bei jedem Aufruf der Renderfunktion wird jedes 
einzelne Objekt neu aus seinen Attributen berechnet. Vorteil wäre, dass 
die 37 Byte Buffer/Polygon nicht benötigt werden (ein Polygon ist 37 
Byte gross).

Welche der 2 Möglichkeiten soll ich wählen? Ich hätte am liebsten die 2. 
Variante, aber da sehe ich ein weiteres Problem: Jedes Objekt vom typ 
Cube hat eine Funktion wie folgt:
cubex.return_polgons()
Das heisst für JEDES Objekt muss die aufgerufen werden. Gibt es da 
irgendeine Möglichkeit dazu?

Also dass die Funktion render() z.B. all das aufruft:
cube1.return_polgons()
cube2.return_polgons()
cube54.return_polgons()
cow123.return_polgons()
house.return_polgons()
usw.

Weil bei Variante1 müsste man sich auf 2000 oder so Polygons pro Szene 
beschränken, und ich kann schlecht beurteilen, ob das in jedem Fall 
genug ist.

Besten Dank, und Sorry dass es so lange geworden ist ;)

von ucglib (Gast)


Lesenswert?

Hi

Hast du denn schon eine Graphics Lib dafür ausgesucht?
Du must ja auch Polygone zeichnen können (nicht ganz so einfach). Und 
wie bringst Du das auf das Display? Nur wire frame oder Z-Buffer 
algorithmus?

Für meine eigene lib hab mich mal ein Demo geschrieben. Auf dem youtube 
Video ist das am Schluss zu sehen:
https://code.google.com/p/ucglib/

Die Render Engine für den Würfel ist hier:
https://code.google.com/p/ucglib/source/browse/sys/arduino/Box3D/Box3D.ino

Viel Erfolg.

Oliver

von Sean G. (atmega318)


Lesenswert?

ucglib schrieb:
> Hi
>
> Hast du denn schon eine Graphics Lib dafür ausgesucht?
> Du must ja auch Polygone zeichnen können (nicht ganz so einfach).

Jep, mehr oder weniger selber geschrieben, habe mich daran orientiert: 
http://www.sunshine2k.de/coding/java/TriangleRasterization/TriangleRasterization.html


> Und  wie bringst Du das auf das Display? Nur wire frame oder Z-Buffer
> algorithmus?

Später dann Z-Buffer, aber im Moment läuft es noch auf dem falschen 
Chip, weshalb ich zuwenig RAM dafür habe. Deshalb habe ich jetzt die 
Polygone anhand der Z-Koordinaten ihres Mittelpunktes sortiert und dann 
so gezeichnet. Gibt natürlich Artefakte, aber zum Testen reichte es.

> Für meine eigene lib hab mich mal ein Demo geschrieben. Auf dem youtube
> Video ist das am Schluss zu sehen:
> https://code.google.com/p/ucglib/
>
> Die Render Engine für den Würfel ist hier:
> https://code.google.com/p/ucglib/source/browse/sys/arduino/Box3D/Box3D.ino
>

WOW, das sieht super aus, ich muss mir deine Lib mal genauer ansehen!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.