Wie wird diese Art der Perspektiventransformation in Matrix3D eingestellt?

8

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.

    
Todd Main 14.07.2010, 21:37
quelle

7 Antworten

6

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 .

    
Jordan Arron 24.08.2010, 14:34
quelle
3

Nachdem ich damit viel gespielt habe, stimme ich der Matrix-Antwort von "Ladislav Mrnka" als der einfachsten Lösung zu und habe ihre Antwort neu abgestimmt.

Lassen Sie das Beispiel unten einfach, um Ihnen etwas zum Spielen zu geben, aber Sie müssen es über eine Matrix3DProjection aktualisieren.

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:

  • Berechnen Sie die Anzeigebreite des Bildes basierend auf FOV, Seitenverhältnis & amp; Breite (mit X-Skalierung).
  • Berechnen Sie die gewünschte Drehung für eine perspektivische Transformation einer bestimmten Breite innerhalb einer gewünschten Anzeigebreite (Projektion um die Y-Achse).

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:

  • Skaliere die horizontale Größe (entsprechend deinem "X" -Winkel)
  • Wenden Sie eine Projektionstransformation an, um den Perspektivenwinkel in PowerPoint
  • zu emulieren

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.

    
Gone Coding 22.08.2010 12:17
quelle
2

Siehe dies und dieser Artikel. Suche "Perspektive" auf der Seite.

    
moldovanu 15.07.2010 12:40
quelle
2

Dies scheint Ihr Szenario genau zu erklären.

    
AlexEzh 22.08.2010 02:54
quelle
2

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%     
Ladislav Mrnka 22.08.2010 14:43
quelle
1

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

    
µBio 14.07.2010 21:50
quelle
1

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%     
Gone Coding 23.08.2010 20:10
quelle

Tags und Links