Estoy usando una cámara ortográfica para renderizar cortes de un modelo (para voxelizarlo). Represento cada corte desde arriba y desde abajo para determinar qué hay dentro de cada corte.
El modelo que renderizo es una simple forma de 'T' construida a partir de dos cubos. Los cubos tienen las mismas dimensiones y tienen la misma coordenada Y (altura). Aquí hay un render en Blender:
Represento este modelo una vez directamente desde arriba y una vez directamente desde abajo. Mi expectativa era que obtendría exactamente la misma imagen (excepto para reflejar sobre el eje y). Sin embargo, cuando renderizo usando un objetivo de renderizado de muy baja resolución (25x25), la posición (en píxeles) de la 'T' es diferente cuando se representa desde arriba en lugar de representarse desde abajo. Consulte las figuras 2 y 3. Los bloques de color rosa no son parte de la representación original, pero los he agregado para que pueda contar / ver fácilmente las diferencias.
Rendido desde arriba
Rendido desde abajo
Esto probablemente se deba a lo que he leído sobre las coordenadas de píxeles y texel que pueden estar sesgadas en la esquina superior izquierda como se ve desde la cámara. Como estoy usando el mismo vector 'arriba' para ambas cámaras, mi sesgo solo se muestra en el eje x. Traté de cambiar la posición de la cámara y, según mi opinión, debería ser medio píxel. He intentado tanto cambiar una sola cámara como cambiar ambas cámaras y, aunque veo algún efecto, no puedo obtener una copia perfecta de píxel por píxel de ambas cámaras.
Aquí inicializo la cámara y calculo, lo que creo que es, medio píxel. límitesDimX y límitesDimZ es un cuadro delimitador ligeramente ampliado alrededor del modelo que también utilizo como ancho y alto del volumen de visualización de la cámara ortográfica.
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;
Este es el código donde configuro la posición de la cámara y miras
// 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);
}
Pregunta principal Ahora que ha visto todos los problemas y el código, puede adivinarlo. Mi pregunta principal es ¿Cómo alineo ambas cámaras para que cada una represente exactamente la misma imagen (reflejada a lo largo del eje Y)?
Respuestas:
Esta es una visión diferente del problema presentado, que podría ayudar a evitar por completo los problemas de diferencias de rasterización
¿Consideró mantener todo en su lugar, pero escalando la Y del modelo (cubos) en '-1' a lo largo del plano de sección? Entonces tendrás todo exactamente igual, excepto los objetos que se voltean boca abajo, lo que significa que obtendrás sus lados negativos para tu objetivo. Por supuesto, también deberá '-1' las normales y los polígonos orientados hacia las direcciones.
fuente