Hallo Leute, ich kam vor kurzem auf die Idee mal etwas 3D mit meinem AVR Mega2560 zu machen. Das ganze läuft auf einem T6963C Display mit 240*128 Pixeln. Der aktuelle Code liegt im Anhang und ist ALLES ANDERE ALS EINE FERTIGE LIB! Ich stelle den Code aus zwei Gründen schon ein: Zum einen, weil mich generell interessiert ob jemand Bedarf an sowas hat und zum anderen ob jemand Lust hat daran in Anlehnung an die OpenGL API weiter zu programmieren. Klar ist, dass das ganze so schnell wie möglich sein muss, sonst bringt es nicht viel. Außerdem sollte das ganze sehr klein bleiben und so einfach wie möglich sein. Bei mir dreht sich hier eine kleine Pyramide flüssig auf dem LCD, allerdings habe ich noch ein Problem: Wenn ich die Vertex-Koordinaten meines Objekts negativ mache, dann flippt die Rotationsberechnung total aus. Das ist sehr ungünstig, da ich so keine Möglichkeit habe ein Objekt um seinen tatsächlichen Mittelpunkt zu rotieren... Kennt sich jemand ausreichend gut mit Matrixberechnungen und/oder Vektormathematik aus um den Fehler zu finden? Gruß und wer weiter schreibt, bitte hier wieder einstellen, damit andere auch wieder darauf aufbauen können :) Timo
Hört sich ja echt super an. Gibts ein Video von deinem bisherigen Pyramiden-Erfolg?
Nein, bisher nicht. Ich würde gerne noch weiter programmieren um mit der Trägheit des Displays zu experimentieren. Das Problem bei Bewegungen auf einem alten LCD ist, dass man schnelle Pixelwechel praktisch garnicht erkennt. Ein komplett löschen des Screens ist bei dem T6963C leider garnicht möglich, darum muss man sich einen Trick ausdenken um das möglichst schnell erledigen zu können. Dazu hatte ich zwei Sachen im Sinn: 1. Ubermalen der grade gezeichneten mit nicht gesetzten Pixeln, also alles Pixel per Pixel wieder löschen. In dem Fall muss man aber immer die ganze Scene zweimal zeichnen. 2. Einen Speicherbereich im Display komplett löschen und dann Pixelzeilenweise in den Sichtbereich kopieren. Das merkwürdige ist, dass das Display ein kopieren von ganzen Zeilen also 240*1 von einem Ort zum anderen zu unterstützen scheint. Wenn das geht, könnte man mit grademal 128 Kommandos das Display komplett löschen, statt der bisher in jeder Lib verwendeten 30720*2 Kommandos. Das habe ich aber noch nicht getestet. Die Lib kann bisher auch beinahe nichts, da zum einen die Berechnungen für die Darstellung der Vektoren nur für eine Orthogonale Darstellung geeignet ist und bisher keine perspektivische Verzerrung unterstützt. Außerdem wird außer glVertex und glLine noch nichts unterstützt :)
Gute Idee! Hab das mal ausprobiert, ist in der Tat noch nicht viel drin los in deinem Programm. Anmerkungen: - 8 Bit signed als Datentyp für Objekte und Translation ist zu wenig. - Benutze besser standard Datentypen (uint8_t, int8_t etc) - Arrays legt man nicht in .h Dateien an - Die Matrixoperationen würde ich mehr kapseln. Eventuell in Inline Funktionen. Bzw. einstellbar ob Inline oder nicht (Max Geschwindigkeit/Kleinste Größe) - Stubs für glBegin und glEnd hinzufügen um mit standard OpenGL code kompatibel zu sein - die glcd_ Calls hast du fest eingebaut, das würde ich per Define extrahieren in einen Konfigurationsheader - glRotationMatrix würde ich in höherer Auflösung speichern und nur bei der Ausgabe herunterrechnen. (Fixed Point) - Zu viele Divisionen in glVertex. Da verliert man unheimlich an Ungenauigkeit. Außerdem fehlen mir auch Rundungen etc. - Dein Ursprungspunkt liegt in der Mitte des Screens (So wie bei der PC Version?). Da müsste man auch ein paar Konfigurationsdefines hinzufügen um einen konstanten Offset einbauen zu können. Ansonsten hing bei mir alles oben links im Fenster. Soweit erst mal. Hast du denn noch Lust weiterzumachen? Habe mal ein kleines Windowsprogramm gebaut, wo man die Lib ausprobieren kann. Ist mit MSVC kompilierbar. Video siehe Anhang. Ein Beispielprogramm sieht dann so aus:
1 | #include "Emulator.h" |
2 | #include "avr_gl.h" |
3 | |
4 | int Round(double d) |
5 | {
|
6 | if (d > 0) |
7 | return (int) (d + 0.5); |
8 | else
|
9 | return (int) (d - 0.5); |
10 | }
|
11 | |
12 | void AVRTick() |
13 | {
|
14 | /* 10ms */
|
15 | static double phi = 0; |
16 | |
17 | glClear(); |
18 | glLoadIdentity(); |
19 | glRotate3i(5,Round(phi), 5 ); |
20 | glPyramid(50, 50, 10, 10, 1); |
21 | |
22 | phi += .5; |
23 | |
24 | if (phi>=62) |
25 | phi = 0; |
26 | }
|
27 | |
28 | int AVRMain() |
29 | {
|
30 | while(1) |
31 | {
|
32 | |
33 | }
|
34 | }
|
Der obige Code ist schon seit etlichen Jahren im Netz zu finden und wurde eigentlich für einen M16C geschrieben. Ursprünglich stammt er von hier: http://www.mikrocontroller.com/de/m16c.php Den Code kann man optimieren, wenn man anstelle der 32bit Variablen nur 16bit Festkomma verwendet und das ganze in Assembler berechnet (oder zumindest nur die 16x16->16bit Festkomma Multiplikationen in Assembler macht). Mit 8x8bit Berechnungen wird der Fehler zu groß, 16bit ist also schon sinnvoll. Sobald die Modelle komplexer werden, ist ein AVR allerdings schnell überfordert, vor allem da für eine 16bit Operation mehrer Takte erforderlich sind. Im Anhang mal ein Video von einem deutlich aufwendigeren Modell auf einem 320x240LCD, berechnet von einem dsPIC der nebenbei auch noch LCD Controller spielt.
Moin Benedikt! Wir haben ja mal zusammen das 4" Display Projekt gemacht! Der Code stammt von hier: http://www.mikrocontroller.com/de/m16c.php Das steht aber auch in der .h Datei. Ich habe erstmal nur den ganzen Codehaufen in unterschiedliche, intelligent benannte Funktionen untergebracht. Ich habe den Code natürlich übernommen - mit den dazu gehörigen Credits :) Ich fand es sehr gut, dass man mit dem AVR solchen Schabernack treiben kann, darum habe ich gehofft, dass es irgendwer mal weiter / umprogrammiert :) Total uneigennützig natürlich.... natürlich! ;-)
Stimmt, in der h Datei stehts. Ich hatte mir nur die .c angesehen und der Code kam mir sehr bekannt vor. Ich hätte den kompletten Code, optimiert in Assembler für AVR, falls interesse besteht. Allerdings nur mit 8bit Berechnungen, d.h. mit relativ großen Rundungsfehlern.
Hallo! Wusste gar nicht, dass da in der Richtung schon mal jemand was probiert hat. Habe nur was zu tun gesucht und deswegen eine kleine Testsuite gebaut für den Code vom TO. Wenn da aber schon so viel fertiger Code parat liegt, lohnt es ja schon fast gar nicht mehr da noch mal neu anzufangen. Aber tolle Sache!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.