gpt4 book ai didi

c++ - 为什么 raytracer 将球体渲染为椭圆?

转载 作者:可可西里 更新时间:2023-11-01 18:37:56 25 4
gpt4 key购买 nike

在过去的几天里,我第一次破解了光线追踪器。然而,有一些怪癖困扰着我,我真的不知道如何解决。从一开始就存在的一个是场景中球体的形状——渲染时,它们实际上看起来像椭圆形。当然,场景中是有透视的,但最终的造型还是显得怪怪的。我附上了示例渲染图,我遇到的问题在图像左下方的反射球体上尤为明显。

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

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

最佳答案

看起来您使用的是非常宽的 field of view (视场)。这会产生鱼眼镜头的效果,使图片失真,尤其是在边缘处。通常像 90 度(即任一方向 45 度)这样的角度可以给出合理的图片。

折射实际上看起来相当不错;它是倒置的,因为折射率很高。漂亮的图片在this question .

关于c++ - 为什么 raytracer 将球体渲染为椭圆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14074643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com