/ / Чому Raytracer представляє сфери як овали? - c ++, геометрія, перехрестя, трасування

Чому промінь трасування робить сфери овалами? - c ++, геометрія, перехрестя, raytracing

Я вперше зламав промінь-трасерачас за останні кілька днів. Однак є кілька химерностей, які мене турбують, і я справді не знаю, як це виправити. Один, який був там з самого початку, - це форма сфер у сцені - коли їх роблять, вони насправді виглядають як овали. Звичайно , в сцені є перспектива, але остаточна форма все ще здається дивною. Я додав зразок візуалізації, проблема, яку я маю, особливо помітна на світловідбиваючій сфері в лівій нижній частині зображення.

Зразок зразка

Я дійсно не знаю, що може викликати це. Це може бути код перетину променевої сфери, який виглядає так:

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

Або це може бути інша річ. Хтось має ідею? Дуже дякую!

Відповіді:

4 для відповіді № 1

Схоже, ви використовуєте дійсно широкий поле зору (FoV). Це дає ефект лінзи з риб'ячих очей, спотворюючи малюнок, особливо до країв. Зазвичай щось на зразок 90 градусів (тобто 45 градусів в будь-якому напрямку) дає розумну картину.

Заломлення насправді виглядає досить добре; це перевернуто, тому що показник заломлення настільки високий це питання.