Forum: Mikrocontroller und Digitale Elektronik 3D Effekt auf Pixeldisplay (Würfel)


von Thorsten S. (whitejack)


Lesenswert?

Hi,

Einiege von Euch haben doch sicher schon mal diese 3D Effekte auf 
Displays gesehen. Dort wird ein 3D Würfel in alle Richtungen gedreht.

http://www.youtube.com/watch?v=OlgqC8HLBTA

Ich habe keinen Ansatz wie das funktionieren kann. Momentan habe ich 
eine set_pixel (x,y) Funktion. Dazu habe ich mir die Grafikroutinen von 
damals apetech mit eingebunden, kann also Kreise, Quadrate und Linien 
zeichnen.

Um selber eine Kreisfunktion zu schreiben müsste man sich mit dem 
Bresenham auseinandersetzen, musste ich nicht da ich die "c-lib" einfach 
nehmen konnte, die funktion Set_Pixel ausprägen, gut.

Eigentlich suche ich nun soetwas für diesen Würfeleffekt, nur habe ich 
keine Idee wie, wo soetwas zu finden wäre.

Ich programmiere einen Atmega168 in c. Das Pixeldisplay umfasst eine 
Größe von 16x16Pixeln. Im Speicher sind es 16x uint16_t. Dazu habe ich 
wie gesagt eine Funktion die einen Pixel innerhalb dieses 
"Grafikspeichers" setzt. Das ist zur Zeit der Stand.

Ich würde mich sehr über einen Tip oder Hinweis freuen. Danke im voraus.

Gruß,
TS

von ich (Gast)


Lesenswert?

Grundlagen Darstellung von 3D-Objekten in 2D.

von Michael (Gast)


Lesenswert?

Sorry, aber dein Thread klingt für mich so:

"Hi! Ich habe eine Schraube, den ich nicht mal selber gebaut habe. Wie 
baue ich daraus einen Flugzeug in der Größe eines A380?
Achso...... Ich habe kaum Ahnung von der Materie, also macht es bitte 
für mich so, dass ich es nur noch starten muss..."

von Thorsten S. (whitejack)


Lesenswert?

...ich suche eine c-lib.

1)draw_cube (x,y,z,size) oder ähnlich (vielleicht auch winkel o.ä. 
angeben.
2)set_pixel ausprägen.
3)einbinden.

fertig. Ich möchte mich nicht ausführlich mit 3D und 2D rechnereien 
auseinadersetzen, zumindest nicht zu diesem Zeitpunkt. Ich hoffe darauf 
dass es eine kleine lib gibt.

TS

von Michael (Gast)


Lesenswert?

Leute mit dieser Einstellung bestätigen mir immer wieder, weshalb ich 
meine Bibliotheken nicht open source machen sollte. Vielen Dank dafür 
und viel Spass beim Suchen.

von Thorsten S. (whitejack)


Lesenswert?

...ich dachte immer das "c" genau dafür gemacht wurde, damit man das Rad 
nicht immer wieder neu erfinden muss...

"Vielen Dank dafür" wofür? Ich verstehe dich an der Stelle nicht, ich 
stelle auch meinen Code in der Codesammlung ein. Wenn jemand eine 
Kennlinie eines Sensors linearisiert hat dann muss das der nächste nicht 
noch mal umsetzen. Und meistens will man es dann doch ganz verstehen und 
geht da durch...

Nimm doch mal Peters DCF Lib, ich meine die hat über 6000 Downloads. Ich 
habe sie auch genutzt. Es führte aber dazu dass ich mich letztendlich 
doch detailiert mit dem Thema auseinandergesetzt habe, da sie anfangs in 
meiner Umgebung nicht so lief, da ich ohne Interrups arbeiten wollte. 
Ich habe sie dann umgeschrieben...

Es ist ja auch niemand dazu gezwungen seine sourcen freizugeben...

TS

von ich (Gast)


Lesenswert?

Suche Chronotonen für meine Zeitmaschine. Habe den Stecker für die 
Steckdose schon. Ich habe echt keine Zeit mich mit dem Thema 
Zeitmaschine auseinander zu setzen. Könnte mir jemand seine 
Chronotonen-c-Lib zur Verfügung stellen?

Ohne Worte....

von Karl H. (kbuchegg)


Lesenswert?

Das ist aber ein anderes Thema.

Computergrafik ist ein wenig mehr als nur ein bestimmtes bitweises 
Protokoll aufzunehmen. Du musst dort verstehen was du tust.

erst mal solltest du ein wenig Ahnung haben von

