2012-12-28 29 views
7

Ho hackerato un raytracer per la prima volta negli ultimi giorni. Tuttavia, ci sono alcune stranezze che mi infastidiscono e non so davvero come risolverlo. Uno che è stato lì fin dall'inizio è la forma delle sfere nella scena - quando renderizzate, in realtà sembrano ovali. Certo, c'è una prospettiva nella scena, ma la forma finale sembra ancora strana. Ho allegato un rendering di esempio, il problema che ho è particolarmente visibile sulla sfera riflettente nella parte in basso a sinistra dell'immagine.Perché raytracer rende le sfere come ovali?

Sample Image

io non so davvero che cosa potrebbe causare questo. Potrebbe essere il codice di intersezione raggio-sfera che appare come segue:

bool Sphere::intersect(Ray ray, glm::vec3& hitPoint) { 
//Compute A, B and C coefficients 
float a = glm::dot(ray.dir, ray.dir); 
float b = 2.0 * glm::dot(ray.dir, ray.org-pos); 
float c = glm::dot(ray.org-pos, ray.org-pos) - (rad * rad); 

// Find discriminant 
float disc = b * b - 4 * a * c; 

// if discriminant is negative there are no real roots, so return 
// false as ray misses sphere 
if (disc < 0) 
    return false; 

// compute q 
float distSqrt = sqrt(disc); 
float q; 
if (b < 0) 
    q = (-b - distSqrt)/2.0; 
else 
    q = (-b + distSqrt)/2.0; 

// compute t0 and t1 
float t0 = q/a; 
float t1 = c/q; 

// make sure t0 is smaller than t1 
if (t0 > t1) { 
    // if t0 is bigger than t1 swap them around 
    float temp = t0; 
    t0 = t1; 
    t1 = temp; 
} 

// if t1 is less than zero, the object is in the ray's negative direction 
// and consequently the ray misses the sphere 
if (t1 < 0) 
    return false; 

// if t0 is less than zero, the intersection point is at t1 
if (t0 < 0) { 
    hitPoint = ray.org + t1 * ray.dir; 
    return true; 
} else { // else the intersection point is at t0 
    hitPoint = ray.org + t0 * ray.dir; 
    return true; 
    } 
} 

Oppure potrebbe essere un'altra cosa. Qualcuno ha un'idea? Grazie mille!

+0

Inoltre, ho anche la sensazione che le mie rifrazioni siano disattivate (vedi la sfera a destra, l'indice di rifrazione è 1.8). Siete d'accordo con voi ragazzi? – user1845810

+0

Cosa succede quando si esegue il rendering di una palla al centro dello schermo – OopsUser

risposta

4

Sembra che tu stia utilizzando uno spazio molto ampio field of view (FoV). Questo dà l'effetto di un obiettivo fish-eye, distorcendo l'immagine, specialmente verso i bordi. Tipicamente qualcosa come 90 gradi (cioè 45 gradi in entrambe le direzioni) dà un'immagine ragionevole.

La rifrazione in realtà sembra abbastanza buona; è invertito perché l'indice di rifrazione è così alto. Belle foto sono in this question.

+0

Sì, questa è la soluzione! Avrei potuto pensarci da solo perché il FOV era più o meno l'unico parametro che non ho mai cambiato dall'inizio del progetto. Grazie mille :) – user1845810