Spectrum GetIlluminanceBySphericalHarmonics(Vector direction, MVertexIlluminanceMode mode) { var directionProjected = Face.Normal.Projected(direction); var sphCoord = directionProjected.ToSphCoord(); double valR = 0; double valG = 0; double valB = 0; var mu = (float)Math.Cos(sphCoord.Theta); var phi = (float)sphCoord.Phi; var qkm = SHMath.Schmidt(mu, IlluminanceAngles.NSH); if (mode == MVertexIlluminanceMode.Full || mode == MVertexIlluminanceMode.Direct) { valR += SHMath.SHToAF(directIlluminanceSHR, mu, phi, qkm); valG += SHMath.SHToAF(directIlluminanceSHG, mu, phi, qkm); valB += SHMath.SHToAF(directIlluminanceSHB, mu, phi, qkm); } if (mode == MVertexIlluminanceMode.Full || mode == MVertexIlluminanceMode.Indirect) { valR += SHMath.SHToAF(indirectIlluminanceSHR, mu, phi, qkm); valG += SHMath.SHToAF(indirectIlluminanceSHG, mu, phi, qkm); valB += SHMath.SHToAF(indirectIlluminanceSHB, mu, phi, qkm); } return(new Spectrum((float)valR, (float)valG, (float)valB)); }
Spectrum GetIlluminanceBySpline(Vector direction, MVertexIlluminanceMode mode) { var directionProjected = Face.Normal.Projected(direction); directionProjected.Normalize(); var sphCoord = directionProjected.ToSphCoord(); //sphCoord.Theta += Math.PI / 2; double valR = 0; double valG = 0; double valB = 0; if (mode == MVertexIlluminanceMode.Full || mode == MVertexIlluminanceMode.Direct) { valR += alglib.spline2dcalc(directIlluminanceSplineCoeffsR, sphCoord.Phi, sphCoord.Theta); valG += alglib.spline2dcalc(directIlluminanceSplineCoeffsG, sphCoord.Phi, sphCoord.Theta); valB += alglib.spline2dcalc(directIlluminanceSplineCoeffsB, sphCoord.Phi, sphCoord.Theta); } if (mode == MVertexIlluminanceMode.Full || mode == MVertexIlluminanceMode.Indirect) { valR += alglib.spline2dcalc(indirectIlluminanceSplineCoeffsR, sphCoord.Phi, sphCoord.Theta); valG += alglib.spline2dcalc(indirectIlluminanceSplineCoeffsG, sphCoord.Phi, sphCoord.Theta); valB += alglib.spline2dcalc(indirectIlluminanceSplineCoeffsB, sphCoord.Phi, sphCoord.Theta); } return(new Spectrum((float)valR, (float)valG, (float)valB)); }
public Spectrum GetIlluminance(Vector direction, MVertexIlluminanceMode mode, MVertexIlluminanceApproximationMode approximationMode) { Spectrum result = new Spectrum(0); if (Face.Material.Reflectance is DiffuseReflectanceMaterial) { if (mode == MVertexIlluminanceMode.Full || mode == MVertexIlluminanceMode.Direct) { result += IlluminanceDirect[0]; } if (mode == MVertexIlluminanceMode.Full || mode == MVertexIlluminanceMode.Indirect) { result += IlluminanceIndirect[0]; } } else { switch (approximationMode) { case MVertexIlluminanceApproximationMode.Spline: result = GetIlluminanceBySpline(direction, mode); break; case MVertexIlluminanceApproximationMode.SphericalHarmonics: result = GetIlluminanceBySphericalHarmonics(direction, mode); break; default: throw new NotImplementedException(); } } /* * if ( result.R < 0 ) * { * //return new Spectrum(); * return new Spectrum( 1, 0, 0 ); * } */ return(result); }
public Spectrum GetIlluminance(Point3D point, MVertexIlluminanceMode mode, MVertexIlluminanceApproximationMode approximationMode) { return(GetIlluminance(new Vector(Point, point, true), mode, approximationMode)); }