La imagen renderizada desde arriba y abajo usando una cámara ortográfica no coincide

8

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:

El modelo T

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 Desde arriba

Rendido desde abajo 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)?

Roy T.
fuente
La solución hasta ahora parece ser mover la cámara que toma una imagen desde abajo exactamente un píxel a la izquierda (-x). Sin embargo, no puedo explicar por qué y, por lo tanto, no puedo garantizar que funcione para todo lo que le arroje. ¿Algunas ideas?
Roy T.
¿Pensó en mantener todo en su lugar, pero escalando la Y del modelo (cubos) en -1? Entonces tendría todo lo mismo, excepto los objetos que se voltean. PD: Por supuesto, también necesitarás -1 las caras normales y de polígonos.
Kromster
Esa es realmente una idea genial
Roy T.
Desde que lo aprueba, lo publiqué como respuesta. ¡Dime si funciona para ti!
Kromster

Respuestas:

2

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.

Kromster
fuente
Aunque su respuesta no explica por qué mi método no funcionó. (Y para eso estaba la recompensa) No otorgaré la recompensa en este momento. Pero debido a que es una buena sugerencia, la recompensa automática del 50% se le debe otorgar en un día, y creo que se lo merece :).
Roy T.
@RoyT .: Suena justo. Sin embargo, aún debe decirnos si la solución sugerida resolvió su problema, para que otras personas que enfrentan el mismo problema sepan cómo manejarlo.
Kromster