Billboard-Rendering ohne Verzerrung?


8

Ich verwende den Standardansatz für das Billboarding in Unity, der in Ordnung, aber nicht ideal ist:

transform.LookAt(camera)

Das Problem ist, dass dies zu Verzerrungen in Richtung der Ränder des Ansichtsfensters führt, insbesondere wenn der Sichtfeldwinkel größer wird. Dies ist anders als das perfekte Billboarding, das Sie z. Untergang, wenn Sie einen Feind aus einem beliebigen Winkel sehen und unabhängig davon, wo er sich auf dem Bildschirm befindet.

Natürlich gibt es Möglichkeiten, ein Bild direkt in das Ansichtsfenster zu verschieben, das um einen einzelnen Scheitelpunkt zentriert ist, aber ich mag keine Shader.

Hat jemand Beispiele für diesen Ansatz (GLSL, wenn möglich) oder Vorschläge, warum dies normalerweise nicht auf diese Weise erfolgt (im Vergleich zu der oben genannten Quad-Transformationsmethode)?

EDIT: Ich war verwirrt, danke Nathan für das Heads-up. Wenn die Quads in die Kamera schauen, sind sie natürlich nicht parallel zur Ansichtsebene - was ich brauche.

Antworten:


4

Ihre Frage verwirrt mich, denn in einer perspektivischen Standardprojektion führt das Zeichnen einer Werbetafel parallel zur Ansichtsebene nicht zu Verzerrungen. Dies entspricht dem Überblenden des Bilds an das Ansichtsfenster mit einer gewissen Skalierung, wobei die Skalierung von der Tiefe abhängt (senkrechter Abstand von der Ansichtsebene).

Die "Verzerrung", die Sie sehen, kann auftreten, wenn das System die Partikel tatsächlich so ausrichtet, dass sie zur Kamera und nicht zur Ansichtsebene zeigen. Dies führt zu Schrägstellungen in der Nähe der Bildschirmkanten. Oder Sie sehen möglicherweise, dass sich die Skalierung des Sprites ändert, wenn Sie die Kamera drehen. Wenn der Abstand zur Ansichtsebene und nicht zur Kamera gemessen wird, wird das Sprite "näher" und damit größer, wenn es außerhalb des Bildschirms angezeigt wird.


1
@NickWiggill Ich bin nicht speziell mit Unity vertraut, aber wenn Sie möchten, dass die Quads zur Ansichtsebene und nicht zur Kamera zeigen, setzen Sie die Rotationsmatrix des Quad im Wesentlichen gleich der Rotationsmatrix der Kamera. Je nachdem, wie die Quads aufgebaut sind, benötigen Sie möglicherweise eine zusätzliche 180-Grad-Drehung.
Nathan Reed

1

Ich glaube, Sie können die oberste 3x3-Matrix (in Spalten-Hauptsprache) auf die Identität einstellen, um dies zu tun. Ich sehe keinen Grund, warum Sie dies im Shader nicht tun konnten, aber Sie könnten auf diese Weise mehr Arbeit leisten. Auf diese Weise würden Sie die Skalierung (in Ihrer Xformationsmatrix) verlieren.

Bearbeiten: Dieser Artikel war hilfreich für mich beim Plakatieren und Betrügen:

http://www.flipcode.com/archives/Billboarding-Excerpt_From_iReal-Time_Renderingi_2E.shtml

Ich weiß nicht, wie konventionell das ist, aber ich nenne es "Betrug", wenn die Perspektive beibehalten wird, und "Plakatierung", wenn dies nicht der Fall ist.


Mir ist etwas klar geworden. Ich verwende Unity iOS / Android und einige der älteren Geräte sind OpenGL ES 1.1 - also feste Pipeline. Es ist also entscheidend, es ohne Shader zu machen. Wie würde ich das machen, ohne es im Shader zu tun?
Ingenieur

1
Das ist wahrscheinlich sowieso der billigere Weg. In meinem Code habe ich eine Flagge auf meinen Sprites, die vorschreibt, ob eine Werbetafel oder ein Betrüger erstellt werden soll, bevor Draw Calls getätigt werden. Wenn dies der Fall ist, nehme ich einfach die aktuelle Matrix, setze das obere 3x3 auf Identität und aktualisiere dann die aktuelle Matrix.
Notlesh

Ah ... schätze das zusätzliche Detail, aber da ich keinen Zugriff auf GL-Anrufe habe (Unity abstrahiert das weg), denke ich, dass ich von diesem Ansatz ziemlich begeistert bin.
Ingenieur

Sie können die aktuelle Matrix nicht abrufen oder einstellen? Ich habe noch nie Unity verwendet ... Wenn nicht, versuchen Sie vielleicht, nach "Unity Billboarding" oder "Unity Impostering" zu
suchen
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.