* wie stelle ich überhaupt räumliche Koordinaten dar
  dazu sind zb Vektoren ein guter Ansatz. Mit einem
  3D Vektor kann man gut 3-dimensionale Koordinaten darstellen.
  Wenn man sich merkt, was was ist, kann man damit auch Richtungs-
  vektoren darstellen. Die Verallgemeinerung zu homogenen Koordinaten
  macht das dann ganz von alleine (dann hat man 4-'dimensionale'
  Vektoren). Dafür ist es aber nicht mehr so leicht, die wesentlichen
  Vektoroperationen 'Skalarprodukt' und 'Kreuzprodukt' zu
  veranschaulichen

* die nächste Zutat lautet:
  wie stelle man Übergänge von einem Koordinatensystem zu einem
  anderen dar. Solche Übergänge können sein: Rotationen, Verschiebungen,
  Skalierungen bzw. die Verallgemeinereung von Skalierungen, die Shear-
  Operationen (keine Ahnung ob es dafür einen deutschen Ausdruck gibt).
  Es zeigt sich, auch deshalb weil man Positionen mit Vektoren
  dargestellt hat, dass dafür Matrizen ein gutes Wrkzeug sind.
  In der Verallgemeinerung von homogenen Koorindaten, ist deren
  Zusammenfassung zu 4*4 Matrizen das Werkzeug der Wahl, mit dem man 
alle
  notwendigen Operationen darstellen kann.

* bis jetzt hast du also 3-dimensionale Punkte und du kannst sie
  Manipulieren, indem du sie durch Matrizen (auch mehrere 
hintereinander)
  durchjagen kannst. Das ist super. Aber irgendwann wird es Zeit sie
  irgendwo abzubilden. Es muss also eine Projektion von der bisherigen
  3-dimensionalen Rechenwelt in eine 2--dimensionale Bildschirmwelt
  her. Auch die lässt sich mittels einer Matrix darstellen.
  Man benötigt einen Kamerapunkt und eine Richtung in die die Kamera
  schaut. Weiters eine Ebene, auf die die Szenerie abgebildet werden
  soll. Das drückt man jetzt als Matrix aus und hat damit eine Abbildung
  die einen 3d-Vektor auf einer 2d-Ebene abbildet. Die Linien noch
  miteinander verbinden und voila: Da schwebt er der Würfel.
  Das heisst fast: ein bischen klein ist er noch und er klebt in einer
  Ecke.

* Das aber lässt sich mit einer Window-Viewport Transformation hinten
  nach in den Griff kriegen. Sie erlaubt es einen beliebigen Ausschnitt
  mit Weltkoordinaten in einem anderen beliebigen Ausschnitt mit
  Pixelkoordinaten anzuzeigen. Bildverschiebungen, Bildvergrößerungen
  sind damit kein Problem mehr.

* Wenn es dann da nicht das Problem gäbe, wenn man zu sehr zoomt, dann
  kommen plötzlich seltsame Wrap-Around Effekte ins Spiel. Ein Clipping
  welches die Ausgabe auf entweder die Window-Fläche oder die Viewport
  Fläche begrenzt muss her.


Das ungefähr ist in kurzen Worten ein kurzer Abriss der 
Viewing-Pipeline, bzw. der Konzepte, die man benötigt, wenn man 
Computergrafik auf einer einfachen 3D-Ebene machen möchte. Man kann dann 
von da an beliebig schwieriger werden, indem man dann Konzepte wie 
Flächenshading, Rendering, Licht und Schatten, Texturen etc. einführt.
Es gibt genug Literatur zu dem Thema, es gibt genügend Web-Siten zu dem 
Thema. Das ganze ist sogar nicht mal besonders schwer, wenn man mal die 
Ebene Vektoren und Matrizen gemeistert hat, wozu man kein Mathe-Genie 
sein muss. Wie die einzelnen Matrixtypen für die Operationen aussehen 
ist bekannt und wie man Matrizen hintereinanderschaltet (miteinander 
multipliziert) muss man eben üben.

Eine Basis-C-Lib, mit der man das machen kann umfasst ca., ich würde mal 
sagen, so um die 20 bis 30 Funktionen, je nachdem was man sich als 
grundlegende Math-Funktionen für die Vektoren zurecht legt. Die 
Einzelfunktionen sind dabei sogar ziemlich kurz. ICh würde mal sagen mit 
so ungefähr drei bis vierhundert Lines of Code ist man dabei.

Was es aber nicht gibt: Eine 'Lib' mit einer draw_cube Funktion, und um 
alles andere braucht man sich nicht kümmern. (*)


(*)
d.h. das stimmt nicht ganz. Ich glaube in der GLUT, der Utility Library 
zu OpenGL gibt es einen entsprechenden Call. Aber auch dort bedeutet das 
nicht, dass man die Viewing Pipeline nicht erst mal aufsetzen und 'in 
Betrieb' nehmen muss.

von Thorsten S. (whitejack) (Gast)


Lesenswert?

Hi Karl Heinz,

