public Ray Refract(Point3D hp, float eta) { var nidot = Point3D.Scalar(normal, _castedRay.dir); var k = 1.0f - eta * eta * (1.0f - nidot * nidot); if (k >= 0) { k = (float)Math.Sqrt(k); return(Ray.BuildRay(hp, Point3D.Norm(eta * _castedRay.dir - (k + eta * nidot) * normal))); } else { return(null); } }
public Ray Reflect(Point3D hp) { return(Ray.BuildRay(hp, Point3D.Norm(_castedRay.dir - 2 * normal * Point3D.Scalar(normal, _castedRay.dir)))); }