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:
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 unten gerendert
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)?
Antworten:
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.
quelle