3D Transformation

  • VB.NET

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

    3D Transformation

    Hallo Leute,

    Ich bin neu hier und mit VB eher noch ein erfahrener Anfänger :D .
    nach dem ich mich in das 3d transformationen eingearbeitet habe, wollte ich nun ein kleines Programm mit VB erstellen das rein nur Koordinaten im R^3 berechnet.
    Dafür gibt es ja bei VB fertige Funktionen (Matrixklasse).
    Es ist mir aber aufgefallen das die vorhandenen Matrixfunktionen nicht für R^3 sind.
    Stimmt das so oder kann man sich für VB noch eine erweiterung herunterladen?

    Natürlich kann man auch mit verschachtelten Feldern arbeiten aber warum das Rad neu erfinden wenn es schon existiert ?????

    Verschoben. ~Thunderbolt

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

    nuget.org/packages/System.Numerics.Vectors

    damit hast ne Matrix4x4, damit kannst alles nötige in R^3 berechnen.
    Und zumindest die Vektoren dieses Nugets-Packets sind sogar SIMD-beschleunigt ;)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Hallo,

    danke für deine Antwort.
    ich denke ich habe es hinbekommen

    Aktionen zum Installieren des Pakets "System.Numerics.Vectors.4.4.0" wurden aufgelöst.
    Das Paket "System.Numerics.Vectors.4.4.0" wird dem Ordner "C:\visual studio 2015\Projects\test transfo\packages" hinzugefügt.
    Das Paket "System.Numerics.Vectors.4.4.0" wurde dem Ordner "C:\visual studio 2015\Projects\test transfo\packages" hinzugefügt.
    Das Paket "System.Numerics.Vectors.4.4.0" wurde "packages.config" hinzugefügt.
    "System.Numerics.Vectors 4.4.0" wurde erfolgreich auf "test transfo" installiert.
    ========== Abgeschlossen ==========
    Tja,
    Sorry Leute aber jetzt kommt das nächste Problem.
    Ich habe noch nie so eine extension installiert und habe auch keine Ahnung wie ich auf die neuen funktionen zugreifen kann.
    z.b. wollte ich jetzt eine Matrix definieren. ich bin davon ausgegangen das es eine 4x4 matrix ist. In den eigenschaften habe ich dan gesehen dass es eine 3x3 Matrix war.

    Nach der installtation dieses NuGets muss ich da noch etwas beachten? Gibt es eine beschreibung für diese Nugets?



    Nachtrag!

    ich glaube ich komme voran!!! :thumbup:

    Dim z_rot As System.Numerics.Matrix4x4
    Okay kurz ein paar Hintergrundinfos:

    Mit dem NuGet Paket Manager hast du eben eine Bibliothek zu deinem Projekt hinzugefügt (referenziert) welche den Funktionsumfang deiner Anwendung erweitert.

    Das Paket das du installiert hast heißt System.Numerics.Vectors und ist eine Erweiterung seitens Microsoft.
    Der Namespace der Bibliothek lautet System.Numerics.

    Dokumentiert ist das Ganze auch auf dem MSDN hier.

    Dort siehst du unter anderem auch eine Matrix4x4 Struktur welche das sein sollte was du suchst.

    Importiere also den System.Numerics - Namespace mit dem Schlüsselwort Imports (unter VB), using (unter C#) und anschließend der eben genannte Namespace.
    Super, Danke für die Infos.
    Ich muß schon sagen, ein DICKES LOB an Euch und diesem Forum!



    ?( Hallo Leute,

    ich habe bei dem Versuch eine Transformation zu erstellen mit Rotationsanteil diverse Probleme.
    z.B. versuche ich einen 4x4 Matrix mit einem Vector4 zu multiplizieren. da scheitere ich schon.

    ich habe mir 3 4x4Matritzen mit dem jeweileigem Rotantionsanteil für x,y,z gebastelt.
    diese will ich dann zusammen multiplizieren und mal einem Vektor nehmen.
    Wie soll ich da eurer Meinung vorgehen?

    Beiträge mit kurzen Zeitabstand zusammengefügt. ~Thunderbolt

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

    hugoboss28 schrieb:

    diese will ich dann zusammen multiplizieren und mal einem Vektor nehmen.
    Es genügt nicht, iwas in den Quelltext zu schreiben, Du musst auch verstehen, was da passieren soll.
    Also:
    Was soll da passieren?
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Vector4.Transform
    msdn.microsoft.com/de-de/library/mt573619(v=vs.111).aspx
    um die miteinander zu verrechnen, ansonsten versteh ich dein problem nicht?


    habs gefunden! Danke!

    @RodFromGermany
    Naja, größtenteils sind das Verständnisprobleme von mir.
    Ich will eigentlich nichts anderes wie eine mathematische Transformation realisieren. Es gibt ja schon fertige funktionen für z.b eine Rotationsberechnung oder die inverse einer Matrix. Auf diese möchte ich zugreifen. Es gibt ja Multiply(Matrix4x4, Matrix4x4) zum ausmultiplizieren zweier matrizen. Wie kann mann am einfachsten drei solche matritzen ausmultiplizieren?

    Ich werde mich noch einlesen müssen. Auf jeden fall, danke für eure Antworten.

    Gibt es vieleicht irgend wo noch beispielcode zum nachvollziehen von den ganzen Funktionen?


    hugoboss28 schrieb:

    Wie kann mann am einfachsten drei solche matritzen ausmultiplizieren?
    Kommt auf die Syntax der Implementierung an.
    Wenn die gut ist, hat die den Multiplikations-Operator * überladen und Du kannst einfach schreiben:

    VB.NET-Quellcode

    1. Dim m1 = New Double(2, 2) ' noch belegen
    2. Dim m2 = New Double(2, 2) ' noch belegen
    3. Dim m3 = New Double(2, 2) ' noch belegen
    4. Dim m4 = m1 * m2 * m3
    wobei ich Dir noch empfehlen würde, Klammern zu setzen, um Deine Reihenfolge festzulegen.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Was er da hat sind Arrays, die haben diese Operatoren natürlich nicht, es sollte so wie ich das verstanden hab nur ein Beispiel sein.
    Und die Matrix aus System.Numerics hat den *-operator überschrieben, das heißt du kannst diese ganz normal ausmultiplizieren und es entspricht einer Matrixmultiplikation im gewohnten SInne...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    hugoboss28 schrieb:

    Matrizen werden doch anders zusammenmultipliziert.
    Dein Einwand ist korrekt.
    Du brauchst eine Matrix-Klasse mit einer *-Operator-Überladung, z.B. so was:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Matrix33
    2. Public matrix As Double(,)
    3. Public Sub New()
    4. matrix = New Double(2, 2) {} ' in VB.NET sind das 3x3-Matrizen
    5. End Sub
    6. Public Shared Operator *(m1 As Matrix33, m2 As Matrix33) As Matrix33
    7. Dim result = New Matrix33()
    8. For i = 0 To 2
    9. For j = 0 To 2
    10. For k = 0 To 2
    11. result.matrix(i, j) += m1.matrix(j, k) * m2.matrix(k, j)
    12. Next
    13. Next
    14. Next
    15. Return result
    16. End Operator
    17. End Class
    (ich verbürge mich nicht für die Richtigkeit dieser Operation :!: )
    und dann einfach

    VB.NET-Quellcode

    1. Dim m1 = New Matrix33() ' belegen
    2. Dim m2 = New Matrix33() ' belegen
    3. Dim m3 = m1 * m2

    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Hallo,

    habe folgendes gefunden:
    z_rot = Matrix4x4.CreateRotationZ(Rz) Rz ist der winkel bzw. das Bogenmaß

    das gleiche habe ich für x und y auch.
    Nun will ich alle drei Rotationsmatrizen in einer Gesamtrotationsmatrix zusammenfassen.
    Mit Matrix4x4.Multiply kann man zwei Matritzen zusammenmultiplizieren.
    ist es nun das gleiche wenn ich das Ergebnis der Multiplikation von den ersten beiden matrizen mit der dritten Matrix multipliziere?

    z_rot = Matrix4x4.CreateRotationZ(Rz)
    y_rot = Matrix4x4.CreateRotationY(Ry)
    x_rot = Matrix4x4.CreateRotationX(Rx)
    Dim rotationsMatrix As Matrix4x4
    rotationsMatrix = Matrix4x4.Multiply(z_rot, y_rot)
    rotationsMatrix = Matrix4x4.Multiply(rotationsMatrix, x_rot)

    Ich bin der Meinung ja. Oder wie seht Ihr das.

    Des Weiteren ist mir aufgefallen das in einer 4x4Matrix die letzte Spalte für eine Translation hergenommen wird. Ich habe leider keine dokumentation hierfür gefunden.

    Mein Ziel ist eigentlich folgendes:
    Ich habe einen Punkt im R^3. die Koordinaten dieses Punktes beziehen sich auf ein Objekt oder Basis (nicht World).
    Die Lage des Objektes (oder der Basis) ist bezüglich World bekannt.
    Nun kommt das zweite Objekt (die zweite Basis) ins Spiel. Diese ist einwenig verdreht und verschoben zur ersten Basis. Auch hier ist die Lage (Ursprung) bezüglich World bekannt.
    Nun soll der Punkt der noch die koordinaten bezüglich der ersten Basis hat, bezüglich der zweiten Basis beschrieben werden. Sprich der Punkt bleibt im Raum gleich jedoch bekommt er andere koordinaten da der ursprung der zweiten basis nicht gleich der ersten basis ist (sprich es muss eine Rotation und eine Translationsberechnung erfolgen).

    Ich hoffe ich habe mich einigermaßen deutlich ausgedrückt.



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

    hugoboss28 schrieb:

    ist es nun das gleiche wenn ich das Ergebnis der Multiplikation von den ersten beiden matrizen mit der dritten Matrix multipliziere?
    Rotationen sind, im Gegensatz zu Translationen, nicht vertauschbar, da die anderen Achsen mit rotiert werden und dann in die Richtung einer anderen Achse zeigen.
    Wisse stets genau, in welcher eihenfolge Du die Operationen durchführst.
    Bau Dir zuerst eine Visualisierung davon, danach die Operation.
    Und überzeuge Dich davon mit sinnvollen Testbeispielen, dass das Modell stimmt.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!

    Neu

    klar, logisch. wenn man um verschiedene Achsen rotieren will sollte man zuerst alle rotationsberechnungen durchführen und zum schluss die Translation.

    Aber ich habe jetzt ein anderes Problem. Nämlich die Inverse einer Matrix.
    Matrix4x4.Invert(rotationsMatrix, ????????)
    keine Ahnung was danach kommt. Sorry, bin wahrscheinlich zu lange drann.