Von oben und unten mit einer orthografischen Kamera gerenderte Bilder stimmen nicht überein

8

Ich verwende eine orthografische Kamera, um Schnitte eines Modells zu rendern (um es zu voxelisieren). Ich rendere jedes Slice sowohl von oben als auch von unten, um festzustellen, was sich in jedem Slice befindet.

Das Modell, das ich rendere, ist eine einfache T-Form, die aus zwei Würfeln besteht. Die Würfel haben die gleichen Abmessungen und die gleiche Y-Koordinate (Höhe). Hier ist ein Rendering davon in Blender:

Das T-Modell

Ich rendere dieses Modell einmal direkt von oben und einmal direkt von unten. Meine Erwartung war, dass ich genau das gleiche Bild erhalten würde (außer beim Spiegeln über die y-Achse). Wenn ich jedoch mit einem Renderziel mit sehr niedriger Auflösung (25 x 25) rendere, unterscheidet sich die Position (in Pixel) des 'T' beim Rendern von oben im Gegensatz zum Rendern von unten. Siehe Abbildung 2 und 3. Die rosa Blöcke sind nicht Teil des ursprünglichen Renderings, aber ich habe sie hinzugefügt, damit Sie die Unterschiede leicht zählen / sehen können.

Von oben gerendert Von oben

Von unten gerendert Von unten

Dies liegt wahrscheinlich an dem, was ich über Pixel- und Texelkoordinaten gelesen habe , die von der Kamera aus gesehen nach oben links vorgespannt sein könnten. Da ich für beide Kameras denselben Aufwärtsvektor verwende, wird meine Vorspannung nur auf der x-Achse angezeigt. Ich habe versucht, die Position der Kamera zu ändern, und sie sollte, wie ich dachte, ein halbes Pixel betragen. Ich habe versucht, sowohl eine einzelne Kamera als auch beide Kameras zu verschieben, und obwohl ich einen Effekt sehe, kann ich von beiden Kameras keine pixelweise perfekte Kopie erhalten.

Hier initialisiere ich die Kamera und berechne, was ich glaube, ein halbes Pixel. boundsDimX und boundsDimZ ist ein leicht vergrößerter Begrenzungsrahmen um das Modell, den ich auch als Breite und Höhe des Ansichtsvolumens der orthografischen Kamera verwende.

Matrix projection = Matrix.CreateOrthographic(boundsDimX, boundsDimZ, 0.5f, sliceHeight + 0.5f);
Vector3 halfPixel = new Vector3(boundsDimX / (float)renderTarget.Width, 0, 
    boundsDimY / (float)renderTarget.Height) * 0.5f;

Dies ist der Code, in dem ich die Kameraposition und die Kameraeinstellungen einstelle

  // Position camera                      
                if (downwards)
                {
                    float cameraHeight = bounds.Max.Y + 0.501f - (sliceHeight * i);
                    Vector3 cameraPosition = new Vector3
                    (
                        boundsCentre.X, // possibly adjust by half a pixel?
                        cameraHeight,
                        boundsCentre.Z
                    );
                    camera.Position = cameraPosition;
                    camera.LookAt = new Vector3(cameraPosition.X, cameraHeight - 1.0f, cameraPosition.Z);

                }
                else
                {
                    float cameraHeight = bounds.Max.Y - 0.501f - (sliceHeight * i);
                    Vector3 cameraPosition = new Vector3
                    (
                        boundsCentre.X,
                        cameraHeight,
                        boundsCentre.Z
                    );
                    camera.Position = cameraPosition;
                    camera.LookAt = new Vector3(cameraPosition.X, cameraHeight + 1.0f, cameraPosition.Z);
                }

Hauptfrage Jetzt haben Sie alle Probleme und den Code gesehen, die Sie erraten können. Meine Hauptfrage ist. Wie richte ich beide Kameras so aus, dass sie jeweils genau dasselbe Bild wiedergeben (entlang der Y-Achse gespiegelt)?

Roy T.
quelle
Die Lösung scheint bisher darin zu bestehen, die Kamera, die ein Bild von unten aufnimmt, genau ein Pixel nach links zu bewegen (-x). Ich kann jedoch nicht erklären, warum und kann daher nicht garantieren, dass es für alles funktioniert, was ich darauf werfe. Irgendwelche Ideen?
Roy T.
Haben Sie darüber nachgedacht, alles an Ort und Stelle zu halten, aber das Y des Modells (Würfel) um -1 zu skalieren? Dann hätten Sie alle gleich, außer dass die Objekte umgedreht werden. PS Natürlich müssen Sie auch die Normalen und Polygonenflächen -1.
Kromster
Das ist eigentlich eine ziemlich coole Idee
Roy T.
Seit Sie zustimmen, habe ich es als Antwort gepostet. Sag mir, ob es bei dir funktioniert!
Kromster

Antworten:

2

Dies ist eine andere Sichtweise auf das vorgestellte Problem, die dazu beitragen kann, Probleme mit Rasterungsunterschieden insgesamt zu vermeiden

Haben Sie darüber nachgedacht, alles an Ort und Stelle zu halten, aber das Y des Modells (Würfel) entlang der Schnittebene um '-1' zu skalieren? Dann haben Sie alles genau gleich, außer dass die Objekte auf den Kopf gestellt werden - was bedeutet, dass Sie ihre Nachteile für Ihr Ziel erhalten. Natürlich müssen Sie auch die Normalen und Polygone in Richtung "-1" setzen.

Kromster
quelle
Ihre Antwort erklärt jedoch nicht, warum meine Methode nicht funktioniert hat. (Und dafür war das Kopfgeld da) Ich werde das Kopfgeld jetzt nicht vergeben. Aber weil es ein guter Vorschlag ist, sollte Ihnen die automatische Prämie von 50% an einem Tag gutgeschrieben werden, und ich denke, Sie haben es verdient :).
Roy T.
@ RoyT.: Klingt fair. Sie sollten uns jedoch dennoch mitteilen, ob die vorgeschlagene Lösung Ihr Problem gelöst hat, damit andere, die mit demselben Problem konfrontiert sind, wissen, wie sie damit umgehen sollen.
Kromster