"vscode:/vscode.git/clone" did not exist on "3d7244b5280301792a6959c59154d4809ad1209a"
Unverified Commit c46d664e authored by kiui's avatar kiui Committed by GitHub
Browse files

Merge pull request #19 from guohaoxiang/correct_ray_intersection

fix ray intersection bugs by avoiding dividing zero
parents b64407d0 22533fce
...@@ -149,15 +149,15 @@ struct BoundingBox { ...@@ -149,15 +149,15 @@ struct BoundingBox {
} }
__host__ __device__ Eigen::Vector2f ray_intersect(Eigen::Ref<const Eigen::Vector3f> pos, Eigen::Ref<const Eigen::Vector3f> dir) const { __host__ __device__ Eigen::Vector2f ray_intersect(Eigen::Ref<const Eigen::Vector3f> pos, Eigen::Ref<const Eigen::Vector3f> dir) const {
float tmin = (min.x() - pos.x()) / dir.x(); float tmin = safe_divide(min.x() - pos.x(), dir.x());
float tmax = (max.x() - pos.x()) / dir.x(); float tmax = safe_divide(max.x() - pos.x(), dir.x());
if (tmin > tmax) { if (tmin > tmax) {
host_device_swap(tmin, tmax); host_device_swap(tmin, tmax);
} }
float tymin = (min.y() - pos.y()) / dir.y(); float tymin = safe_divide(min.y() - pos.y() / dir.y());
float tymax = (max.y() - pos.y()) / dir.y(); float tymax = safe_divide(max.y() - pos.y() / dir.y());
if (tymin > tymax) { if (tymin > tymax) {
host_device_swap(tymin, tymax); host_device_swap(tymin, tymax);
...@@ -175,8 +175,8 @@ struct BoundingBox { ...@@ -175,8 +175,8 @@ struct BoundingBox {
tmax = tymax; tmax = tymax;
} }
float tzmin = (min.z() - pos.z()) / dir.z(); float tzmin = safe_divide(min.z() - pos.z(), dir.z());
float tzmax = (max.z() - pos.z()) / dir.z(); float tzmax = safe_divide(max.z() - pos.z(), dir.z());
if (tzmin > tzmax) { if (tzmin > tzmax) {
host_device_swap(tzmin, tzmax); host_device_swap(tzmin, tzmax);
......
...@@ -95,4 +95,14 @@ __device__ __host__ Eigen::Vector3f fibonacci_dir(uint32_t i, const Eigen::Vecto ...@@ -95,4 +95,14 @@ __device__ __host__ Eigen::Vector3f fibonacci_dir(uint32_t i, const Eigen::Vecto
return cylindrical_to_dir(Eigen::Vector2f{fractf((i+epsilon) / (N_DIRS-1+2*epsilon) + offset.x()), fractf(i / GOLDEN_RATIO + offset.y())}); return cylindrical_to_dir(Eigen::Vector2f{fractf((i+epsilon) / (N_DIRS-1+2*epsilon) + offset.x()), fractf(i / GOLDEN_RATIO + offset.y())});
} }
__host__ __device__ float safe_divide(float numerator, float denominator, float epsilon = 1e-6f) {
if (fabs(denominator) < epsilon) {
if (denominator <= 0)
return -(numerator / epsilon);
else
return numerator / epsilon;
}
return numerator / denominator;
}
} }
\ No newline at end of file
...@@ -30,7 +30,7 @@ struct Triangle { ...@@ -30,7 +30,7 @@ struct Triangle {
Eigen::Vector3f rov0 = ro - a; Eigen::Vector3f rov0 = ro - a;
n = v1v0.cross( v2v0 ); n = v1v0.cross( v2v0 );
Eigen::Vector3f q = rov0.cross( rd ); Eigen::Vector3f q = rov0.cross( rd );
float d = 1.0f/rd.dot( n ); float d = safe_divide(1.0f, rd.dot(n));
float u = d*-q.dot( v2v0 ); float u = d*-q.dot( v2v0 );
float v = d* q.dot( v1v0 ); float v = d* q.dot( v1v0 );
float t = d*-n.dot( rov0 ); float t = d*-n.dot( rov0 );
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment