3D Transformationen

OP #1772310
Lesenswert?

Hallo,
ich könnte ein paar Ideen zu 3D Transfomartionen brauchen :)

Ich hab 8x8x8 "Pixel" in 64 Bytes organisiert.

Ich habe ein klein wenig Ahnung von 3D Transformationen, von Matrizen 
aber sowieso ;)

Allerdings ist mir nicht ganz klar, wie ich das ganze sinnvoll und 
"performant" machen kann.
Folgende Überlegungen hab ich bisher angestellt:
Um eine Rotation machen zu können, brauche ich eine 8x8x8 Matrix aus 
Festkommawerten.
Dann muss ich meine Datenstruktur mit dieser Matrix multiplizieren. Das 
ganze wird ziemlich teuer und groß, wenn ich meine Datenstruktur in eine 
Matrix konvertiere und diese dann gegen die Rotationsmatrix (und dann ja 
noch andere Transformationsmatrizen).

Verschiebungen kann ich ja noch durch Bitshiftereien lösen, aber drehen, 
skalieren, ...?

Das Ganze spielt auf nem Atmega.

Gruß
Mr.Green
Gast #1772708
Lesenswert?

Float?? das geht auch mit Festkomma-Arithmetik.

Ich nehme an, du willst mit einem Byte jeweils einen bestimmten 
Zahlenraum abbilden.  Hier gehe ich mal von -1 bis +1 aus. -128 bildet 
also "-1" ab, 0 ist die "0" und 127ist dann (127/128) = 0.9921875.
Zwei Zahlen (signed char) werden Multipliziert und dann das Ergebnis um 
7 geschoben. So passt es dann auch wieder in ein signed 8bit rein. 
Zuviele Multiplikationen machen allerdings das Ergebnis klein und 
rundungsfehler-behaftet.

Du könntest auch mit "Minifloats" Arbeiten. Dazu deine Matrizen doppeln 
und in einer Matrix die Mantisse, in der anderen die Exponenten 
speichern. Nun wie gewohnt die Mantissen Multiplizieren. Danach nach 
hinten schieben bis das ganze wieder in Float rein passt. Die Anzahl der 
Schiebungen nach hinten muss dann auf die Summe der Exponenten beider 
Multiplikatoren dazugerechnet werden.

Bei Additionen muss eine Unterscheidung eingebaut werden, ob einer der 
beiden Summanden zu klein ist(zu kleinen Exponenten aufweist), um das 
Ergebnis überhaupt noch zu beeinflussen. Als Referenz muss 
logischerweise die Zahl mit dem Größeren Exponenten genommen werden.

\0
#1773204
Lesenswert?

Moin Chris,

kannst Du Dich auf wenige mögliche Drehungen um die Mitte beschränken?
Dann reichen Dir je nach Drehung verschieden große "Offsettabellen" wenn 
Du die Symmetrien ausnutzt und mit Fallunterscheidungen arbeitest.

Mit den einfachsten Drehungen beginnend:

Für 90°,180° brauchst Du keine Tabelle, nur Fallunerscheidung für jede 
Achse

Für 45° um eine Koordinatenachse reichen 4x4 Werte a 3+3 Bit, (mehr als 
3 Pixel kann sich kein Wert verschieben)
Pseudocode ohne Bitshifterei:
 NeueMatrix[x][y][z] = UrsprungsMatrix[x + OffsAusTabelle[i]][y + 
OffsAusTabelle[i+1] ][z]

usw.

Und die Wertetabellen erstellt Du vorher.

Schiko

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren