为什么raytracer渲染球体为椭圆形?

在过去的几天里,我第一次打了一个光线追踪器。 然而,有一些怪癖困扰着我,我真的不知道如何解决。 从一开始就一直存在的是场景中的球体形状 - 渲染时,它们看起来像椭圆形。 当然,这个场景是有角度的,但最终的形状仍然很古怪。 我附加了一个示例渲染,我所遇到的问题在图像左下角的反射球体上特别明显。

示例图像

我不知道可能是什么原因造成的。 它可能是射线球形交叉码,如下所示:

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

或者它可能是另一回事。 有人有想法吗? 非常感谢!


看起来你正在使用一个非常广阔的视野(FoV)。 这产生了鱼眼镜头的效果,扭曲了画面,尤其是对边缘。 典型的例如90度(即任一方向45度)给出合理的图像。

折射实际上看起来相当不错。 它是倒转的,因为折射率非常高。 好的照片是在这个问题。

链接地址: http://www.djcxy.com/p/67951.html

上一篇: Why does raytracer render spheres as ovals?

下一篇: How to configure the jQuery UI Datepicker to use a localized calendar?