ok, ich sehe schon. Ich habe keine Vorstellung davon wie komplex das 
Thema ist. Man sieht hier und da mal so einen Würfel auf einem Nokia 
Display, oder einem Matrix LCD usw... und liest manchmal etwas von einer 
Grafik Engine... etc. -> keine Idee was genau dahinter steckt - jetzt 
zumindest ansatzweise.

Ist jetzt klar "mal eben" einbauen wie einfache Grafikfunktionen ist 
dann also nicht, hätte ja sein können. Mal sehen ob ich an der Stelle 
jetzt beginne tiefer zu "graben" :-)

Gruß,
TS

von Karl H. (kbuchegg)


Lesenswert?

Thorsten S. (whitejack) schrieb:

> Ist jetzt klar "mal eben" einbauen wie einfache Grafikfunktionen ist
> dann also nicht, hätte ja sein können. Mal sehen ob ich an der Stelle
> jetzt beginne tiefer zu "graben" :-)

Solltest du unbedingt.
Das Thema ist nicht so einfach wie: ich ruf da einfach mal eine Funktion 
auf und alles ist gut.
Es ist aber auch keine Raketentechnik. In ein paar Stunden könntest du 
alles beisammen haben, sodass sich dein Würfel dreht (wenn dein µC 
mitkommt).
Und eine halbe Stunde später dregt sich dann auch ein Tetraeder, 
Oktaeder, Dueodecaeder (mein spezieller Liebling), ein Haus, etc. Nur 
ein Teapot wird etwas länger dauern, da musst du erst mal durch 
Bezier-Splines durch :-)

von Ich (Gast)


Lesenswert?

Guggst du hier

http://www.base32.de/ ( unter Projekte / 3D-Grafik mit 
PIC-Mikrocontroller
)

von Dennis (Gast)


Lesenswert?

kleine Application Note von Atmel zu dem Thema:

AVR32134: AVR32 UC3 3D Graphic Rendering
Application

http://www.atmel.com/images/doc32100.pdf

Gruß

von Raid Freak (Gast)


Lesenswert?

Überigends kann man 3D Algorithmen und Lineare Algebra(Mathe) auch sehr 
schön mit Matlab üben und Lernen. Nur mal so als tip. Zumindest wenn man 
die Muße hat sich da ein zuarbeiten, kann man dan im PIC oder AVR 
"schnell mal" seine eigenen Transformationen bauen.

Ein weiter Tip wenn man die Muße hat such man sich im netz ein freies 
Script für Computergraphic oder ne videovorlesung, dort wird meist alles 
im Detail erklärt. Aber das funktioniert (oft) nicht ohne fundiertes 
Basiswissen.
hier gibts zB nen freies:
http://www.medien.ifi.lmu.de/lehre/ss10/cg1/

von Thorsten S. (whitejack) (Gast)


Lesenswert?

Hi,

vielen Dank für die Tips.

Mit Daniel Porzig hatte ich vor Jahren mal Kontakt zu einem anderen 
Thema meine ich, wusste garnicht das er eine Site hat.

Das es dazu eine App Note geben könnte - auf die Idee wäre ich nie 
gekommen, da möchte man am liebsten sofort mit loslegen.

Die Vorlesung sieht auch sehr detailiert aus.

Für mich steht die Entscheidung an ob ich da nun tiefer einsteige denn 
eigentlich hatte ich ein anderes Ziel und wollte das nur auf dem Weg 
"mitnehmen" wenn möglich. Ihr kennt das sicher, Ideen sind immer mehr da 
als Zeit um sie alle zu 100% zu realisieren - ich mache dann lieber 
weniger und dafür aber fertig, auch wenn Verlockungen überall "lauern".

Vielen Dank für die Erklärungen und die sehr hilfreichen Tips.

Gruß,
TS

von Mitleser (Gast)


Lesenswert?


von Werner (Gast)


Lesenswert?

