4 Stimmen

Wie man ein Bild anhand der Kameraposition umwandelt

Ich versuche, eine perspektivische Projektion eines Bildes auf der Grundlage der Blickrichtung zu erstellen. Ich bin auf diesem Gebiet unerfahren und schaffe es nicht, das selbst zu machen. Können Sie mir bitte helfen?

Es gibt ein Bild und einen Beobachter (Kamera). Wenn die Kamera als Objekt auf einer unsichtbaren Kugel betrachtet werden kann und das Bild als eine Ebene, die durch die Mitte der Kugel geht, dann kann die Kameraposition wie folgt ausgedrückt werden:

x = d cos() cos()

y = d sin()

z = d sin() cos()

Dabei ist der Breitengrad, der Längengrad und d der Abstand (Radius) von der Mitte der Kugel, in der sich die Mitte des Bildes befindet.

Ich habe diese Formeln irgendwo gefunden, aber ich bin mir nicht sicher, was die Koordinaten angeht (ich weiß es nicht, aber es sieht für mich so aus, als ob x gleich z sein sollte, aber ich denke, das hängt vom Koordinatensystem ab).

Jetzt muss ich mein Bild so umwandeln, dass es aussieht, als würde es von der Kamera aus gesehen (in einer richtigen Perspektive). Wären Sie so freundlich, mir in wenigen Worten zu sagen, wie dies geschehen könnte? Welche Schritte sollte ich unternehmen?

Ich entwickle eine iOS-App und ich dachte, ich könnte die folgende Methode aus dem QuartzCore. Aber ich habe keine Ahnung, welchen Winkel ich dieser Methode übergeben sollte und wie ich die neuen x, y, z-Koordinaten aus der Kameraposition ableiten kann.

CATransform3D CATransform3DRotate (CATransform3D t, CGFloat angle,
    CGFloat x, CGFloat y, CGFloat z)

Bislang habe ich erfolgreich eine einfache Betrachtungsperspektive erstellt:

  1. unter Verwendung einer Identitätsmatrix (als CATransform3D-Parameter) mit der Einstellung .m34 auf 1/-1000,
  2. mein Bild um den Winkel von mit dem (0, 1, 0) Vektor drehen,
  3. Verkettung des Ergebnisses mit einer Drehung um und dem Vektor (1, 0, 0),
  4. Die Skalierung auf der Grundlage von d wird ignoriert (ich skaliere das Bild auf der Grundlage anderer Kriterien).

Aber das Ergebnis, das ich bekam, war nicht das, was ich wollte (was offensichtlich war) :-/. Die Perspektive sieht realistisch aus, solange einer der beiden Winkel nahe 0 ist. Deshalb dachte ich, es könnte einen Weg geben, irgendwie einen richtigen Winkel und die x-, y- und z-Koordinaten zu berechnen, um eine richtige Transformation zu erreichen (was vielleicht falsch ist, weil es nur meine Vermutung ist).

2voto

Mariusz Schimke Punkte 3135

Ich glaube, ich habe eine Lösung gefunden, die aber leider auf meinen eigenen Berechnungen, Gedanken und Experimenten beruht, so dass ich keine Ahnung habe, ob sie richtig ist. Scheint in Ordnung zu sein, aber Sie wissen ja...

Wenn das Koordinatensystem also so aussieht: enter image description here

und die Ebene des zu transformierenden Bildes durch die X- und die Y-Achse geht und ihr Mittelpunkt im Ursprung des Systems liegt, dann ergeben sich folgende Koordinaten:

x = d sin() cos()

y = d sin()

z = d cos() cos()

einen Vektor definieren, der im Ursprung des Koordinatensystems beginnt und auf die Position der Kamera zeigt, die das Bild beobachtet. Die d kann auf 1 gesetzt werden, so dass wir ohne weitere Normierung sofort einen Einheitsvektor erhalten. Theta ist der Winkel in der ZY-Ebene und phi ist der Winkel in der ZX-Ebene. Theta steigt von 0° bis 90° von der Z+ zur Y+-Achse, während phi von 0° bis 90° von der Z+ zur X+-Achse steigt (und in beiden Fällen bis -90° in der entgegengesetzten Richtung).

Der Transformationsvektor ist also:

x1 = -y / z

y1 = -x / z

z1 = 0.

Bei z1 = 0 bin ich mir nicht sicher. Die Drehung um die Z-Achse erschien mir jedoch falsch.

Der letzte Punkt, den es zu berechnen gilt, ist der Winkel, um den das Bild transformiert werden muss. Meiner bescheidenen Meinung nach sollte dies der Winkel zwischen dem Vektor, der auf die Kamera zeigt (x, y, z), und dem Vektor, der senkrecht auf dem Bild steht, also die Z-Achse (0, 0, 1), sein.

Das Punktprodukt zweier Vektoren ergibt den Kosinus des Winkels zwischen ihnen, also den Winkel:

\= arccos(x * 0 + y * 0 + z * 1) = arccos(z).

Daher sind der Alphawinkel und die Koordinaten x1, y1, z1 die Parameter der Methode CATransform3DRotate, die ich in meiner Frage erwähnt habe.

Ich wäre dankbar, wenn mir jemand sagen könnte, ob dieser Ansatz richtig ist. Herzlichen Dank!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X