Drehung und Projektion einer Ebene.

  • VB.NET
  • .NET 4.5

Es gibt 35 Antworten in diesem Thema. Der letzte Beitrag () ist von Bartosz.

    Drehung und Projektion einer Ebene.

    Hallo zusammen,
    ich möchte als Allererstes das Ziel des Programms erläutern und dann komm ich zum eigentlichen Problem, was ich gerade entdeckte...


    Mathelastig!

    Ich habe eine Ebene
    $E: \overrightarrow{x} = (0|0|0) + s·(1|0|0) + t·(0|1|0)$
    , liegt also in der xy-Ebene. Vorzeichenkonvention: +x geht nach rechts, +y nach oben und +z geht aus der Zeichenebene heraus.

    Nun habe ich die Ebene um die y-Achse gedreht, mithilfe der Drehmatrix, also

    Quellcode

    1. cos(α) 0 sin(α) 1
    2. 0 1 0 * 0
    3. -sin(α) 0 cos(α) 0

    Das ergibt, wenn man die Zahlen bei 1 belässt:

    Quellcode

    1. cos(α)
    2. 0
    3. -sin(α)

    Eine Drehung um beispielsweise 20° gibt uns dies (in diesem Online-Tool gezeichnet):

    Das kann ich mit meinem Programm auch berechnen. Ich habe gestern und heute an der Projektion gesessen. Wie man hier sieht, wird die gekippte grüne Ebene links (also dort wo sie höher ist) größer dagestellt und rechts, wo sie niedriger ist, kleiner. Das ist logisch. Ich kam gestern und heute allerdings nicht auf die Formel also wie viel breiter / dünner die Ebene aussieht (in y Richtung). Ich habe nun das Ganze mit einem Sinus angenähert. Diese Annäherung kommt mir sinnvoll vor, da der Effekt des Breiterwerdens bei kleinen Winkel größer ist und bei großen Winkel (fast senkrechte Ebene) kleiner wird. Für die andere Richtung nehme ich den cos, da der Effekt andersherum ist. Da ich den genauen Sachverhalt nicht kenne, multipliziere ich das mit einem Justierfaktor.
    Da ich die Zahlen bei 1 belassen habe, multipliziere ich mit einem Vergrößerungsfaktor.
    Ich berechne nun 8 Punkte für die 4 Linien und zeichne sie.

    Für die, die neu sind und das nicht wissen: Im Gegenzug zum Online-Tool läuft +y in VB.Net nach unten! Daher muss ich im Code das umgekehrte Vorzeichen verwenden.
    Drehung um die y-Achse

    VB.NET-Quellcode

    1. Public Sub um_y_drehen(ByVal dtheta As Double)
    2. Theta += dtheta
    3. If Theta > 90.0 OrElse Theta < (-90.0) Then Return
    4. 'Dim urspruengliche_Groesse_X As Double = AB.X * enlargement_factor
    5. 'Dim urspruengliche_Groesse_Y As Double = AC.Y * enlargement_factor
    6. 'Dim rad As Double = Theta * Math.PI / 180.0
    7. AB = New Vector3D(Math.Cos(Theta * Math.PI / 180.0), AB.Y, -Math.Sin(Theta * Math.PI / 180.0))
    8. Linie_links(0) = New PointF(CSng(-(Justierfaktor * Math.Cos(Theta * Math.PI / 180.0) + AB.X * enlargement_factor)),
    9. CSng(Justierfaktor * Math.Sin(Theta * Math.PI / 180.0) + AC.Y * enlargement_factor))
    10. Linie_links(1) = New PointF(CSng(-(Justierfaktor * Math.Cos(Theta * Math.PI / 180.0) + AB.X * enlargement_factor)),
    11. CSng(-(Justierfaktor * Math.Sin(Theta * Math.PI / 180.0) + AC.Y * enlargement_factor)))
    12. Linie_oben(0) = Linie_links(1)
    13. Linie_oben(1) = New PointF(CSng(-Justierfaktor * Math.Cos(Theta * Math.PI / 180.0) + AB.X * enlargement_factor),
    14. CSng(-(-Justierfaktor * Math.Sin(Theta * Math.PI / 180.0) + AC.Y * enlargement_factor)))
    15. Linie_rechts(0) = Linie_oben(1)
    16. Linie_rechts(1) = New PointF(CSng(-Justierfaktor * Math.Cos(Theta * Math.PI / 180.0) + AB.X * enlargement_factor),
    17. CSng(-Justierfaktor * Math.Sin(Theta * Math.PI / 180.0) + AC.Y * enlargement_factor))
    18. Linie_unten(0) = Linie_rechts(1)
    19. Linie_unten(1) = Linie_links(0)
    20. FormMain.Label_Theta.Text = "θ = " & Math.Round(Theta, 0).ToString(Deu).PadLeft(2, "0"c) & " °"
    21. FormMain.PictureBox1.Invalidate()
    22. End Sub



    Das sieht optisch ganz gut aus (zumindest plausibel):



    Meine Fragen wären nun:
    1.) Könnte mir bitte jemand sagen oder erklären, wie ich diese Projektion korrekt auszuführen habe, also wie die Formel ist? Ich habe schon bei math.stackexchange.com gefragt, aber da kriegst ja keine Antwort. Wahrscheinlich ist das für die zu trivial.

    2.) Wie ihr an den auskommentierten Code-Zeilen (Zeilen 5-7) seht, habe ich versucht, die Variablen anzulegen und die Werte zwischenzuspeichern, damit nicht immer wieder derselbe Wert berechnet wird. Das Ganze wird leider ungenau. Bei 90° habe ich nicht die seitliche Kante der Ebene gesehen, sondern es sah so aus, als wäre sie nur um 85° gekippt. Wie kann das sein? Kann mir das jemand bezüglich Speicher erklären? Warum macht es so einen gravierenden Unterschied, ob ich dies schreibe
    Linie_links(0) = New PointF(CSng(-(Justierfaktor * Math.Cos(Theta * Math.PI / 180.0) + AB.X * enlargement_factor)),
    oder das?
    Linie_links(0) = New PointF(CSng(-(Justierfaktor * Math.Cos(rad) + urspruengliche_Groesse_X)),

    3.) Mischdrehung - und projektion
    Joa, und für die Drehung um die x-Achse verhält sich das andersherum, also sin und cos umplatzieren:

    Drehung um die x-Achse

    VB.NET-Quellcode

    1. Public Sub um_x_drehen(ByVal dphi As Double)
    2. Phi += dphi
    3. If Phi > 90.0 OrElse Phi < (-90.0) Then Return
    4. Dim urspruengliche_Groesse_X As Double = AB.X * enlargement_factor
    5. Dim urspruengliche_Groesse_Y As Double = AC.Y * enlargement_factor
    6. Dim rad As Double = Phi * Math.PI / 180.0
    7. AC = New Vector3D(AC.X, Math.Cos(rad), Math.Sin(rad))
    8. Linie_links(0) = New PointF(CSng(-(Justierfaktor * Math.Sin(-rad) + urspruengliche_Groesse_X)),
    9. CSng(-Justierfaktor * Math.Cos(rad) + urspruengliche_Groesse_Y))
    10. Linie_links(1) = New PointF(CSng(-(Justierfaktor * Math.Sin(rad) + urspruengliche_Groesse_X)),
    11. CSng(-Justierfaktor * Math.Cos(rad) - urspruengliche_Groesse_Y))
    12. Linie_oben(0) = Linie_links(1)
    13. Linie_oben(1) = New PointF(CSng(Justierfaktor * Math.Sin(rad) + urspruengliche_Groesse_X),
    14. CSng(-Justierfaktor * Math.Cos(rad) - urspruengliche_Groesse_Y))
    15. Linie_rechts(0) = Linie_oben(1)
    16. Linie_rechts(1) = New PointF(CSng(Justierfaktor * Math.Sin(-rad) + urspruengliche_Groesse_X),
    17. CSng(-Justierfaktor * Math.Cos(rad) + urspruengliche_Groesse_Y))
    18. Linie_unten(0) = Linie_rechts(1)
    19. Linie_unten(1) = Linie_links(0)
    20. FormMain.Label_Phi.Text = "ϕ = " & Math.Round(Phi, 0).ToString(Deu).PadLeft(2, "0"c) & " °"
    21. FormMain.PictureBox1.Invalidate()
    22. End Sub

    Das gibt uns:


    Leider ist damit keine Mischdrehung und -projektion möglich. Ich weiß, das sind bestimmte Matrizen, aber ich habe mit diesem Thema leider Schwierigkeiten, das Richtige im Netz zu finden. (Ich habe das Gefühl, darüber wird sehr selten gesprochen; entweder, man findet nix oder man findet Doktorarbeiten). Auch, wenn ich Mathe I und II hatte und mich mit Ebenen auskenne und ich ein gutes, räumliches Denkvermögen habe und mir nun einen provisorische Zusammenhang erdenken konnte – diese Projektionsgeschichten haben wir nie gemacht. Ich habe mir vor 2 Tagen ein Video von Prof Loviscach angesehen und bin jetzt dabei, mir das Thema selbst beizubringen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bartosz“ () aus folgendem Grund: besseres Verständnis. Die bunten Bilder kommen von einem Online-Tool.

    @Bartosz Eine Ebene ist durch 3 Punkte definiert, die nicht auf einer Geraden liegen.
    Stell mal Deine Mathematik um: Trenne Daten und GUI.
    Nimm Dir eine Vector-Klasse (aus dem Framework oder eine eigene).
    Rechne in Double und konvertiere diese Double-Werte nur zur Darstellung in In Integer.
    Stelle zunächst nur die Ebenen-Punkte selbst dar und verfolge, wie sie sich bei Drehung bewegen.
    x-y ist klar, belege z mit einem dynamisch größeren oder kleineren Radius je nach oben/unten.
    Wenn Dir das logisch ist, mach Dir eine Darstellungsklasse, die eine Ebene so darstellt, wie Du es haben willst.
    Visualisiere jeden einzelnen Schritt und überprüfe, ob das Bild so richtig ist.
    Dann solltest Du selbst das Problem lösen können.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Bartosz Diese Class_Ebene (Name: Brrrrrrrrrrrrr 8| ) sollte etliche Member der Klasse Vector haben.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Also, ich habe ja gesagt, das optische Breiterwerden / Dünnerwerden istgleich die Originalbreite plus / minus einen Sinus des Winkels (mal einem Faktor). Als Näherung.


    Mir ist Folgendes aufgefallen, was passiert, wenn ich eine Mischdrehung habe. Die blaue Ebene ist die originale. Die rote wurde um 20° um die x-Achse gedreht. Die rosane 20° um die y-Achse. Die grüne wurde an beiden Achsen um 20° gedreht. Wenn ich mir das so anschaue (und beide Winkel positiv sind), dann sind die 4 Ecken der grünen Ebene die Summe der roten Ebene und rosanen Ebene (fast).



    Also habe ich eine Prozedur geschrieben, mit der ich beide Winkel drehen und das Ganze projizieren kann. Ich habe die Rechnungen auch gekürzt.
    Wenn beide Winkel klein genug sind, ist das Ergebnis OK. Wenn beide Winkel groß sind, das gibt's komische Kurven. Es ist einfach kein genügender Ansatz. Sin und Cos kommen sich da in die Quere. Aber immerhin bin ich weiter als vor 2 Tagen.
    Ich habe auch versucht, verschiedene Justagefaktoren zu nutzen – einen für x und einen für y. Hilft nicht.





    Ich lade mal das Projekt hoch. Vielleicht hat noch jemand ne Idee. Ich mach für heute Schluss.
    Dateien

    Bartosz schrieb:

    Wenn beide Winkel klein genug sind, ist das Ergebnis OK.
    Das ist wahrscheinlich eine Frage der Reihenfolge der Operationen.
    Bei Drehungen um kleine Winkel ist die Reihenfolge egal.
    Vielleicht solltest Du da mit Kugelkoordinaten und Eulerwinkeln arbeiten.
    Deinen Code seh ich mir mal an.
    ====
    Wie bekomme ich da mehrere Ebenen angezeigt?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RodFromGermany“ ()

    Bartosz schrieb:

    Gute Frage, noch gar nicht, aber bau ich heute ein.
    Wo kommen denn dann Deine bunten Bilder her?
    Ja, die Euler-Winkel sind etwas blöd aber recht praktikabel.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Oh, Rod, das geschah online . Das ist die Krux! Ich musste aus dem Online-Tool abgucken, wie ich die Projektion zu machen habe. Sorry, da hätte ich genauer sein müssen.
    matheretter.de/geoservant/de

    Gib in dem kleinen Feld dies ein, da hast du die Ebenen, über die wir gestern gesprochen habe

    ebene(0|0|0 1|0|0 0|1|0)

    ebene(0|0|0 0,9397|0|-0,34 0|0,9397|0,342)

    ebene(0|0|0 1|0|0 0|0,9397|0,342)

    ebene(0|0|0 0,9397|0|-0,34 0|1|0)

    Und ich dachte, dein "Wie bekomme ich da mehrere Ebenen angezeigt? " wäre ne rhetorische Frage gewesen
    @Bartosz Kann ich erst zu Hause machen.
    Ich dachte, das sind Deine Bilder, Ich bin der Mensch, der immer sehen muss, was passiert. ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Bartosz Ich habe hier kein Studio 19 und kein Framework 4.8.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi.
    Unterliegt das nicht der Regel von Translation gefolgt von Transormation?

    Erst versetzen, dann verformen?

    Hab ich mal irgendwo aufgeschnappt...
    ...trifft das das in diesem Fall auch zu?

    c. u. Joshi
    Hi @Joshi,
    Ich bin mir nicht sicher, ob ich dich richtig verstehe. Daher fasse ich nochmal zusammen, bevor ich antworte:
    Eine geometrische Transformation ist eine Bewegung einer Punktmenge, also eine Art Umrechnung. Zum Beispiel in meinem Fall durch eine Rotationsmatrix, die das kann, wird eine Ebene gedreht.
    Offtopic
    Transformation gibt es auch in der Bildbearbeitung (ein Bild stretchen, scheren, rotieren, schiefes Rechteck gerade biegen etc pp). Dort wird auch mit Matrizen, Skalierungen, Winkeln und Pythagoras gearbeitet.




    Eine Translation ist nur eine Verschiebung. Ich glaube, ich weiß, worauf du hinaus willst. Die gedrehte Ebene erscheint dem Betrachter, der das perspektivisch sieht, größer, siehe erstes Bild in meinem Post
    6. Juli 2021, 19:11 Ebene Bild3.png die rote und gelbe Schraffur.

    Genau, ich will die Ebene nun so projizieren, dass der Betrachter sieht, sie wird gedreht. Dazu muss für unser Gehirn die Ebene mit steigendem Winkel / steigender Drehung sukzessive zu einem Trapez gezeichnet werden. Und dazu finde ich keine Formeln / Zusammenhänge. Sind bestimmt irgendwelche Strahlensatzgeschichten. Oder komlexere Sin/Cos/Tan -Kombinationen. Weil es auch auf die Betrachtungshöhe ankommt. Aber die sei in meinem Programm erstmal konstant.




    Ich ändere mal den Titel, denn das mit den ungenauen Ergebnissen, die auftreten, wenn man eine Variable zwischenspeichert, ist wohl Sache der Sprache; und ich kann nichts tun, oder?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bartosz“ ()

    Ich habe heute einen Fortschritt gemacht. Diesen möchte ich gerne mit euch teilen.
    Ich habe mir dieses Video angesehen. Hier geht es zusammengefasst darum, dass ein Vektor mit beliebiger Richtung auf einer Ebene sitzt / aus ihr heraussticht und man möchte nun den Schatten, den er wirft, zeichnen. Dies wird mit folgender Formel gemacht:

    $$\displaystyle\frac{\overrightarrow{k} \cdot \overrightarrow{N}}{|\overrightarrow{N}|^{2}} \cdot \overrightarrow{N}$$

    und dann
    $$\overrightarrow{k} - \overrightarrow{N}$$

    und das ist der Vektor, wie man ihn zeichnen muss.
    Ausführlich:
    Stellt euch vor, ihr habt diese Ebene mit der Form
    $$= (0|0|3) + s·(1|0|-1) + t·(0|1|0)$$

    Nun bildet man ihren Normalenvektor
    $\overrightarrow{N}$
    . Für die, die es nicht wissen: Das ist der Vektor, der senkrecht auf der Ebene steht. Diesen findet man, wenn beide Richtungsvektoren der Ebene mit ihm multipliziert = 0 werden.
    $$ \begin{bmatrix} x \\ y \\ z \end{bmatrix} \cdot \begin{bmatrix} 1 \\ 0 \\ -1 \end{bmatrix} = x - z $$
    und
    $$ \begin{bmatrix} x \\ y \\ z \end{bmatrix} \cdot \begin{bmatrix} 0 \\ 1 \\ 0 \end{bmatrix} = y $$

    Diese beiden in ein Gleichungssystem tun:
    $$ \begin{cases} x - z = 0\\ y = 0 \end{cases} $$

    Das nach x, y und z auflösen ergibt: x = x; y = 0; z = x; folglich ist
    $\overrightarrow{N} = \begin{bmatrix} 1 \\ 0 \\ 1 \end{bmatrix} $
    .

    Der beliebige Vektor
    $\overrightarrow{k_2}$
    sei mal
    $$ \begin{bmatrix} 5 \\ -4 \\ 6 \end{bmatrix}$$

    Mit der oben genannten Formel ergibt sich für den projizierten Vektor:

    $$\begin{bmatrix} -2 \\ -4 \\ 2 \end{bmatrix}$$
    . Dies wird einmal grafisch mit einem Onlinetool dargestellt. Ich habe N verlängert auf 4|0|4, damit man was sieht. Ich habe die Ansicht so eingestellt, dass wir auf die Pfeilspitze von
    $\overrightarrow{N}$
    schauen, also senkrecht auf die Ebene. Nun ist es natürlich so, dass dieses Onlinetool alles bereits in 3D darstellt aber stellt euch vor, ihr müsstet mit Bleistift & Papier eine technische Zeichnung machen von einer Linie, die irgendwann aus dem Blatt herauskommt. Dafür ist diese Formel da. Denn die Linie muss ja so gezeichnet werden, wie "Shadow2" auf dem Bild aussieht.

    Rechts auf dem Bild ein anderes Beispiel: unser Vektor
    $\overrightarrow{k}$
    sei
    $$\begin{bmatrix} 4 \\ 4 \\ 4 \end{bmatrix}$$
    so dass sich ein projizierter Vektor von
    $$\begin{bmatrix} 0 \\ 4 \\ 0 \end{bmatrix}$$
    ergibt. Wie man sieht, würde
    $\overrightarrow{k}$
    aus der Papierebene herauskommen, "Shadow" ist die plattgedrückte Projektion.
    Für mehr Verständnis könnt ihr gerne hier schauen:
    https://www.matheretter.de/geoservant/de
    und dies eingeben
    vektor(0|0|0 4|0|4 "N")
    vektor(0|0|0 4|4|4 "k")
    vektor(0|0|0 0|4|0 "shadow")
    ebene(0|0|3 1|0|2 0|1|3)

    vektor(0|0|0 2|-4|6 "k2")
    vektor(0|0|0 -2|-4|2 "shadow2")


    Ja, jetzt muss ich das Ganze auf mein Anfangsproblem übertragen. Ich könnte mir vorstellen, ich löse das so (Pseudocode):

    - In meinem Programm kann ich die Ebene mittels Drehmatrix drehen
    -
    $\overrightarrow{N}$
    dreht sich natürlich immer schön mit
    - die seitlichen Begrenzungen meiner Ebene seien k1 bis k4. Und dann mal gucken.


    Wie kann ich im Code an
    $\overrightarrow{N}$
    bekommen? Zahl mutlipliziert mit Buchstabe ist ja etwas schwierig ne

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bartosz“ ()

    @Bartosz Das was Du vorhast, ist schon eine recht komplizierte mathematische Angelegenheit. Wenn ich vor so einer Aufgabe stehen würde, würde ich auf Direct2D zurückgreifen und das ganze mit einem "3D perspective transform effect" erledigen. docs.microsoft.com/en-us/windo…/3d-perspective-transform Das ganze schaut dann in etwa so aus wobei hier für eine Ebene ein Bild verwendet wird. Die entsprechenden Parameter (VECTOR2F/VECTOR3F) für die 3D Perspektive werden unten per Scrollbars eingestellt und an das entsprechende D2D13DPerspectiveTransform-COM-Interface übergeben.
    Bilder
    • D2D1_3DPerspective.png

      280,35 kB, 1.410×792, 28 mal angesehen
    Mfg -Franky-
    Hi, ich nochmal...

    Translation. Es ist eine Verschiebung der Punkte.
    Besser ist zu sagen es ist ein Versetzung/Übersetzung (Englisch translate).

    "Das Fähr/divers setzte über den Fluß..."
    "Die Fähfrau setzte über den Fluß..." (Gendern nicht vergessen)

    Es ist was anderes (auch mathematisch) als eine Transformation (gogo gadgeto, oder was riefen die Transfomers immer?).

    Wenn ein Würfel (matrifiziert) erst Transformiert wird und dann Translatiert entsteht mir den Matrizen-Formeln, eine neue Form.

    So in etwa ist das wie ich das verstanden habe.

    Hat der so komisch erklärt. (Is kein Erklärbär, halt Mathematiker...)

    youtube.com/watch?v=vQ60rFwh2ig mit dem Titel
    The True Power of the Matrix (Transformations in Graphics) - Computerphile

    Wie ich das in WPF 3D zu hauf gesehen und (falsch Programmmiert) habe, ist erst zu versetzen/bewegen dann zu drehen/verformen.
    Deswegen haben die sogar eine eigene Klasse mit der Reihenfolge geschaffen.

    docs.microsoft.com/de-de/dotne…atetransform?view=net-5.0




    Mehr Mathe kann ich nicht.
    Matrix wird nur noch geguckt, nicht mehr gerechnet...

    Weiterhin viel erfolg und spass mit Neo und Morpheus...

    c.u. Joshi aus der Matrix. :love:
    Hi @Joshi Danke für das Video, Computerphile ist immer super! Transformation ist in dem Kontext nur der Überbegriff für 1) Skalierung (Streckung) 2) Drehung (Rotation) 3) Verschiebung (Translation). Der Herr im Video erklärt den Sinn der Matrix echt super. Er sagt, eine Matrix hat den immensen Vorteil, dass weniger Rechenleistung für mehr Rechenoperationen gebraucht wird. Man kann eine Transformation nach der anderen ausführen (einfach mehrere Matrizen hintereinander verketten, also multiplizieren). Und wenn du gleich weißt, was du willst, kannst du die Ziffern in eine Matrix schreiben. Das einzige „Problem“, was er angemerkt hat, ist, dass eine 2x2 Matrix nicht Translation ausführen kann ( = das übersetzen, wie du es meinst). Einfach aufgrund er Mathematik.
    $$ \begin{pmatrix} a & b \\ c & d \end{pmatrix} \cdot \begin{pmatrix} x \\ y \end{pmatrix} = \begin{pmatrix} a \cdot x + b \cdot y \\ c \cdot x + d \cdot y \end{pmatrix} $$

    Die Komponenten werden mulitpliziert, keine Möglichkeit zu addieren, was für eine Translation gebraucht würde. Daher wird eine 3x3 Matrix genommen. Diese Extra-Dimension sorgt dafür, dass C und F zwar nur mit 1 multipliziert werden, aber auch zu den anderen Komponenten addiert werden.

    $$ \begin{pmatrix} a & b & c \\ d & e & f \\ 0 & 0 & 1 \end{pmatrix} \cdot \begin{pmatrix} x \\ y \\ z \end{pmatrix} = \begin{pmatrix} a \cdot x + b \cdot y + c \\ d \cdot x + e \cdot y + f \\ z \end{pmatrix} $$

    Was nun passiert, ist, diese 3-dimensionelle Matrix schert des Herrns 2D-Fläche in der 3D-Welt, aber auf 2D gesehen sieht es so aus, als wäre es eine Translation. Heftig – das wusste ich auch noch nicht.
    Für Bewegungen, die in 3D sichtbar sein sollen, nimmt man eine 4D-Matrix und schert das Objekt dort und der „Schatten“ hat den Effekt von einer Translation im 3D-Raum.

    Danke für deine Erklärung mit dem Floß über den Fluss. So habe ich Übersetzung nach gar nicht gesehen.


    @-Franky- Danke für den Link. Wie kann ich das einbauen / aufrufen? Hast du ein kleines Beispiel?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bartosz“ ()

    @Bartosz In der 3er Ergebnismatrix muss unteren statt der 1 ein z stehen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!