According to Snell's Law we have:
Sin Qt / Sin Qi = ni/nt = nr
Derivation of T: Assuming T is a unit vector, so the projection of T in the direction of M and -N is a and b respectively
T = a + b
T = (Sin Qt) * M - (Cos Qt) * N
M = (N * Cos Qi - V) / Sin Qi
Substituting M in T:
ALGORITHM:
1. Check whether object is transparent or not. 2. Check whether ray is going into the medium or going out of the medium (i.e. Check N.V < 0 then ray is going into the medium else going out) 3. If ray is going into the medium calculate nr and substitute into the equation. 4. Most important V is calculated as (intersection point - ray start) but when it is used into the equation we use -V. 5. If ray is going out of the medium we use nr as 1/nr and normal will be -N. 6. Recursively call shade method and compute the color from the objects behind the transparent object.
C++ CODE
if(object.getTransparency() > 0){
SbVec3f vVec = point - rayStart;
vVec.normalize();
if(normal.dot(vVec) < 0){ // going into the sphere
float nr = 0.66;
float rootContent = sqrtf(1 - nr * nr * (1 - (normal.dot(-vVec) *
(normal.dot(-vVec)))));
if(rootContent >= 0.0){
transmisiveRay = (nr*(normal.dot(-vVec))-rootContent)*normal-(nr*-vVec);
pixelColor += object.getTransparency()*shade((point + 0.0009 *
vVec),transmisiveRay,recursionDepth + 1);
}
}
else { // going out of sphere
float nr = 1.5;
float rootContent = sqrtf(1 - nr * nr * (1-(-normal.dot(-rayDirection)*
(-normal.dot(-rayDirection)))));
if(rootContent >= 0.0){
transmisiveRay = (nr * (-normal.dot(-rayDirection)) - rootContent)
* -normal - ( nr * -rayDirection );
pixelColor += object.getTransparency() * shade((point + 0.0009 *
rayDirection),transmisiveRay, recursionDepth + 1);
}
}
}
NOTE: vVec is code is my V in algorithm and normal is N in algorithm


No comments:
Post a Comment