get_unit_normal.glsl 615 B

1234567891011121314151617181920
  1. vec3 get_unit_normal(vec3 p0, vec3 p1, vec3 p2){
  2. float tol = 1e-6;
  3. vec3 v1 = normalize(p1 - p0);
  4. vec3 v2 = normalize(p2 - p0);
  5. vec3 cp = cross(v1, v2);
  6. float cp_norm = length(cp);
  7. if(cp_norm > tol) return cp / cp_norm;
  8. // Otherwise, three pionts form a line, so find
  9. // a normal vector to that line in the plane shared
  10. // with the z-axis
  11. vec3 comb = v1 + v2;
  12. cp = cross(cross(comb, vec3(0.0, 0.0, 1.0)), comb);
  13. cp_norm = length(cp);
  14. if(cp_norm > tol) return cp / cp_norm;
  15. // Otherwise, the points line up with the z-axis.
  16. return vec3(0.0, -1.0, 0.0);
  17. }