maybe_aidan

Triangle Intersection

Aug 20th, 2025
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OpenGL Shading 1.53 KB | Source Code | 0 0
  1. // Moeller-Trumbore Algorithm
  2. // [https://en.wikipedia.org/wiki/M%C3%B6ller%E2%80%93Trumbore_intersection_algorithm]
  3. bool hitTriangle(Triangle triangle, Ray r, float tMin, float tMax, out HitRecord rec) {
  4.     vec3 edge1 = triangle.v1.xyz - triangle.v0.xyz;
  5.     vec3 edge2 = triangle.v2.xyz - triangle.v0.xyz;
  6.    
  7.     float area = length(cross(edge1, edge2)) * 0.5;
  8.     float EPSILON = max(1e-8, area * 1e-5);
  9.     vec3 ray_cross_e2 = cross(r.direction, edge2);
  10.     float det = dot(edge1, ray_cross_e2);
  11.    
  12.     if(abs(det) < EPSILON) return false;
  13.    
  14.     float inv_det = 1.0 / det;
  15.     vec3 s = r.origin - triangle.v0.xyz;
  16.     float u = inv_det * dot(s, ray_cross_e2);
  17.    
  18.     if(u < -EPSILON || u > 1.0 + EPSILON) return false;
  19.    
  20.     vec3 s_cross_e1 = cross(s, edge1);
  21.     float v = inv_det * dot(r.direction, s_cross_e1);
  22.    
  23.     if(v < -EPSILON || u + v > 1.0 + EPSILON) return false;
  24.    
  25.     float t = inv_det * dot(edge2, s_cross_e1);
  26.    
  27.     if(t < tMin || t > tMax) return false;
  28.    
  29.     rec.t = t;
  30.     rec.p = r.origin + r.direction * t;
  31.     rec.mat = materials[triangle.materialID];
  32.    
  33.     vec3 interpolatedNormal = normalize(
  34.         (1.0 - u - v) * triangle.n0.xyz +
  35.         u * triangle.n1.xyz +
  36.         v * triangle.n2.xyz
  37.     );
  38.    
  39.     // Properly determine front/back face
  40.     vec3 geometricNormal = normalize(cross(edge1, edge2));
  41.     rec.frontFace = dot(r.direction, geometricNormal) < 0.0;
  42.     rec.normal = rec.frontFace ? interpolatedNormal : -interpolatedNormal;
  43.    
  44.     return true;
  45. }
Tags: Ray tracing
Advertisement
Add Comment
Please, Sign In to add comment