Ich habe ein Bild mit und habe ein paar Werte, um es zu einer Perspektive in Silverlight zu machen, kann aber nicht genau herausfinden, was ich mathematisch tun muss, um es zu verwirklichen. Das Wichtigste ist, dass ich einen Winkel habe, der "Sichtfeld" ( FOV ) genannt wird.
Das ist das normale Bild:
Zum Beispiel:
%Vor%Jede Hilfe wäre willkommen, mich durch die Mathematik zu führen, um diese in Silverlight zu reproduzieren.
Ich denke, das Problem, mit dem jeder konfrontiert ist, ist, dass es eine Verschiebung des Darstellungsbereichs zusammen mit der Perspektiventransformation geben muss.
Probieren Sie es aus:
%Vor%Dies wird die passende Verschiebung der Perspektive erzeugen und mit dem übereinstimmen, was PowerPoint produziert.
Dieser Code wurde aus MSDN .
Es sieht so aus, als ob Sie Ihr Quellbild mit einem von mehreren möglichen Sichtfeldern behandeln, z. wie mit einem Weitwinkelobjektiv für das 120 ° oder einem Zoomobjektiv für das 30 °. Sie versuchen dann, das Seitenverhältnis der ursprünglichen Szene zu reproduzieren, wenn sie angezeigt wird. Ist das korrekt?
Wenn ja, wollen Sie das Bild horizontal strecken, um die implizite Breite wiederherzustellen, bevor Sie es mit der perspektivischen Transformation drehen. Das würde bedeuten, dass Sie tatsächlich versuchen, 2 separate (einfachere) mathematische Probleme hier zu lösen, zum Beispiel:
Die Schwierigkeit besteht darin, dass die Beispielfotos keine spezifischen Regeln für das Display angeben. Die Anzeigebreiten variieren alle, so dass ich nicht herausfinden kann, was dein Endergebnis sein soll. Wenn Sie mehr Informationen zur Verfügung stellen können, sollte ich in der Lage sein, spezifische Berechnungen zu liefern.
Ok, basierend auf der Verwendung der Perspektiveneinstellungen in PowerPoint sind die 2 erforderlichen Schritte tatsächlich:
Die erste Berechnung ist sehr einfach. Sie müssen die Skalierung auf Cosinus (X-Winkel) einstellen. Die zweite ist eine Schätzung, da der Winkel der Powerpoint-Perspektive nicht mit der Rotation zu tun hat.
Ich habe unten einen vollständigen Beispiel-XAML und Code-Behind bereitgestellt, um die angezeigte App * zu generieren.
*** Hinweis: Es besteht ein schwerwiegender Fehler darin, dass Projektionsumwandlungen das Bild nicht in dem gewünschten Maße verzerren können. Ich versuche stattdessen Matrix3DProjection, Lösung folgt **
%Vor%Code dahinter:
%Vor%Dies sollte Ihnen ein Handle-Test-Framework geben, um Variationen auszuprobieren. Ich habe die Berechnungsschritte neu berechnet, um sie deutlicher zu machen.
Verwenden Sie Matrix3DProjection und legen Sie sie fest Transformation basierend auf Matrix am Ende von diese Funktion von Direct3D zur Verfügung gestellt . Sie benötigen Ihr FOV im Bogenmaß, Seitenverhältnis für den Bildschirm und zwei Abstände für das Beschneiden (Sie definieren den endlichen Kegelstumpf). Wenn Sie nach einer weiteren Erklärung suchen, warum es so eingestellt ist, sollten Sie sich ein Buch über Computergrafik besorgen. Auch ist es üblich, dass die Matrix für die Projektionstransformation nur den Ansichts-Kaugummi einstellt. Rotatin-Objekte um die X-Achse werden durch separate Transformation ausgeführt, aber es ist eine allgemeine Praxis von Computergrafiken, und ich bin mir nicht sicher, ob es in Silverlight gleich funktioniert.
Bearbeiten:
Wenn Sie sowohl Rotation als auch verwenden müssen Projektion in einer einzigen Matrix versuchen zu verwenden dieser:
%Vor%Wo X in cos (X) und sin (X) ist dein Rotation um X asis im Bogenmaß
z ist die Translation in Z-Richtung weil du mitziehen musst Dein Bild um es ganz zu sehen.
yScale = Kinderbett (FOV / 2) FOV ist in Radiant
xScale = yScale / aspectRatio Aspekt Verhältnis ist definiert durch Höhe und Breite des für die Bildwiedergabe verwendeten Panels
zn = Z near - alles davor ist abgeschnitten. zf = Z weit - alles nachdem dies abgeschnitten ist. Sei dir bewusst, dass z Koordinate des Bildes muss dazwischen sein diese zwei.
Es ist lange her, seit ich das letzte Mal getan habe Zeit also hoffe ich habe ich berechnet Transformation richtig. Matrix Multiplikation sollte aber korrekt sein Es gibt eine Chance, dass ich es multiplizierte in falscher Reihenfolge.
Bearbeiten2:
Mein vorheriger Vorschlag funktioniert nicht. Erste für die Berechnung verwendete Matrizen sind falsch, da Silverlight transponierte Versionen verwendet. Die zweite Umwandlung von Bild zu Bildmitte und Ansichtsfenster wird nicht verwendet. Ich habe Alisons vorgeschlagenen Code kombiniert (kann auch gefunden werden hier ) mit Änderungen, um die Silverlight-Anwendung von FovX und HiTech Magic zu verwenden. Ich habe noch nie Silverlight-App geschrieben ... Hier funktioniert das Beispiel:
%Vor%Meine lineare Algebra ist etwas rostig, aber ich bin zuversichtlich, dass ich helfen kann, aber dieser Artikel > sieht so aus, als könnte es ein guter Startplatz für dich sein
Okay. Ich habe Ladislav Mrnkas Matrix-Transformations-Antwort mit meiner vorherigen Beispiel-App kombiniert, aber in ihrem 3D-Matrix-Beispiel scheint es einige Tippfehler gegeben zu haben, und ich bin nicht stark genug mit 3D-Matrix-Mathe, um es zu korrigieren. Das Endergebnis ist eine leere Anzeige, wo das Bild sein sollte :(
Anstatt diese Party zu starten, habe ich eine vollständige interaktive Test-App (unten) mit Xaml zur Verfügung gestellt, damit Ladislav Mrnka (oder jemand anderes mit besserer 3D-Mathematik) das Problem beheben kann.
%Vor%
Code-Behind:
%Vor%Tags und Links .net silverlight image gdi+ matrix