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:
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
Reso dal basso
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)?