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:
- unter Verwendung einer Identitätsmatrix (als CATransform3D-Parameter) mit der Einstellung .m34 auf 1/-1000,
- mein Bild um den Winkel von mit dem (0, 1, 0) Vektor drehen,
- Verkettung des Ergebnisses mit einer Drehung um und dem Vektor (1, 0, 0),
- 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).