Quaternion / Eulerwinkel Klasse

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Sara.

    Quaternion / Eulerwinkel Klasse

    Hallo zusammen,
    ich bin neu hier und hoffe ich stelle meine Frage im richtigen Unterforum.

    Ich habe Dateien in denen stehen Yaw, Pitch und Roll Werte.
    Und dann habe ich noch Dateien in denen stehen Quaternion Werte x, y, z und w.
    Die Werte bekommen ich auch super eingelesen.

    Das Koordinaten System ist +X nach rechts, +Y nach oben und +Z auf mich zu.
    Das sollte mit VB Koordinaten System überein stimmen.

    Jetzt möchte ich einen Würfel drehen.
    Wie komme ich an die Werte der Würfel Ecken im Raum, wenn der Ursprung der Drehung der Koordinaten-Nullpunkt ist.
    Da gibt es doch bestimmt schon eine fertige Klasse.
    Ich denke ich benötige als Ergebnis doch nur einen Faktor. Oder?

    LG Sara
    Willkommen im Forum. :thumbup:

    Sara schrieb:

    Ich denke ich benötige als Ergebnis doch nur einen Faktor. Oder?
    Nein.
    Du schickst einen Ortsvektor rein und bekommst einen gedrehten + verschobenen Ortsvektor wieder raus.
    Gugst Du hier.
    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!

    Sara schrieb:

    Das Koordinaten System ist +X nach rechts, +Y nach oben und +Z auf mich zu.
    Das sollte mit VB Koordinaten System überein stimmen.

    wenn du das auf die Weise, wie VB Bildschirmkoordination einteilt, beziehst, stimmt das nicht ganz. Das wäre: +X nach rechts, +Y nach unten, +Z nach vorne.

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    vb-checker schrieb:

    stimmt das nicht ganz.
    @Sara: hat hier ein klassisches Rechtssystem beschrieben. :thumbsup:
    Wenn die Darstellung in .NET ein 2-dimensionales System hat, bei dem (0, 0) links oben ist, muss halt eine entsprechende Transformation verwendet werden.
    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!

    vb-checker schrieb:

    Dafür gibt es ja die Z-Order.
    Du bist im falschen Film. :D

    Sara schrieb:

    Yaw, Pitch und Roll
    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!
    Danke für die Antworten,
    Die Wikipedia Seite zum Thema Eulerschen Winkel hatte ich auch gefunden.
    Ich wollte es vermeiden mich ausführlich damit zu beschäftigen.
    Ich dachte es gibt da schon etwas fertiges von microsoft.

    Ich habe folgendes gefunden.

    http://msdn.microsoft.com/en-us/library/windows/desktop/bb153114%28v=vs.85%29.aspx

    Quaternion.RotateAxis(Vector3,Single) Method (Microsoft.DirectX)
    Quaternion.RotateMatrix(Matrix) Method (Microsoft.DirectX)
    Quaternion.RotateYawPitchRoll(Single,Single,Single) Method (Microsoft.DirectX)
    Quaternion.RotationAxis(Vector3,Single) Method (Microsoft.DirectX)
    Quaternion.RotationMatrix(Matrix) Method (Microsoft.DirectX)
    Quaternion.RotationYawPitchRoll(Single,Single,Single) Method (Microsoft.DirectX)
    Quaternion.ToAxisAngle(Quaternion,Vector3,Single) Method (Microsoft.DirectX)

    UnsafeNativeMethods.Vector3.TransformCoordinate(Vector3,Vector3,Matrix) Method (Microsoft.DirectX)

    Und bestimmt gibt es da noch mehr.
    Aber was ist denn das richtige für mich?


    Ich nutze das WPF-Multimedia Koordinatensystem.
    Also ein rechtshändiges System. (Kofler Visual Basic 2008 Kapitel 19.)


    LG Sara

    Sara schrieb:

    Aber was ist denn das richtige für mich?
    Das musst Du entscheiden, nur Du kennst die korrekte Aufgabe.

    Sara schrieb:

    Ich wollte es vermeiden mich ausführlich damit zu beschäftigen.
    Gugst Du hier.
    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 RodFromGerman ,
    ich dachte ich hätte die Aufgabe genau beschrieben.
    Ich habe einen Würfel im Raum. Von allen 8 Eckpunkten habe ich die X, Y und Z Koordinaten.
    Jetzt möchte ich die neuen Koordinaten nach einer Drehung (Roll, Pitch und Yaw) wissen.
    Der Drehpunkt ist immer 0/0/0.
    Das ist die Aufgabe. Die neue Position einer Koordinate nach einer Roll, Pitch und Yaw Drehung um 0/0/0.
    Im zweidimensionalen Raum bekomme ich das hin.

    Alles was ich wollte war ein Stups in die richtige Richtung.
    So etwa. Nimm die ..... Klasse.

    Roll, Pitch und Yaw ist ja eine Drehung in einer bestimmten Reihenfolge.

    So wie ich das verstanden habe dreht man immer um die lokale Achse.
    Nach jeder Drehung verändert sich also das lokale Koordinatensystem des 3D Objektes.
    Kann ich wenn ich die Reihenfolge umdrehe Yaw, Pitch und Roll alles global drehen?
    Dann wäre es ja einfach.

    LG Sara

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

    Ich denke Matrizen wären hier die einfachste Lösung (also so, wie auch DirectX da handhabt).
    Ich hab mir schon mal die Mühe gemacht, das alles auch ohne solche Grafik-APIs zu lösen, und zwar in MathUtils. Ich glaube sogar, dass Beispielprojekt macht genau das, was du haben willst, Rotation um 3 Achsen.

    Sara schrieb:

    Das ist die Aufgabe.
    Das Problem ist, dass bei Rotationen das Koordinatensystem mitgedreht wird, das bedeutet insbesondere, dass 2 Rotationen um unterschiedliche Achsen nicht vertauschbar sind :!: :!: :!:
    Du kannst die Rotation um jede Achse einzeln beschreiben, das ist einfach die Multiplikation des jeweiligen Ortsvektors mit der Drehmatrix.
    Die Rotation um die x-Achse sieht dann z.B. so aus (C#):

    C-Quellcode

    1. public Vektor DreheX(double winkel)
    2. // Eingang: Vektor x,y,z
    3. // Ausgang: der um die x-Achse gekippte Vektor
    4. {
    5. double cw = Math.Cos(winkel);
    6. double sw = Math.Sin(winkel);
    7. double vy = Y;
    8. double vz = Z;
    9. Y = vy * cw + vz * sw; // die x-Achse ist nicht betroffen
    10. Z = -vy * sw + vz * cw;
    11. return this;
    12. }
    Wenn Du eine vorgegebene Reihenfolge hast, kannst Du natürlich die Matrix vorab berechnen und führst die Drehoperation auf eine Matrizenmultiplikation zurück.
    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.
    ich habe es schon mal halb hin bekommen

    Quellcode

    1. Dim drehung As New Quaternion(xWert, yWert, zWert, wWert)
    2. Dim myQuaternionRotation3D = New QuaternionRotation3D(drehung)
    3. Dim WuerfelVisual As New ModelVisual3D
    4. WuerfelVisual.Transform = New RotateTransform3D(myQuaternionRotation3D)


    Das funktioniert wunderschön.

    Jetzt möchte ich das auch noch für den Yaw Pitch und Roll (Euler Winkel) hin bekommen.

    Ich dachte das muss dann doch genau so gehen.Also so.

    Quellcode

    1. Dim drehungEuler As New Rotation(xWert, yWert, zWert)
    2. Dim myEulerRotation3D = New Rotation3D(drehungEuler)
    3. Dim WuerfelVisual As New ModelVisual3D
    4. WuerfelVisual.Transform = New RotateTransform3D(myEulerRotation3D)


    Doch ich bekomme eine Fehlermeldung für Zeile 1.
    Arraygrenzen können nicht in Typenbezeichnern stehen

    LG Sara

    Sara schrieb:

    Doch ich bekomme eine Fehlermeldung für Zeile 1.
    Kannst Du bitte mal den Code posten?
    Bist Du bereit, höhere Geometrie zu programmieren?
    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,
    ich habe es jetzt hin bekommen.
    Hab mir Bücher zum Thema 3D Computergrafik und Mathe besorgt.
    Ich habe es jetzt mit einer Rotationsmatrix gelöst.
    Genauer gesagt ich habe drei Matrizen X, Y und Z.

    Diese habe ich dann nacheinander multipliziert.

    Vielen Dank für die Anregungen hier.

    LG Sara