За последние несколько дней я впервые взломал 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 градусов в любом направлении) дает разумную картину.
Рефракция на самом деле выглядит довольно хорошо; оно перевернуто, потому что показатель преломления очень высок. Хорошие картинки в этот вопрос.
Других решений пока нет …