Tutorial di raycast / domanda di matematica vettoriale


8

Sto guardando questo simpatico tutorial di raycasting su http://lodev.org/cgtutor/raycasting.html e ho una domanda matematica probabilmente molto semplice.

Nell'algoritmo DDA non riesco a capire il calcolo delle variabili deltaDistX e deltaDistY, che sono le distanze che il raggio deve percorrere da 1 lato x al lato x successivo o da 1 lato y al successivo lato y, nella griglia quadrata che costituisce la mappa del mondo (vedi screenshot sotto).

inserisci qui la descrizione dell'immagine

Nel tutorial sono calcolati come segue, ma senza molte spiegazioni:

//length of ray from one x or y-side to next x or y-side
double deltaDistX = sqrt(1 + (rayDirY * rayDirY) / (rayDirX * rayDirX));
double deltaDistY = sqrt(1 + (rayDirX * rayDirX) / (rayDirY * rayDirY));

rayDirY e rayDirX sono la direzione di un raggio che è stato lanciato.

Come si ottengono queste formule? Sembra che il teorema di Pitagora ne faccia parte, ma in qualche modo c'è divisione coinvolta qui. Qualcuno può darmi un'idea di quale conoscenza matematica mi manca qui, o "provare" la formula mostrando come è derivata?


Probabilmente ti piacerebbe anche controllare scratchapixel.com/lessons/3d-basic-lessons/… che ha una spiegazione molto bella e dettagliata di DDA.
Grieverheart,

Risposte:


8

Ah si Ho lanciato la mia matematica e penso di averlo colpito. Hai ragione, implica il teorema di Pitagora e qualche ridimensionamento.

Inizi con il tuo vettore normalizzato che rappresenta il tuo raggio.

inserisci qui la descrizione dell'immagine

Ha un xcomponente e un ycomponente. Innanzitutto vogliamo vedere quanto tempo passa quando percorre un'unità nella xdirezione. Quindi cosa facciamo? Vogliamo ridimensionare l'intero vettore in modo che il xcomponente sia uguale 1. Per capire da cosa ridimensionarlo, facciamo quanto segue:

scaleFactor = 1/rayDirX;

Scriverlo in matematica è davvero giusto

scaledX = rayDirX * (1/rayDirX) = 1

Quindi possiamo chiamarlo così 1.

Quindi per il ycomponente:

scaledY = rayDirY * (1/rayDirX) = rayDirY/rayDirX

Quindi ora abbiamo i nostri componenti in scala come (1, rayDirY/rayDirX)

Ora vogliamo sapere la lunghezza. Ora entra in gioco Pitagora. Che è

length = sqrt((x * x) + (y * y))

Quindi collegando i nostri componenti in scala otteniamo:

length = sqrt((1 * 1 ) + (rayDirY / rayDirX) * (rayDirY / rayDirX))

Applicare un po 'di algebra e semplificare e otteniamo:

length = sqrt(1 + (rayDirY * rayDirY) / (rayDirX * rayDirX))

Lo stesso vale per la lunghezza quando il ycomponente viaggia di un'unità, tranne che avremo (rayDirX/rayDirY, 1)quali risultati

length = sqrt(1 + (rayDirX * rayDirX) / (rayDirY * rayDirY))

Lì abbiamo le tue due equazioni dalla tua domanda. Piuttosto pulito. Grazie per l'esercizio di algebra.


ahh mi hai battuto! Molto bella!
Filippo,

Ah, ho continuato a controllare per vedere se c'erano nuove risposte! Mi sembrava di correre qualcuno :)
MichaelHouse

Molto bello, grazie! Era molto meno ovvio di quanto mi aspettassi.
mattboy,

Ho trovato la risposta solo quando ho rinunciato a provare a decodificarla e ho cercato di scoprire come avrei ottenuto quel valore se l'avessi fatto. Ho pensato che forse ridimensionare il vettore sarebbe stato una specie di scorciatoia, ma si scopre che è allo stesso modo in cui lo stanno facendo :)
MichaelHouse

1

Supponendo che la lunghezza unitaria di ciascuna distanza della griglia sia 1.

Il triangolo (Triangolo 1) nel diagramma pubblicato (domanda OP) costituito deltaDistXda ipotenusa, ha lo stesso valore del coseno del suo angolo del valore del coseno dell'angolo formato nel triangolo formato dai componenti del rayDir# Vector(Triangolo 2)

Quindi è possibile equiparare quanto segue ( magnitudo vettoriale qui sotto ) e semplificato (1-3)

Ricorda: cos = Base / Hypotenuse

0. cosine_triangle_2                   = cosine_triangle_1
1. rayDirX/sqrt(rayDirX^2 + rayDirY^2) = 1/deltaDistX
2. (rayDirX*deltaDistX)^2              = rayDirX^2 + rayDirY^2
3. deltaDistX                          = sqrt(1+ rayDirY^2/rayDirX^2)

Allo stesso modo l'equazione per deltaDistYpuò essere derivata.

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.