Thorsten S. schrieb:
> 1)draw_cube (x,y,z,size) oder ähnlich (vielleicht auch winkel o.ä.
> angeben.

So einfach wird's nicht gehen. Alleine um Position und Orientierung im 
Raum zu beschreiben, brauchst du 3+2 Parameter. Außerdem mußt du noch 
die Perspektive festlegen.
http://de.wikipedia.org/wiki/Perspektive

von Thorsten S. (whitejack) (Gast)


Lesenswert?

@Mitleser:

"der is gut" - steck viel wares drin.

@Karl Heinz:

ich erwische mich selbst sehr oft in Ungeduld wenn wieder mal jemand 
eine LED Matrix bauen will und nach der Berechnung des Vorwiderstandes 
für eine LED fragt. Ich danke dir für deine Geduld und das immer 
vorhandene Einfühlungsvermögen zur Ursache solcher Fragestellungen.

An der Stelle habe ich mich, zu meinem Bedauern, voll vergriffen mit der 
Einschätzung der Komplexität wie ich auch bereits erwähnt habe.

Gruß,
TS

PS.: @ Werner: 3D Darstellung ist ein sehr interessantes Thema. Ich habe 
vor Jahren viel in der Zwei-Fluchpunktperspektive und der Isometrischen 
Darstellung gezeichnet. Als dann die Farge aufkam wie ich real 
existierende Maße, wenn ich z.B. eine Kühe gezeichnet habe, in die 
Ein-Fluchtpunktperspektive transformiere waren immer alle überfragt - da 
gabs aber auch noch kein ausgereiftes Internet und ich war erst 14 
Jahre.

von Xaero80C51 (Gast)


Lesenswert?


von Ingo (Gast)


Lesenswert?

Wenn du den Würfel nur drehen willst, dann nimm doch fertige Bilder und 
gebe diese aus.

von Thorsten S. (whitejack) (Gast)


Lesenswert?

@Xaero80C51

danke, das sieht ja noch einigermaßen übersichtlich aus.

@Ingo

das wäre zu "einfach", wenn dann richtig :-)

TS

von Schiko (Gast)


Lesenswert?

Das wäre eine Gelegenheit alte Pseudo-3D Geschichten wieder 
herauszukramen..

Eine von vielen Möglichkeiten:
-Diskreter Satz an gegebenen Perspektiven
-Für jede diskrete Perspektive gibt es eine
 Funktion: ScreenPt = Pt3DToScreen( x,y,z)

Bei geschickter Wahl der Perspektiven und isometrischer
Darstellung kommt man in der Funktion Pt3DToScreen(..)
mit Multiplikationen und Shift-Operationen aus.

..und ja: eine Linie per Bresenham-Algorithmus zu "verpixeln"
sollte ertse Wahl sein.
Und wie Ingo schrieb: Wenn es kompliziertere Strukturen sind,
gib vorgefertigte Bilder aus.

Solltest Du aber eine OpenGl-Implementation für 'nen 8-Bit AVR
finden, die nur wenige k Speicher benötigt, lass es uns wissen.

von Thorsten S. (whitejack)


Angehängte Dateien:

Lesenswert?

Hi,

habe mich eben mal ran gesetzt und einfach nur mal ein Quadrat und ein 
paar Striche gezeichnet - mal abchecken ob es sich lohnen würde da was 
mit "Gehalt" zu implementieren...

Mal sehen.

TS.

von Karl (Gast)


Lesenswert?

Michael schrieb:
> Leute mit dieser Einstellung bestätigen mir immer wieder, weshalb ich
> meine Bibliotheken nicht open source machen sollte. Vielen Dank dafür
> und viel Spass beim Suchen.
Deine Lehrer/Dozenten, große Mathematiker und Philosophen hatten 
glücklicherweise eine andere Einstellung zu diesem Thema. Sonst wären 
wir immer noch im Mittelalter und die Alchimisten würden sich weiterhin 
gegenseitg eifersüchtig belauern und ausspionieren ob nicht jemand eine 
Formel zur Produktion von Gold gefunden hat und ab und an mal eine Hexe 
verbrennen.

Wissen vermehrt sich dadurch, dass es weitergegeben wird und Kultur lebt 
davon, dass man auf die Arbeit/Ideen eines Vorgängers aufsetzt bzw. 
diese weitertreibt und etwas neues darauf schafft.
Wenn jeder erst mal einen Compiler nebst C-Library schreiben würde bevor 
er sein eigentliches Programm schreibt, dann wird er nie fertig.

von Tier (Gast)


Lesenswert?

Karl schrieb:
> Alchimisten
trotzdem Alchemisten

> ob nicht jemand eine
> Formel zur Produktion von Gold gefunden hat
naja, wäre das nicht so, hätten wir vermal nicht mal Porzellan :-)

von Jobst M. (jobstens-de)


Lesenswert?

Für jede Ecke deines Würfels setzt Du einen 3D-Vektor.
Nun benötigst Du eine Funktion, mit der Du den 3D-Vektor in eine 
Raumkoordinate überführst. (Also sin und cos)
X und Y sind die Koordinaten auf dem Bildschirm, Z kann zur Skalierung 
benutzt werden (hinten klein, vorne groß)

Um den Würfel zu drehen, mußt Du alle Vektoren in die selbe Richtung 
drehen.

Dann kannst Du eine neue Ausgabe berechnen und ausgeben.

Wenn man die trigonomischen Funktionen durchschaut hat, sollte das 
eigentlich kein Problem darstellen.
Das habe ich mit 15 schon auf dem Amiga gemacht. :-)


Gruß

Jobst

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Tier schrieb:
> Karl schrieb:
>> Alchimisten
> trotzdem Alchemisten

Nein, die Schreibweise mit zwei i ist nicht nur verbreitet, sondern auch 
zulässig.

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.