Domanda

Tutti,

Sto scrivendo un ray tracer piuttosto non convenzionale per calcolare le proprietà di trasmissione del calore di vari oggetti in una scena. In questo ray tracer raggi casuali sono girati dalla superficie dei miei oggetti primitivi in ??una scena per verificare la presenza di intersezioni.

Questa particolare algoritmo richiede ogni raggio da sviluppare nello spazio primitivo poi trasformato affine dall'oggetto sorgente nello spazio mondo successivamente affine ritrasformato nello spazio primitivo di altri oggetti nella scena per controllare intersezione.

Tutto è bene fino a quando faccio una scala anisotropico ad esempio scala di un oggetto da [2 2 1] (scale isotropo vanno bene). Questo mi porta a credere che non sto trasformando la componente direzionale del raggio in modo corretto. Attualmente trasformo la direzione del raggio dallo spazio primitivo allo spazio mondo moltiplicando il componente direzionale dal trasposta della sorgente oggetti matrice inversa trasformazione e poi trasformo il raggio dallo spazio mondo per ogni spazio primitivo moltiplicando per la trasposta della destinazione oggetti trasformazione matrice.

Inoltre ho provato moltiplicando per matrice di trasformazione della fonte del primitivo di andare dal primitivo allo spazio mondo e moltiplicando per le destinazioni trasformazione inversa per passare dallo spazio mondo allo spazio primitivo, ma questo non ha avuto successo.

Credo un raggio lanciato dalla superficie di un oggetto primitivo (in un caso e in una direzione casuale) devono essere trasformati nello stesso modo come superficie normale 'regolare' ray tracing tuttavia non sono certo.

Qualsiasi degli esperti là fuori sapere qual è il difetto nella mia metodologia è? Sentitevi liberi di chiedere se è richiesto ulteriori informazioni.


L'algoritmo di base per questo raggio tracciante è il seguente:

For each object, i, in scene
{
    for each ray, r, in number of rays per object
    {
        determine random ray from primitive i
        convert ray from primitive space of i to world space

        for each object, j, in scene
        {
            convert ray to primitive space of object j
            check for intersection with object j
        }
    }
}

Speriamo che per chiarire la questione Vediamo un esempio. Assumiamo Ho un cilindro estendentesi lungo l'asse z (raggio unitario e altezza) e un anello giacente nel piano xy con diametro interno 7 e diametro esterno 8. voglio la scala del cilindro di un fattore 6 in direzione x ed y indicazioni (ma non la direzione z) in modo mia matrice di trasformazione affine sono i seguenti:

M(cylinder) = |2 0 0 0|        M^-1(cylinder) = | .5 0. 0. 0. |
              |0 2 0 0|                         | 0. .5 0. 0. |
              |0 0 1 0|                         | 0. 0. 1. 0. |
              |0 0 0 1|                         | 0. 0. 0. 1. |

M(annulus) =  |1 0 0 0|        M^-1(annulus) =  |1 0 0 0|
              |0 1 0 0|                         |0 1 0 0|
              |0 0 1 0|                         |0 0 1 0|
              |0 0 0 1|                         |0 0 0 1|

Ora assumo ho un raggio che ha un punto di partenza casuale sulla superficie del cilindro s ed una direzione casuale lontano dalla superficie del cilindro c dando r raggio (os) = s + ct.

voglio trasformare questo raggio dal primitivo (oggetto) uno spazio all'altro mondo e poi prova per intersezione con gli altri oggetti nella scena (l'anello).

La prima domanda è: qual è il modo corretto di trasformare il raggio, r (os), allo spazio mondo, r (WS), utilizzando M (cilindro) o M ^ -1 (cilindro).

La seconda domanda è qual è il modo corretto per poi trasformare i raggi, r (WS), dallo spazio mondo spazio oggetti per controllare intersezione con gli altri oggetti utilizzando M (anulare) e M ^ -1 (anulare) .


Alcune informazioni aggiuntive:

