public override (SurfaceInteraction, double) Sample() { // TODO: Implement Sphere sampling if (Outside) { var pObj = this.Radius * Samplers.UniformSampleSphere(); var n = new Vector3(pObj.x, pObj.y, pObj.z); var pdf = 1 / this.Area(); var dpdu = new Vector3(-pObj.y, pObj.x, 0); SurfaceInteraction si = new SurfaceInteraction(pObj, n, Vector3.ZeroVector, dpdu, this); return(ObjectToWorld.Apply(si), pdf); } else { var pObj = this.Radius * Samplers.UniformSampleSphere(); var n = new Vector3(pObj.x, pObj.y, pObj.z); var pdf = 1 / this.Area(); var dpdu = new Vector3(-pObj.y, pObj.x, 0); SurfaceInteraction si = new SurfaceInteraction(pObj, -n, Vector3.ZeroVector, dpdu, this); return(ObjectToWorld.Apply(si), pdf); } // TODO: Return surface interaction and pdf // A dummy return example //double dummyPdf = 1.0; //Vector3 dummyVector = new Vector3(0, 0, 0); //SurfaceInteraction dummySurfaceInteraction = new SurfaceInteraction(dummyVector, dummyVector, dummyVector, dummyVector, this); //return (dummySurfaceInteraction, dummyPdf); }
public override (SurfaceInteraction, double) Sample() { var pObj = Samplers.UniformSampleSphere() * Radius; pObj *= Radius / pObj.Length(); // refine var n = pObj.Normalize(); var dpdu = new Vector3(-pObj.y, pObj.x, 0); var pdf = 1 / Area(); return(ObjectToWorld.Apply(new SurfaceInteraction(pObj, n, Vector3.ZeroVector, dpdu, this)), pdf); }
public override (SurfaceInteraction, double) Sample() { Vector3 sample = Samplers.UniformSampleSphere(); Vector3 point = sample * Radius; Vector3 normal = sample; Vector3 dpdu = new Vector3(-normal.y, normal.x, 0.0); double pdf = 1.0 / Area(); SurfaceInteraction si = new SurfaceInteraction(point, normal, Vector3.ZeroVector, dpdu, this); return(ObjectToWorld.Apply(si), pdf); }
public override (Spectrum, Vector3, double) Sample_f(Vector3 wo) { //var wi = Samplers.CosineSampleHemisphere(); var wi = Samplers.UniformSampleSphere(); if (wo.z < 0) { wi.z *= -1; } double pdf = Pdf(wo, wi); return(f(wo, wi), wi, pdf); }
public override (SurfaceInteraction, double) Sample() { // TODO: Implement Sphere sampling //Vector3 pObj = Samplers.CosineSampleHemisphere() * Radius; Vector3 pObj = Samplers.UniformSampleSphere() * Radius; pObj = pObj * (Radius / pObj.Length()); // TODO: Return surface interaction and pdf var dpdu = new Vector3(-pObj.y, pObj.x, 0); double pdf = 1 / Area(); // a je kle inv 4 PI (1/Math.PI/4) return(ObjectToWorld.Apply(new SurfaceInteraction(pObj, ObjectToWorld.ApplyNormal(pObj), Vector3.ZeroVector, dpdu, this)), pdf); }
public override (SurfaceInteraction, double) Sample() { // TODO: Implement Sphere sampling var center = new Vector3(0, 0, 0); var point = center + Radius * Samplers.UniformSampleSphere(); var normal = point.Normalize(); if (innerOrientation) { normal = -normal; } point *= Radius / (center - point).Length(); var wo = point; var dpdu = Dpdu(point); var interaction = new SurfaceInteraction(point, normal, wo, dpdu, this); return(ObjectToWorld.Apply(interaction), Pdf(interaction, point)); }