L'immagine riprodotta dall'alto e dal basso usando una macchina fotografica ortografica non corrisponde


8

Sto usando una macchina fotografica ortografica per eseguire il rendering delle sezioni di un modello (al fine di voxelizzarlo). Rendo ogni fetta sia dall'alto che dal basso al fine di determinare cosa c'è dentro ogni fetta.

Il modello che rendering è una semplice forma a "T" costruita da due cubi. I cubi hanno le stesse dimensioni e le stesse coordinate Y (altezza). Ecco un rendering in Blender:

Il modello T.

Rendo questo modello una volta direttamente dall'alto e una volta direttamente dal basso. La mia aspettativa era che avrei ottenuto esattamente la stessa immagine (tranne che per il mirroring sull'asse y). Tuttavia, quando eseguo il rendering utilizzando un obiettivo di rendering a risoluzione molto bassa (25x25), la posizione (in pixel) della "T" è diversa quando viene visualizzata dall'alto rispetto al rendering dal basso. Vedi figure 2 e 3. I blocchi rosa non fanno parte del rendering originale ma li ho aggiunti in modo da poter contare / vedere facilmente le differenze.

Resi dall'alto Da sopra

Reso dal basso Da sotto

Ciò è probabilmente dovuto a ciò che ho letto sulle coordinate pixel e texel che potrebbero essere distorte in alto a sinistra come visto dalla telecamera. Dal momento che sto usando lo stesso vettore "su" per entrambi i miei obiettivi, il mio bias viene visualizzato solo sull'asse x. Ho provato a cambiare la posizione della fotocamera e il suo aspetto, quello che pensavo, dovrebbe essere mezzo pixel. Ho provato sia a spostare una singola fotocamera sia a spostare entrambe le fotocamere e mentre vedo qualche effetto non sono in grado di ottenere una copia perfetta pixel per pixel da entrambe le fotocamere.

Qui inizializzo la fotocamera e calcolo, ciò che credo sia, mezzo pixel. boundsDimX e boundsDimZ è un riquadro di delimitazione leggermente ingrandito attorno al modello che utilizzo anche come larghezza e altezza del volume di visualizzazione della videocamera ortografica.

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;

Questo è il codice in cui ho impostato la posizione della telecamera e l'aspetto della telecamera

  // 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);
                }

Domanda principale Ora hai visto tutti i problemi e il codice che puoi indovinare. La mia domanda principale è. Come faccio ad allineare entrambe le telecamere in modo che ognuna di esse renda esattamente la stessa immagine (riflessa lungo l'asse Y)?


La soluzione finora sembra essere quella di spostare la fotocamera che scatta una foto da sotto esattamente di un pixel a sinistra (-x). Tuttavia, non posso spiegare perché e quindi non posso garantire che funzionerà per tutto ciò che gli lancio. Qualche idea?
Roy T.

Hai pensato di mantenere tutto a posto, ma ridimensionando la Y del modello (cubi) di -1? Quindi avresti lo stesso, tranne per gli oggetti che vengono capovolti. PS Naturalmente dovrai -1 anche le facce dei normali e dei poligoni.
Kromster,

Questa è in realtà un'idea piuttosto interessante
Roy T.

Da quando approvi, l'ho pubblicato come risposta. Dimmi se funziona per te!
Kromster,

Risposte:


2

Questa è una visione diversa del problema presentato, che potrebbe aiutare a evitare del tutto le differenze di rasterizzazione

Hai preso in considerazione l'idea di mantenere tutto al suo posto, ma ridimensionando la Y del modello (cubi) di '-1' lungo il piano di sezione? Quindi avrai tutto esattamente lo stesso ad eccezione degli oggetti capovolti, il che significa che otterrai i loro lati negativi per il tuo obiettivo. Ovviamente dovrai '-1' anche le normali e i poligoni rivolti verso le direzioni.


Anche se la tua risposta non spiega perché il mio metodo non ha funzionato. (Ed è a questo che serve la taglia) Non assegnerò la taglia in questo momento. Ma poiché è un buon suggerimento, il premio automatico del 50% dovrebbe esserti assegnato in un giorno, e penso che te lo meriti :).
Roy T.

@RoyT .: Sembra giusto. Comunque dovresti ancora dircelo, se la soluzione suggerita ha risolto il tuo problema - in modo che altri che affrontano lo stesso problema sapranno come gestirlo.
Kromster,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.