Forum: Mikrocontroller und Digitale Elektronik Grafik-Engine


von Thomas (Gast)


Lesenswert?

Hallo zusammen,
meine Frage ist vielleicht völliger Quatsch, aber sie interessiert mich
schon seit längerem. Bis jetzt habe ich mit einem AVR und einem LCD
Display eine Art "Gameboy" gebaut in dem der AVR als Baasic
Interpreter arbeitet. Meine Frage ist nun, ob es möglich wäre mit einem
Mikrocontroller (vielleicht lpc21xx) eine kleine 3D-Engine zu
programmieren? Als ausgabe würde ich dafür gerne meine Ausgabekarte für
einen VGA Monitor benutzen, die eine Auflösung von 320x240 pder 160x120
unterstützt. Wäre soetwas grundsätzlich möglich, oder sind solche
Mikrocontroller einfach zu schwachbrüstig?

Wäre über jegliche Tipps dankbar

Thomas

von Jens D. (jens) Benutzerseite


Lesenswert?

also ein PII300 wuerde es sicher schaffen
nur fraglich ist das mit dem aufwand =)

kleinere 3d modelle hmmh evtl, wenn wenn wenn...

von Benedikt (Gast)


Lesenswert?

Mit einfachen 3D Routinen (drehendes Wireframe Modell) schaffte ein
mega8515 etwa 5000-10000 Pixel/s. Auf einem 160x128 LCD machte das etwa
10-15fps.

von Niels H. (monarch)


Lesenswert?

Das ist wohl eine Frage der Rechenleistung und der effizienz, mit der
die Daten zum Display transportiert werden.

Wolfenstein lief damals ab 386sx mit 16Mhz, und die hatten gerade mal 3
oder 4Mips, wenn ich mich recht erinnere. Das müsste son AVR locker
schaffen.

Allerdings wurden die Daten zur VGA-Karte auch paralell über einen
16Bit breiten Bus übertragen. Ich denke, so eine optimierte Verbindung
hast du zu deinem LCD nicht, oder?

von Marco G. (kaffeedoktor)


Lesenswert?

Hallo Thomas,

ich würde sagen dass vor allem wichtig ist, dass der verwendete
Mikrocontroller/Mikroprozessor vor allem mit Gleit-/Fixpunkt-Zahlen in
Hardware umgehen können sollte, da gerade für 3D-Anwendungen diese m.E.
relevant sind.

Letztendlich kommt es aber wohl darauf an was genau Du unter einer
"kleinen 3D-Engine" verstehst.

Grüße,

Marco.

von Thomas (Gast)


Lesenswert?

Danke für die schnellen Atnworten!!
Also, es gibt ja manche LPC´s oder AVR´s mit externem Datenbus. Da
meine "Grafikkarte" einen eigenen Controller hat würde es ja reichen,
wenn der AVR oder LPC die Daten in einen Ram schreibt und die
Grafikkarte diese einfach ausgibt. Wenn man z.B. einen Dual-Port Ram
(oder wie die heißen) nehmen würde, dann bräuchte der AVR oder LPC nur
noch die fertig berechneten Pixel dort reinschreiben, den Rest macht
die Grafikkarte.

Zu den Gleitkommazahlen:
Wenn ein 386sx Wolfenstein schafft, der aber meiner Meinung nach auch
ohne Coprozessor keine Gleitkommazahlen berechnen kann, dann dürfte das
ein LPC ganz locker hinbekommen, oder?

Gruß Thomas

von Thomas (Gast)


Lesenswert?

Sorry, hab noch was vergessen:

Also unter kleiner 3D-Engine stell ich mir etwa so etwas vor, mit dem
ich eine Grafik wie Wolfenstein oder Doom bekomme, besser wäre Doom
;-)

Gruß Thomas

von Christian (Gast)


Lesenswert?

Hmmm,


hört sich interessant an, hatte schon mal ähnliches vor, aber wegen
mangels eingestellt...

Es gibt open source spieleconsolen, da mal umsehen...

Ansonsten, warum ich gescheitert bin:


640*480*256 = 80KByte "Grafikspeicher"

