Skip to content

Instantly share code, notes, and snippets.

@Ushio
Created December 29, 2018 03:39
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Ushio/725875a69684fc368b4391ccce3444c4 to your computer and use it in GitHub Desktop.
Save Ushio/725875a69684fc368b4391ccce3444c4 to your computer and use it in GitHub Desktop.
tracking refraction
vector rd = normalize(set(-1, ch("dirY"), 0));
vector ro = @P;
int prim = addprim(0, "polyline");
addvertex(geoself(), prim, @ptnum);
float ior = ch("ior");
for(int i = 0 ; i < 20; ++i) {
vector p;
vector uvw;
int intersect_prim = intersect(1, ro, rd * 100.0, p, uvw);
if(intersect_prim != -1) {
int p1 = addpoint(geoself(), p);
addvertex(geoself(), prim, p1);
setpointattrib(geoself(), "sinTheta", p1, rd.y);
vector N = prim_normal(1, intersect_prim, uvw);
/*
vector rdir;
if(dot(N, rd) < 0.0) {
rdir = refract(rd, N, 1.0 / ior);
} else {
rdir = refract(rd, -N, ior / 1.0);
}
*/
vector rdir = refract(rd, -N, ior / 1.0);
ro = p + rdir * 0.0001;
rd = rdir;
} else {
vector pLast = ro + rd * 2.0;
int fin = addpoint(geoself(), pLast);
addvertex(geoself(), prim, fin);
setpointattrib(geoself(), "sinTheta", fin, rd.y);
break;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment