Drehen Sie den normalen-Vektor auf die Achsen Flugzeug
Habe ich eine Reihe von Daten-Punkte im 3D-Raum, die anscheinend alle fallen auf einer bestimmten Ebene. Ich benutze PCA zur Berechnung der Fläche Parameter. Die 3. Komponente der PCA gibt mir den Normalenvektor der Ebene (schwächste Komponente).
Was ich will Nächstes zu tun ist, zu transformieren alle Punkte, die auf Sprach-Ebene und betrachten Sie es in 2D.
Meine Idee war, den folgenden zu tun:
- Finden Sie ein Zentrum in Punkt (Durchschnitt) auf der Ebene
- Subtrahieren es von allen Datenpunkten, um Sie zu arrangieren um den Ursprung
- Drehen Sie den normalen, so daß es zu (0,0,-1)
- Gelten diese Drehung auf alle Daten Punkte
- Orthogonale Projektion (im Grunde überspringen z-Achse)
Jetzt bin ich stecken bei der Suche nach der richtigen Drehung Betrieb. Ich habe versucht, die Arbeit mit acos oder atan und der Errichtung zweier-rotation-Matrizen. Scheint beide Methoden (mit acos, mit atan), geben mir das falsche Ergebnis. Vielleicht können Sie mir helfen hier raus!
Matlab-code folgt:
b = atan(n(1) /n(2));
rotb = [cos(b) -sin(b) 0; sin(b) cos(b) 0; 0 0 1];
n2 = n * rotb;
a = atan(n(1) /n(3));
rota = [cos(a) 0 sin(a); 0 1 0; -sin(a) 0 cos(a)];
n3 = n2 * rotaows:
Erwarte ich n2
zu haben, die y-Komponente null. Jedoch nicht, dass bereits für den Vektor (-0.6367, 0.7697, 0.0467).
- Warum gehst du nicht einfach projizieren alle Punkte auf der Ebene und dann drehen Sie alles so, dass Sie können einfach ziehen Sie die Punkte mit Ihrer xz (oder xy-Koordinaten)?
- Oder befestigen Sie die Kamera direkt an das Flugzeug, so dass es den Blick direkt auf Sie.
- Die Kamera-Idee ist gut. Sie die Kamera bewegen, heraus aus der Ebene, die von der Herkunft einiger Entfernung entlang der normalen. Dann zeigen Sie die Kamera auf den Ursprung. Natürlich, dies setzt Voraus, dass Sie haben Kamera-Projektions-code, die getan werden kann mit mit Rotationen oder Vektoren.
- Guter Vorschlag. Traurig genug, ich habe keine Kamera-code und das möchte ich nicht einführen Operationen, die ich nicht vollständig kontrollieren.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie haben ein Flugzeug, Sie haben einen Normalenvektor und einen Ursprung. Würde ich nicht irgendwelche "Drehungen" an alle. Du bist nur ein paar Vektor-Operationen Weg von Ihrer Antwort.
Wenn Sie Kreuz-und Skalarprodukt-Funktionen bereits, dies ist nur ein paar Zeilen code. Ich weiß, dass es funktioniert, weil die meisten der 3D-Videospiele schrieb ich auf diese Weise gearbeitet haben.
Tricks:
Wie etwa:
Zerlegen der normalen-Vektor in einen Vektor in der XY-Ebene und einer Z-Vektor. Dann bewerben Sie sich eine rotation um die Z-Achse in die XY-Vektor mit einem von der Achse. Dann finden Sie das Skalarprodukt der normalen mit der Z-Achse, und drehen Sie zusammen, was je von X,Y ausgerichtet.
Die Idee ist, der Linie der normalen-Vektor mit Z, und dadurch, dass Ihr Flugzeug ist jetzt der XY-Ebene.
Zwar gab es weitere interessante Antworten, das ist die Lösung fanden wir heraus, während der Wartezeit für Antworten:
(Es ist die Rückkehr einer hoffentlich korrekten Doppel-rotation matrix)
Den Fehler hatten wir vor und fixierte dabei war die esp. deal mit dem Vorzeichen der X-Komponente, der nicht überdacht war in den Cosinus-Berechnungen. Dies machte uns drehen in die falsche Richtung, sobald (drehen mit 180° - Winkel).
Ich hoffe ich werde auch Zeit finden, um zu versuchen, Nosredna Lösung! Es ist immer gut, um zu vermeiden, Trigonometrie.