Questa applicazione è per calcolare trasferimento di calore radiante tra N oggetti. Il raggio viene lanciato da un punto casuale sull'oggetto con la sua direzione essendo scelta in modo casuale ad trovano all'interno di una distribuzione emisferica orientato con la superficie normale al punto casuale.


Ecco alcuni visualizzazione del mio problema. Il raggio di distribuzione direzionale quando viene generato prima: ray iniziale distribuzione direzionale

Se si applica la trasformazione di coordinate mondo utilizzando la matrice di trasformazione M: Direzione trasformata dal M

Se si applica la trasformazione di coordinate mondo usando l'inversetransformation matrice M ^ -1 Direzione addestrato da M ^ -1

È stato utile?

Soluzione

Questo solo è venuto l'altro giorno in Questa domanda

Uno dei collegamenti risposte a un articolo di Ray Tracing Notizie discutere l'uso della trasposizione della trasformata inversa per le normali.

Sono d'accordo con JCooper nel chiedere "che cosa sta realmente andando male?". Il mio primo pensiero è che ti sembra di essere la simulazione di trasferimento di calore irradiato, e bisogna stare attenti ridimensionamento volontà non uniforme degli oggetti. Se si ha una distribuzione uniforme di "fotoni" su un oggetto superficie essendo emessi, e poi si applica una scalatura non uniforme di tale oggetto, si avrà quindi una distribuzione non uniforme dei fotoni che lasciano la superficie. Questa è una possibile trappola, ma dal momento che non indicano cosa sta andando male è difficile dire se questo è il problema.

Per rispondere alle vostre domande circa il modo corretto di fare le trasformazioni, follow Questo collegamento a Ray Tracing Notizie

Altri suggerimenti

La matrice trasposta trasformazione inversa mantiene la rotazione costante componente, ma inverte la scala. Ciò significa che la scala è ancora lì. Questo è corretto per le normali: si consideri, in 2d, un segmento di linea da (0,0) a (707, 0,707). . I normali è (-. 707, 0,707) . Se si scala da (s, 1) , otteniamo un segmento da (0,0) a (s * 0,707, 0,707) . Al limite, il s cresce grande, che essenzialmente abbiamo una linea piatta parallela all'asse x. Ciò significa che la normale dovrebbe punto lungo l'asse y. Così otteniamo un normale di (-. 707 / s, .707) . Dovrebbe essere chiaro da questo esempio, tuttavia, che il vettore trasformato non è più unità di lunghezza. Forse avete bisogno di normalizzare la componente direzionale?

Se iniziamo utilizzando la proprietà che una matrice di trasformazione può essere rappresentato come una scala a sandwich tra due rotazioni (alla SVD), che otteniamo il vostro uscita di trasformazione aspetto della matrice in questo modo: R2 out * Sout ^ -1 * R1out e quindi la vostra trasformazione in entrata aspetto della matrice in questo modo: R1in ^ -1 * * Sin R2in ^ -1 (come vorrei così abituata mathjax ...). Questo mi sembra la cosa giusta, a patto che si ri-normalizzare i vettori.


Modifica:

Pensando a questo durante la notte, ho deciso che l'inverso-trasposta cosa potrebbe solo sarà valida per il caso normali. Si consideri l'esempio di cui sopra. Se s = 2 , quindi la pendenza della linea-segmento, originariamente 1 , si trasforma in 1/2 . Analogamente, l'inclinazione delle spire normali da -1 in -2 . C'è ancora un angolo di 90 gradi tra il segmento di linea e il raggio. Fin qui tutto bene. Ora ... cosa succede se il vettore in questione è in realtà parallela al segmento di linea. Otteniamo una pendenza di 2 , non è più parallelo.

Quindi, penso che ho due domande a questo punto. Che cosa è effettivamente va male nel programma / Cosa ti fa pensare che non è corretto? E qual è il corretta comportamento? Forse si può fare un plot 2D.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top