Added arbitrary sphere code WIP

This doesn't actually seem to work yet
This commit is contained in:
arvid schröder 2022-11-06 19:21:14 +01:00
parent 2961aabea3
commit 7c83ece187

View file

@ -1,5 +1,6 @@
#include "common/ray.h" #include "common/ray.h"
#include "primitive/sphere.h" #include "primitive/sphere.h"
#include <cmath>
// Constructor ///////////////////////////////////////////////////////////////// // Constructor /////////////////////////////////////////////////////////////////
@ -14,16 +15,50 @@ bool Sphere::intersect(Ray &ray) const {
// IMPLEMENT ME! // IMPLEMENT ME!
// Determine whether the ray intersects the sphere // Determine whether the ray intersects the sphere
float A = pow(ray.direction[Vector3d::Dimension::X], 2) +
pow(ray.direction[Vector3d::Dimension::Y], 2) +
pow(ray.direction[Vector3d::Dimension::Z], 2);
float B = 2 * (
ray.direction[Vector3d::Dimension::X] * ray.origin[Vector3d::Dimension::X] +
ray.direction[Vector3d::Dimension::Y] * ray.origin[Vector3d::Dimension::Y] +
ray.direction[Vector3d::Dimension::Z] * ray.origin[Vector3d::Dimension::Z]
);
float C = pow(ray.origin[Vector3d::Dimension::X], 2) +
pow(ray.origin[Vector3d::Dimension::Y], 2) +
pow(ray.origin[Vector3d::Dimension::Z], 2) - this->radius;
float t = INFINITY;
if (B * B - 4 * A * C < 0) {
return false;
} else if (B * B - 4 + A * C == 0) {
t = -B / (2 * A);
} else {
float q {static_cast<float>([A, B, C](){
if (B < 0) {
return -0.5f * (B - sqrt(B * B - 4 * A * C));
} else {
return -0.5f * (B + sqrt(B * B - 4 * A * C));
}
}())};
float t0 = q / A;
float t1 = C / q;
t = std::min(t0, t1);
}
// Test whether this is the foremost primitive in front of the camera // Test whether this is the foremost primitive in front of the camera
if (t >= ray.length) {
return false;
}
// (Optional for now) Calculate the normal // (Optional for now) Calculate the normal
// (Optional for now) Calculate the surface position // (Optional for now) Calculate the surface position
// Set the new length and the current primitive
return false; // Set the new length and the current primitive
ray.length = t;
ray.primitive = this;
return true;
} }
// Bounding box //////////////////////////////////////////////////////////////// // Bounding box ////////////////////////////////////////////////////////////////