Eventuel ist es möglich das ganze zu Teilen:

1. Teil "Grafikkarte" (AVR, DRAM, LCD)
2. CPU

--> in dem AVR als Baasic Interpreter arbeitet.
Source bitte ???
Sowas suche ich...

Lg


Christian

von Marco G. (kaffeedoktor)


Lesenswert?

Hallo Thomas,

wegen Gleitkommazahlen: 3D-Grafik basiert sehr viel auf den
trigonometrischen Funktionen, deren Ausführung ohne FPU nicht gerade
flott ist.

Natürlich kann man auch eine Art Look-Up-Tabelle verwenden und so die
Berechnung garnicht mehr auf dem Zielsystem durchführen. Ich nehme mal
an dass das früher eben auch so bei den 3D-Spielen gemacht wurde.

Wichtig bei so "geringer" Rechenleistung ist dann natürlich auch
effiziente Programmierung. Ich würde an Deiner Stelle vielleicht
erstmal mit einfachen Drahtgittermodellen anfangen.

Grüße,

Marco.

von Osterhase (Gast)


Lesenswert?

/*
Mit einfachen 3D Routinen (drehendes Wireframe Modell) schaffte ein
mega8515 etwa 5000-10000 Pixel/s.
*/

Hättest genauso "100-10000 Pixel/s" schreiben können, hat den
gleichen Informationsgehalt. Nach dem Motto, das Auto kostet etwa
30000-60000 Euro.

von Niels H. (monarch)


Lesenswert?

px=x*zoom/z;
py=y*zoom/z;

mit dieser Formel kommt man aus, um die Position eines Texels auf den
zweidimensionalen Bildschirm zu projezieren. Darauf basiert quasi schon
die Renderingengine von Wolfenstein.

von Malte _. (malte) Benutzerseite


Lesenswert?

http://www.mikrocontroller.com/
und dort unter M16C gibt es ein Bild von einer animierten 3D
Vektorgrafik.

von Thomas (Gast)


Lesenswert?

@ Christian
Sorry, aber ich arbeite zur Zeit erst an dem Gameboy, habe mich oben
bischen falsch ausgedrückt. Bis jetzt kann der AVR nur einfache
Rechenoperationen (ohne Klammer usw.) und Texte ausgeben. Ich dachte
mir halt, bevor ich das feritg programmiere, frage ich erstmal, ob auch
3D möglich wäre, weil dann wäre mit großer Wahrscheinlichkeit mein
Interpreter umsonst gewesen. Aber so wie es aussieht scheint das alles
sehr kompliziert zu werden :-(

Ich habe mal eine Idee, wie man vielleicht einfach 3D Szenen darstellen
könnte.

Die 3D Welt besteht aus den Koordinaten x,y und z.
Wenn man nun das Koordinatensystem von oben betrachtet, sieht man ja
die x und z Achse. Nun legt man auf beide Koordianten ein Raster, so
das Vierecke entstehen. Die Objekte bestehen nun aus Stäben, die die
senkrecht stehen und immer genau so ein Viereck ausfüllen. Die Stäbe
fangen nun bei einer bestimmten y Position an und auch wieder auf. Wenn
ich nun von einem Virtuellen Auge aus einen Strahl "aussende", der nun
alle Vierecke die er schneidet in einer Liste aufschreibt, so müsste ich
nur so viele Strahlen aussenden, wie die Pixelbreite
des Bildschirms. Damit ich nun noch die y Informationen bekomme, so
überprüfe ich von jeden geschnittenem Viereck die anfangs und end
Koordinaten der y Achse und rechne diese mit dem Satz des
Pythagoras(abstand des x,z Rasters zum Auge und dem Höhenunterschied
zum Auge) in einen Winkel um, der dann einer y Koordiante auf dem
Bildschirm entspricht. Das ist zwar ähnlich wie das raytracing, aber
wenn es funktioniert und ein vielfaches einfacher. Durch das x,z Raster
ist natürlich dann die Genauigkeit der Oberfläche eines Objekts
begrenzt.

Naja, ich hoffe ihr versteht in etwa was ich damit meine
Gruß Thomas

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.