3D Transformation

  • VB.NET

Es gibt 44 Antworten in diesem Thema. Der letzte Beitrag () ist von hugoboss28.

    Schau dir die Dokumentation an: msdn.microsoft.com/de-de/library/mt598337(v=vs.111).aspx

    Der zweite Parameter ist das Ergebnis des Invertierens.

    In C# sieht das z.B. so aus:

    C#-Quellcode

    1. if(Matrix4x4.Invert(rotationsMatrix, out var invertedMatrix)) { /* tu was mit invertedMatrix */ }

    Und dann kannst du invertedMatrix als deine invertertierte Matrix weiter nutzen. In VB geht das mit dem out nicht, du musst glaub ich eine leere Matrix anlegen und die als zweiten Parameter angeben, aber not sure, weil ich kein VB kann. In VB ist es mit <OutAttribute> und ByRef deklariert. Also müsste es so klappen.
    Die Funktion liefert einen bool ob die Invertierung erfolgreich war, das eigentliche Ergebnis bei erfolgreicher Invertierung muss mit dem [Out] Parameter benutzt werden.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „seh“ ()

    hugoboss28 schrieb:

    klar, logisch. wenn man um verschiedene Achsen rotieren will sollte man zuerst alle rotationsberechnungen durchführen und zum schluss die Translation.
    Ggf. Missverständnis.
    Ich meinte die Rotationsachsen zueinander.
    Nimm zwei Würfel und lege sie in gleicher Ausrichtung vor Dich nebeneinander.
    Links mach folgendes:
    Zuerst Rotation um die senkrechte z-Achse 90° im Uhrzeigersinn.
    Danach Rotation um die x-Achse (Achse durch beide Augäpfel) nach hinten.
    Rechts mach dies un der anderen Reihenfolge:
    Zuerst Rotation um die x-Achse (Achse durch beide Augäpfel) nach hinten.
    Danach Rotation um die senkrechte z-Achse 90° im Uhrzeigersinn.
    Betrachte beide Würfelbilder. 8o
    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!
    der Rückgabewert dieser Funktion ist ein bool, der angibt ob die Matrix erfolgreich invertiert wurde.
    Der zweite Wert hingegen ist ein sogenannter out-Parameter, bzw. für VB.Net eben ByRef. D.H. du musst da eine Variable vom Typ Matrix4x4 übergeben, welche die invertierte Matrix enthalten soll
    Edit: zweite Seite ganz übersehen
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    @RodFromGermany

    Danach Rotation um die x-Achse (Achse durch beide Augäpfel) nach hinten.


    Meine Tochter meinte gerade " Wie soll das gehen???? Ich bin doch kein Cameleon" :thumbsup:

    Wenn beide Objektkoordinaten an den würfeln gleich angebraucht sind, die Würfel auf dem Tisch liegen und x,y,z Richtung = x', y', z' Richtung dann gilt verkehrte Transformationsberechnung ergibt ein unterschiedliches Würfelbild.
    Dass meintest du doch oder?

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

    hugoboss28 schrieb:

    Dass meintest du doch oder?
    Jou.
    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!
    @hugoboss28 Was haben Deine experimentellen Tests ergeben?
    Das Zauberwort heißt Eigeninitiative. ;)
    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!
    Hallo allerseits,

    gegeben sind drei 4x4 rotationsmatritzen rx,ry,rz
    das ausmultiplizieren zweier Matritzen (4x4) erfolgt mit der Anweisung Matrix4x4.Multiply(rx,ry).
    Gibt es eine Möglichkeit drei oder mehr matritzen in einem zug auszumultiplizieren?

    Wie verhält sich der Operator * bei matritzen?
    wird jedes element der ersten matrix mit dem gleichen element der zweiten matrix multipliziert oder ist es eine richtige Matrixmultiplikation ( Zeilen mal Spalten usw.)?
    ist derselbe wie bei Matrix4x4.Multiply, greift am ende beides auf denselben Code zurück. Um mehrere miteinander zu multiplizieren machst du einfach dasselbe wie wenn du normale Zahlen miteinander multiplizierst und schreibst rx*ry*rz, wichtig ist dabei jedoch die Multiplikationsreihenfolge, welche davon abhängt ob die Matrix Column-Major oder Row-Major ist. Bin mir relativ sicher, dass die hier in Row-Major ist...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Hallo Leute,

    bin mittlerweile am verzweifeln.
    Ich versuche seit langem einen Basiswechseltransformation im R^3 zu realisieren.
    Gegeben sind zwei Basen im R^3. Beide Basen sind bezüglich Welt bekannt.
    Beide Basen haben bezüglich Welt verschiedene Orientierungen (z.B. Basis1 Rz -179 Ry 3 Rx 1, Basis2 Rz -176 Ry 5 Rx 2)
    Nun will ich den Vector herausfinden der vom Ursprung der Basis2 zur Basis1 zeigt.

    Soweit bin ich schon gekommen:



    'Basis1 Koordinaten bezüglich WELT
    'base1.x = 4
    'base1.y = 4
    'base1.z = 20
    'base1.a = 120
    'base1.b = 5
    'base1.c = 20

    'Basis2 Koordinaten bezüglich WELT
    'base2.x = 2
    'base2.y = 2
    'base2.z = 10
    'base2.a = 120
    'base2.b = 5
    'base2.c = 20

    v_basis1.X = base1.x
    v_basis1.Y = base1.y
    v_basis1.Z = base1.z

    v_basis2.X = base2.x
    v_basis2.Y = base2.y
    v_basis2.Z = base2.z

    x_diff = base1.x - base2.x
    y_diff = base1.y - base2.y
    z_diff = base1.z - base2.z
    a_diff = base1.a - base2.a
    b_diff = base1.b - base2.b
    c_diff = base1.c - base2.c

    txtRotA.Text = Convert.ToString(a_diff)
    txtRotB.Text = Convert.ToString(b_diff)
    txtRotC.Text = Convert.ToString(c_diff)

    Delta_Vector.X = x_diff
    Delta_Vector.Y = y_diff
    Delta_Vector.Z = z_diff

    a_diff = (a_diff / 180 * Math.PI)
    b_diff = (b_diff / 180 * Math.PI)
    c_diff = (c_diff / 180 * Math.PI)

    z_rot = Matrix4x4.CreateRotationZ(a_diff)
    y_rot = Matrix4x4.CreateRotationY(b_diff)
    x_rot = Matrix4x4.CreateRotationX(c_diff)

    GesamtrotationsMatrix = z_rot * y_rot * x_rot

    GesamtrotationsMatrix.Translation = v_basis1
    Matrix4x4.Invert(GesamtrotationsMatrix, Inverse_GesamtrotationsMatrix) 'Inverse GesamtrotationsMatrix berechnen
    If Matrix4x4.Invert(GesamtrotationsMatrix, Inverse_GesamtrotationsMatrix) = True Then 'Abfrage ob Invertierung erfolgreich war
    Vector2 = Vector4.Transform(v_basis2, Inverse_GesamtrotationsMatrix) 'Inverse TransformationsMatrix mit Translationsteil multiplizieren mit V_Basis2
    txtTransX.Text = Convert.ToString(Vector2.X)
    txtTransY.Text = Convert.ToString(Vector2.Y)
    txtTransZ.Text = Convert.ToString(Vector2.Z)


    ' Base1 =X 4.0,Y 4.0,Z 20.0,A 120.0,B 5.0,C 20.0
    ' Base2 =X 2.0,Y 2.0,Z 10.0,A 120.0,B 5.0,C 20.0

    ' Soll Ergebnis
    ' Total Translation 10,392 mm, X -0,142 Y 0,862 Z 10,356 ( Base1 -> Base2 )
    ' Total Translation 10,392 mm, X 0,142 Y -0,862 Z -10,356 ( Base2 -> Base1 )
    ' Rotation a 0 b 0 c 0





    Mein Ergebnis, das leider komplett falsch ist, ist folgendes:
    ' IST Ergebnis
    ' Total Translation 10,392 mm, X -2,0 Y -2,0 Z -10,0 ( Base1 -> Base2 )
    ' Rotation a 0 b 0 c 0


    Ich weiß nicht was ich da verkehrt mache.
    Vieleicht kennt sich ja jemand aus und kann mir weiterhelfen?

    Danke!
    @hugoboss28 Dein Herangehen ist suboptimal.
    Mach Dir einen Operator, die eine Translation macht.
    Mach Dir einen Operator, die eine Rotation macht.
    Dann rufst Du die Operatoren nur noch in der richtigen Reihenfolge auf und feddich.
    Ich denke mal, dass dies hier falsch ist:

    Quellcode

    1. GesamtrotationsMatrix = z_rot * y_rot * x_rot

    Gugst Du Eulersche Winkel.
    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!
    @RodFromGermany
    ich dachte ich nehme die schon vorgefertigten 4x4 Matritzen her wo die Rotation und die Translation schon integriert sind.
    Ich nehme an das diese schon getestet sind.
    Habe mir auch schon gedacht die matritzen mittels einer doppelten Schleife zu realisieren.
    Bin aber den leichteren Weg gegangen. Warum das Rad neu erfinden wenn es schon existiert?

    War vieleicht ein Fehler!


    Das zusammenmultiplizieren der drei Rotationsmatritzen ist höchstwarscheinlich falsch.
    Alleine schon von der Logic her genügen zwei Rotationen um auf den Punkt zu kommen.

    Ich habe das aber auch nur mit zwei Rotationen ausprobiert. Das Ergebnis war leider falsch.
    Irgend etwas ist da faul.

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

    hugoboss28 schrieb:

    Irgend etwas ist da faul.
    Rotationen sind durchaus problematisch.
    Mach Dir zunächst eine grafische Ausgabe, wo Du online, mit einer ScrollBar oder so die Winkel vorgibst und Du das Ergebnis siehst.
    Da solltest Du den Fehler zumindest schnell finden. Wenn Du das dann gut beschreiben kannst, fixen wir das.
    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!
    Hallo zusammen,

    folgendes Problem stellt sich mir gerade:

    Basis1 (x=10 y=20 z=30 a=60 b=30 c=10) (Rz)a=60 (Ry)b=30 (Rx)c=10
    Basis2 (x=40 y=50 z=60 a=-170 b=60 c=30) (Rz)a=-170 (Ry)b=60 (Rx)c=30

    Ich habe ein Tool mit dem ich die Transformation errechne. Dieses dient rein als referenz.
    Als zwischenergebnis erhalte ich eine Translation in x,y,z und eine Rotationsangabe a,b,c.

    x 43,358 y 28,653 z 0,907 < bis hier alles im grünen Bereich
    a -80,661 b 17,596 c 80,035 < das verstehe ich nicht

    Wie man unschwer erkennen kann sind die Ergebnisse für a,b,c nicht die Winkeldifferenzen beider Basen.
    Wie aber werden diese Winkel ermittelt???

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Marcus Gräfe“ ()

    RodFromGermany schrieb:

    Bau Dir zuerst eine Visualisierung davon, danach die Operation.

    @hugoboss28 Was sind das für Werte, insbesondere Rx, Ry, Rz?
    Poste mal ein Bild der Visualisierung.
    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!