2012-12-28 2 views
7

나는 지난 며칠 동안 처음으로 레이 트레이서를 해킹 해왔다. 그러나, 저를 괴롭히는 몇 가지 단점이 있으며 실제로 해결 방법을 모르겠습니다. 처음부터 거기에 있었던 것은 장면의 구체의 모양입니다. 렌더링 될 때 실제로는 타원처럼 보입니다. 물론 장면에는 원근법이 있지만 최종 모양은 여전히 ​​이상하게 보입니다. 샘플 렌더링을 첨부했습니다. 문제는 이미지 왼쪽 하단의 반사 구체에서 특히 볼 수 있습니다.raytracer로 타원형으로 렌더링되는 이유는 무엇입니까?

Sample Image

난 정말이 원인이 될 수 모르겠어요. 다음과 같이 보이는 광선 구 교차 코드 일 수 있습니다.

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

또는 다른 것이 될 수 있습니다. 누구나 아이디어가 있습니까? 정말 고마워!

+0

게다가, 나는 내 굴절이 꺼져 있다는 느낌을 가지고있다. (오른쪽의 구면을 보자. 굴절률은 1.8이다.) 너희들도 그렇게 생각하니? – user1845810

+0

화면 중앙에 볼 하나만 렌더링하면 어떻게됩니까? – OopsUser

답변

4

너는 매우 폭이 넓은 것 같습니다 (field of view (FoV)). 이것은 어안 렌즈의 효과를 제공하여 특히 가장자리를 향해 그림을 왜곡시킵니다. 일반적으로 90도 (즉, 어느 방향 으로든 45도)와 같은 것이 합리적인 그림을 제공합니다.

굴절은 실제로 아주 좋아 보입니다. 그것은 굴절률이 너무 높기 때문에 거꾸로되어 있습니다. 좋은 사진은 this question입니다.

+0

예, 그게 해결책입니다! FOV가 프로젝트의 시작 이후로 변경되지 않은 유일한 매개 변수 였기 때문에 나는 그것에 대해 스스로 생각할 수있었습니다. 엄청 고마워 :) – user1845810