OpenGL: Vector nach Transformation bestimmen



  • Hi,

    da ich ned richtig weis, wonach ich da googeln muss, verlief meine Sucherei leider irgendwie ergebnislos im Sande 😞 Daher wollt ich hier mal versuchen, eine Antwort zu finden.

    Also ich wünsch mir gerne folgendes: Das Programm startet, ich befinde mich bei den (gedachten?) Koordinaten 0|0|0 und will ein Objekt in die ogl-Welt setzen. Dazu transforme ich 2 nach links (also öh, 2|0|0), drehe die szene um 90° in y-Richtung und transformiere nochmals in y-Richtung 3 Einheiten. Dann poppe ich die urmatrix wieder, un mein Objekt hängt irgendwo da rum.

    Jetz stellt sich mir die Frage: Wie bekomme ich jetz den Vector vom Ursprung zu dem Objekt raus? Nach der ersten Translation is das ja noch relativ simpel. Der Vektor entspricht auch dem Transformierungs-Vektor, also 2|0|0. Dann dreh ich ja, un dabei ändert sich der Vektor noch ned, also immernoch 2|0|0. Wenn ich aber jetz in y-Richtung 3 Einheiten transformiere, dann entspräche das ja (ne ccw-drehung mal vorrausgesetzt) nem ursprünglichen -3|0|0 oder? Korrigiert mich, enn ich mich grad irre, aber is im endeffekt auch garnich sooo wichtig, Geht mir ja grad nur ums bsp. jedenfalls wäre dann der Endvektor doch für dieses bsp 0|0|0 + 2|0|0 + -3|0|0 = -1|0|0.

    Und genau eine Methode, diesen Vektor auszurechnen, würde ich mir wünschen. Weil so simpel nachvollziehbar rotiert und transformiert man ja selten, so dass die Berechnung im Kopf ned mehr so ganz klappen will ^^

    Ich könnt mir vorstellen, dass man nun händisch irgendwie die Transform-Matrix mit der Transformierung nochmal koppelt (also die Matrix-Daten auslesen lassen und diese dann mit dem Transformvektor kombinieren oder so) und das bei jedem zwischenschritt und alle zwischenergebnisse addieren und somit am Ende eben das korrekte Ergebnis in den Händen halten. Nur... Wie? ^^

    Ich hoffe, ihr könnt mir da paar Ideen und Befehle mit auf den Weg geben.



  • OpenGL hat die Aufgabe, die Vektoren und die Matrizen zu verrechnen, nicht. Informiere dich über die lineare Algebra oder nutze eine Bibliothek, die das anbietet.



  • das hier aber auch jede verfluchte antwort so dermaßen besch..eiden sein muss man. einfach mal ne nette antwort geht in diesem forum nich oder? eben weil ich mich über diese algebra usw informieren möchte, frage ich ja hier?! zu schwer oder?

    das ich das nebenher machen muss, is mir auch son bissl klar. ich wollt halt nur mal nach ner anregung fragen, WIE man sowas nebenher machen könnte. nen ansatz (zumindest fürs translatieren) hab ich schonma, jetz muss ich nur noch rausfinden, wies beim drehen geht. aber danke für nix, schnauzt euch halt gegenseitig weiter an un bleibt unter euch...

    so was mieses, das gibts einfach ned. einmal will ich hier ne vernünftige antwort lesen können -.-



  • War meine Antwort nicht nett? Wenn nein, was daran nicht? Und sollen wir dir nun die gesamte lineare Algebra beibringen? Nein, ein Forum ist nicht dazu da, ein Forum ist für konkrete Probleme da. Hättest du ein wenig Eigeninitiative (mal nett ausgedrückt) gezeigt, hättest du die Antwort schon. Hier ein Lösungsansatz:

    Zielvektor = Nullvektor * (Translationsmatrix(-2, 0, 0) * Rotationsmatrix(0, 0.5 * Pi, 0) * Translationsmatrix(0, 3, 0));
    

    Erklärung:
    Wir multiplizieren den Startpunkt (in diesem Fall der Nullvektor) mit der Matrix. Die Matrix setzt sich aus der ersten Translationsmatrix (nach links ist negativ) multipliziert mit der Rotationsmatrix (Winkel werden in der Regel in Rad angegeben) multipliziert mit der zweiten Translationsmatrix zusammen.



  • DarkMo schrieb:

    Dann dreh ich ja, un dabei ändert sich der Vektor noch ned, also immernoch 2|0|0. Wenn ich aber jetz in y-Richtung 3 Einheiten transformiere, dann en

    Wenn du eine translation ausführst und dann ändert sich der Vektor,
    da immer um den Ursprung gedreht wird.

    Dies und die Matrix Multiplikation (s.EOutOfResources) wird hier u.a. ein wenig
    erklärt, mit Bildchen:
    http://directxtutorial.com/Tutorial9/B-Direct3DBasics/dx9B5.aspx

    Den Direct3D9 Code Teil kannst du einfach ignorieren, der Rest ist auch für OpenGL gültig.

    Hoffe das hilft dir, denn eine Rechnung kann ich nicht ganz nachvollziehen 🙂



  • transformier doch einfach den Urpsrung mit !



  • Sofern Du glRotate/Translate/etc verwendest, fuehrt jede Operation dazu, dass die Modelview-Matrix modifiziert wird.
    Diese Matrix kannst Du per glGet auslesen und Deinen Vektor damit manuell transformieren.
    Einfacher und moderner waere es, statt der OpenGL-Funktionen gleich eine geeignete Bibliothek zu verwenden.


Anmelden zum Antworten