ich schaue auf ein Objekt und kann es rotieren und verschieben. Solange ich nicht rotiert habe, stimmt der Translationsvektor mit meiner Mausbewegung überein. Nur wenn ich rotieren und dann verschiebe kann nach oben zu nach unten und so weiter werden...ist nicht schön und irgendwie fehlt mir grad ein pragmatischer Ansatz um herauszufinden, wie ich es denn am einfachsten meiner Mausbewegung entsprechend verschieben kann.
Registriert: Mo Jan 31, 2005 11:02 Beiträge: 432 Wohnort: Rheinlandpfalz
Wenn du zuerst translatest und dann rotierst sollte das eigentlich stimmen mit der Mausbewegung.
D. h. der Translationsvektor bleibt dann gleich.
Irgendwie verstehe ich deine Frage aber nicht so recht... Willst du mit der Maus willst das Objekt nur in X- und Y-Richtung verschieben (zweidimensional) ?
Naja, es macht einen Unterschied, ob du a) erst rotierest dann translatest oder b) erst translatest und dann rotierst.
Wahrscheinlich rotierst du zuerst... Aber vllt habe ich deine Frage auch völlig fehl-interpretiert
Vielleicht hab ich sie ja auch undeutlich gestellt Also ich habe so etwas wie einen Viewer für 3D Objekte. Und da kann man nicht nur rotieren, sondern auch verschieben und zoomen. Und wenn man nun das Objekt sich so hindreht, wie man möchte und es dann verschiebt, kann es vorkommen, dass die Mausbewegung nicht mehr der Translation übereinstimmt.
Also ich weiß nicht, was gemacht wird. Aber ich weiß, dass beides funktionieren soll Verstanden? Sonst erklär ich es nochmal.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Es gibt eine Funktion namens gluUnProject. Damit kannst du eine Fensterposition in Abhängigkeit von der Tiefe in eine Objectposition berechnen. Bei einer Freien 3D Ansicht wird das natürlich nicht so einfach aber evtl genügt es ja. Kommt ja auch immer darauf an was du damit bezweckst.
So etwas in der Art. Mal sehen, ob ich das hinbekomme.
Sinn des ganzen ist, dass man sich ein Objekt an jeder Stelle so anschauen kann, wie man es möchte. Sprich ich drehe es in die richtige Ansicht, verschiebe es, so dass ich auf einen bestimmten Bereich zoomen kann und kann mir dann meine "interessante Stelle" in Ruhe anschauen.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Mir ist da gerade noch etwas eingefallen. Und zwar kommt das Problem in deinem ersten Beitrag nicht so wirklich gut rüber. Aber ich habe gerade eine verblüffend ähnlichen Beitrag in einem anderem Forum entdeckt und da kam diese Problemematik etwas besser rüber.
Sagen wir mal du betrachtes dein Object von Vorn und verschiebst es und alles ist Okay. Jetzt drehst du es um 180° und dann wird Links zu Rechts? Ich denke mal das ist richtig, wenn ich es jetzt richtig verstanden habe. Dieses Problem kannst du recht einfach durch Sinus und Cosinus beheben.
Die X Verschiebung wäre Sinus des Winkels * Verschiebung und die Z Verschiebung wäre Cosinus des Winkels * Verschiebung. Oder so etwas in der Richtung.
Warum das so ist ist recht einfach. Der Sinus von 0° ist 1. Der von 90° ist 0 und der von 180° ist -1. Wenn du als deine Ansicht um 180° gedreht hast würden alle X Verschiebungen zu negativen X Verschiebungen. So oder so ähnlich habe ich das auch schon mal gemacht. Weiß es allerdings nicht mehr 100%tig genau.
PS: Das gluUnproject bräuchtest du eher dann wenn du wirklich Pixelgenau verschieben möchtest. So hatte ich das laut deinem Beitrag auch verstanden.
Ja so meine ich das. Das mit Sinus und Cosinus werde ich mal ausprobieren. Nur weiß ich derzeit leider nicht den Winkel um den ich gedreht habe (sonst wärs ja zu einfach ). Ich habe nur 2 Vektoren mit denen ich arbeiten kann, verfolge aber gerade auch noch 1 anderen Gedankengang, in dem ich mir eine Plane drüberlege und den Vektor auf der Plane erzeuge und diesen dann umwandel.
So, nun hab ich auch dran gedacht Feedback zu geben. Die Lösung gestaltet sich etwas anders. Ich ermittle erst den rechtwinkligen Vektor zur Kamera und dann den rechtwinkligen zum rechtwinkligen. Damit habe ich die Ebene auf der ich verschieben möchte und kann meinen Vektor entsprechend anpassen.
Du könntest auch das Objekt feststehend machen und die Kamera bewegen (gluLookAt). Diese Funktion will drei Parameter: Den Punkt, wo die Kamera ist (eye), den, wo sie hinschaut (center) und den, der nach 'oben' zeigt (für die Rotation um den Blickvektor- up). Jetzt kannst Du wenn die Kamera nur verschoben werden soll die beiden ersten Vektoren um den Bewegungsvektor verschieben, und das geht so:
erst ermittelst Du einen Vektor, der senkrecht auf eye->center und eye->up liegt (Kreuzprodukt): vx. Dieser wird um die Bewegung in x-Richtung skaliert. Danach ermittelst Du den Vektor, der senkrecht auf eye->center und dem neuen Vektor vx liegt: vy. Dieser wird um die Bewegung in y-Richtung skaliert. diese beiden werden addiert und auf eye und center addiert. Damit ist die Verschiebung der Kamera fertig.
Beim Rotieren ist es ähnlich, nur dass der Vektor eye->center rotiert wird (um die Mausbewqegungen in x- und y- Richtung) und entweder eye oder center neu berechnet wird. Wenn die Kamera um den Centerpunkt rotiert werden soll, rechnest Du eye mit dem neuen eye->center-Vektor aus, wenn die Kamera selber rotieren soll, dann wird center neu berechnet. Jetzt muss aber der up-Vektor angepasst werden. dies geschieht wie oben durch Kreuzproducht von eye->center mit up und anschließendem Kreuzprodukt des neuen Vektors mit eye->center um den neuen Up zu erreichen. Die Reihenfolge ist hier wichtig, da sonst Up mit falschem Vorzeichen rauskommt.
Soll sich die Kamera um Z rotieren, musst Du einfach Up rotieren.
Zoom brauchste nicht, denn das ist auch nix anderes, als eine Bewegung auf der Z-Achse, also entlang eye->center.
_________________ Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.
Toll.
Vielen Dank für den Tipp. Die Translation habe ich jetzt mal so implementiert und das läuft mit der Rotation habe ich jetzt aber etwas Mühe.
So ausführlich wie Du antwortest klingts als hättest du ein Code-Schnippel davon Könntest du das nicht posten?
(Wäre nicht auch eine Berechnung mit Hilfe der Kugelgl x^2+y^2+z^2=r^2 möglich?)
Hier der Code, wird Dir aber nicht gefallen, da ich damals meine eigene Vektorunit geschrieben habe, aber als Pseudocode sollte es die Gizmos in Gang bringen
In der letzten Zeile siehst Du, dass in meinem Falle sich die Kamera um sich selber dreht. Wenns anderst gewünscht wird, musst Du Center belassen und Eye mit der neuen Richtung verwurschteln (hier müssen dann aber ggf die Vorzeichen von den Übergabeparametern gedreht werden). Alle nicht lokal deklarierten Variablen sind Member meiner Camera-Klasse, die Rotationen sind in Bogenmaß um die jeweilige Achse anzugeben.
// e.g.: 1st col, 3rd row would be [0,2] not [2,0]
End;
TGLVector=Record
CaseIntegerOf
0:(X: GLDouble;
Y: GLDouble;
Z: GLDouble);
1:(Width: GLDouble;
Depth: GLDouble;
Height: GLDouble);
2:(Tilt: GLDouble;
Roll: GLDouble;
Pan: GLDouble);
End;
_________________ Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.
Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.