2012-12-28 20 views
7

Przez ostatnie kilka dni hakowałem raytracera po raz pierwszy. Jest jednak kilka dziwactw, które mnie niepokoją i naprawdę nie wiem, jak się uczyć. To, co było tam od początku, to kształt sfer w scenie - gdy są renderowane, faktycznie wyglądają jak owale. Oczywiście na scenie jest perspektywa, ale ostateczny kształt nadal wydaje się dziwny. Dołączyłem renderowanie próbek, problem, który mam, jest szczególnie widoczny w sferze odbijającej w lewej dolnej części obrazu.Dlaczego raytracer renderuje kule jako owale?

Sample Image

ja naprawdę nie wiem, co może być przyczyną tego. Może to być kod przecięcia sfery promienistej, który wygląda następująco:

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

A może to być coś innego. Czy ktoś ma pomysł? Dzięki wielkie!

+0

Poza tym, mam także wrażenie, że moje załamania są wyłączone (patrz sfera po prawej, współczynnik załamania to 1,8). Czy zgadzacie się z tym? – user1845810

+0

Co się stanie, gdy renderujesz tylko jedną kulkę na środku ekranu? – OopsUser

Odpowiedz

4

Wygląda na to, że używasz naprawdę szerokiego field of view (FoV). Daje to efekt obiektywu typu "rybie oko", zniekształcającego obraz, zwłaszcza w kierunku krawędzi. Zwykle coś w rodzaju 90 stopni (to znaczy 45 stopni w dowolnym kierunku) daje rozsądny obraz.

Załamanie wygląda całkiem nieźle; jest odwrócony, ponieważ wskaźnik refrakcji jest tak wysoki. Ładne zdjęcia są w this question.

+0

To jest rozwiązanie! Mógłbym o tym pomyśleć, ponieważ FOV był mniej więcej jedynym parametrem, którego nigdy nie zmieniłem od początku projektu. Wielkie dzięki :) – user1845810