/ / Warum rendert der Raytracer Kugeln als Ovale? - C ++, Geometrie, Schnittmenge, Raytracing

Warum rendert Raytracer Kugeln als Ovale? - C ++, Geometrie, Schnittpunkt, Raytracing

Ich habe zum ersten Mal einen Raytracer gehacktZeit in den letzten Tagen. Es gibt jedoch ein paar Macken, die mich stören, und ich weiß nicht wirklich, wie ich das herausfinden soll. Eine, die von Anfang an dabei war, ist die Form der Kugeln in der Szene - wenn sie gerendert werden, sehen sie tatsächlich wie Ovale aus Es gibt Perspektive in der Szene, aber die endgültige Form erscheint immer noch seltsam: Ich habe ein Beispiel für ein Rendering angehängt, das Problem, das ich habe, ist insbesondere auf der reflektierenden Kugel im unteren linken Teil des Bildes zu sehen.

Beispielbild

Ich weiß nicht wirklich, was das alles bewirken könnte.

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

Oder es könnte eine andere Sache sein. Hat jemand eine Idee? Vielen Dank!

Antworten:

4 für die Antwort № 1

Es sieht so aus, als würden Sie ein wirklich breites verwenden Sichtfeld (FoV). Dies hat die Wirkung einer Fischaugenlinse und verzerrt das Bild, insbesondere zu den Rändern hin. Typischerweise ergibt etwas wie 90 Grad (d. H. 45 Grad in beide Richtungen) ein vernünftiges Bild.

Die Lichtbrechung sieht eigentlich ganz gut aus; es ist umgekehrt, weil der Brechungsindex so hoch ist. Schöne Bilder sind in diese Frage.