Abstract class BRDF_Model


The abstract class BRDF_Model handles the generic operations associated with any BRDF scattering model and acts as an interface by which programs can access different models. A pointer to a BRDF_Model (or a BRDF_Model_Ptr) can point to one of any number of specific models.

The convention of BRDF_Model is that the function jones returns a scattering matrix of type JonesMatrix, which, when converted to a MuellerMatrix by typecasting, becomes the bidirectional reflectance distribution function (BRDF) transfer matrix relating the Stokes radiance to the incident Stokes irradiance. The Jones scattering matrix S is thus defined by the expression

scatter1   [L]

where Ejscat are the scattered electric fields for the jth polarization, Ejinc are the incident electric fields for the jth polarization, R is the distance to the point being considered, k=2pilambda, thetai is the incident polar angle, thetas is the scattering polar angle. That is, the scattering matrix has an extra factor of 1/sqrt[A cos(thetai) cos(thetas)] compared to the normal convention, as well as a factor of 1/k compared to that for SphericalScatterer.

The angles thetai, thetas, and phis are defined as shown in the figure below. That is, the angle thetai is defined as the angle that a vector pointing to the source makes with respect to the surface normal, the angle thetas is the angle that a vector pointing in the scattering direction makes with respect to the surface normal, and phis is the azimuthal angle of the scattered light, measured in a right-handed fashion about the surface normal from the plane defined by the incident direction and the surface normal.

Scattering geometry - see text for description.

To write your own BRDF_Model class, see the outline given in "Writing your own BRDF model."

Parameters:

Parameter Data Type Description Default
lambda double Wavelength of the light in vacuum [µm]. 0.532
type int Indicates whether scattering is evaluated in reflection (0) or transmission (1). 0
substrate dielectric_function The optical constants of the substrate, expressed as a complex number (n,k) or, optionally, as a function of wavelength. (4.05,0.05)


See also:

SCATMECH Home,   Conventions,   MuellerMatrix,   JonesMatrix,   List of child classes

J. C. Stover, Optical Scattering: Measurement and Analysis, (SPIE Optical Engineering Press, Bellingham, WA, 1995).
D. S. Flynn and C. Alexander, "Polarized surface scattering expressed in terms of a bidirectional reflectance distribution function matrix," Opt. Eng. 34(6), 1646-1650 (1995).

Include file:

#include "brdf.h"

Source code:

brdf.cpp
reg_brdf.cpp

Definition of public and protected elements:

class BRDF_Model : public Model {
public:
    enum Coordinate_System {psps = 0,xyxy = 1,plane = 2};
    enum  {REFLECTION = 0,TRANSMISSION = 1};

    JonesMatrix Jones(double thetai,
                      double thetas,
                      double phis,
                      double rotation,
                      Coordinate_System cs = psps);

    MuellerMatrix Mueller(double thetai,
                          double thetas,
                          double phis,
                          double rotation,
                          Coordinate_System cs = psps);

    JonesMatrix Jones(Vector& source,
                      Vector& viewer,
                      Vector& normal,
                      Vector& xaxis,
                      Coordinate_System cs = plane);

    MuellerMatrix Mueller(Vector& source,
                          Vector& viewer,
                          Vector& normal,
                          Vector& xaxis,
                          Coordinate_System cs = plane);

    Coordinate_System get_model_cs();

protected:
    Coordinate_System model_cs;
    virtual JonesMatrix jones();
    virtual MuellerMatrix mueller();

    double thetai;
    double thetas;
    double phii;
    double rotation;
};

typedef Model_Ptr<BRDF_Model> BRDF_Model_Ptr;


double thetai
double thetas
double phis
double rotation

These variables represent the geometry for which the calculation is to be performed. They are set by the public functions Mueller() and Jones(). They are used by the functions mueller() or jones().

The variable thetai is the incident polar angle in radians.

The variable thetas is the scattering polar angle in radians.

The variable phis is the scattering azimuthal angle in radians.

The variable rotation is the rotation angle of the sample in radians about the surface normal.

Top of Page

enum Coordinate_System
Coordinate_System model_cs
Coordinate_System get_model_cs()

This variable stores the coordinate system for which the scattering is defined in the code. By default, it is set to BRDF_Model::psps. A scattering model which inherits the properties of BRDF_Model and which has its scattering defined with respect to another reference frame should set this variable in its constructor. The value can be publicly queried using get_model_cs.

The different coordinate systems are:

BRDF_Model::psps - This coordinate system uses the standard {s,p,k} right-handed basis vectors appropriate for both the incident and scattered light. The k direction is the respective direction of propagation, the s direction is parallel to the plane defined by k and the surface normal, and the p direction is perpendicular to that plane. Most models are coded using this coordinate system.

BRDF_Model::xyxy - This coordinate system uses the same coordinates as BRDF_Model::psps for the incident light, but rotates the scattered light coordinates by the angle phis. Near the surface normal, this coordinate system is close to the directions x and y, where x is a vector in the plane of incidence and the plane of the sample, and y is a vector perpendicular to the plane of incidence. This coordinate system removes an apparent singularity which exists at the surface normal using the BRDF_Model::psps coordinate system.

BRDF_Model::plane - This coordinate system is defined by the plane which includes the incident and scattered directions. The basis vectors are parallel and perpendicular to this plane, respectively, for both the incident and the scattered light. This coordinate system may be more appropriate than the others for rendering applications.

Top of Page

JonesMatrix Jones(double thetai, double thetas, double phis, double rotation, Coordinate_System cs)
MuellerMatrix Mueller(double thetai, double thetas, double phis, double rotation, Coordinate_System cs)

These public functions return the Jones matrix or the Mueller matrix associated with the model, as a function of scattering geometry and polarization coordinate system. The value of cs defines the coordinate system for which the scattering matrix will be returned.

Example:
double ti,ts,ps;
JonesVector incidentlight;
BRDF_Model *model;
JonesVector jones = model->Jones(ti,ts,ps,0,
                                    BRDF_Model::plane)*incidentlight;

Top of Page

JonesMatrix Jones(Vector& source, Vector& viewer, Vector& normal, Vector& xaxis,Coordinate_System cs)
MuellerMatrix Mueller(Vector& source, Vector& viewer, Vector& normal, Vector& xaxis,Coordinate_System cs)

These public functions return the Jones matrix or the Mueller matrix associated with the model, as a function of scattering geometry and polarization coordinate system. The value of cs defines the coordinate system for which the scattering matrix will be returned. source is a Vector pointing from the sample to the light source. viewer is a Vector pointing in the scattering direction. normal is a Vector pointing in the outward surface normal. xaxis is a Vector which must have a component along the substrate surface, and defines the x-axis of that surface.Neither source, viewer, normal, or xaxis need be normalized. If xaxis is the zero vector, the sample rotation will be set to zero degrees.

Note that the coordinate system defaults to BRDF_Model::plane, which is most natural for rendering applications.

Example:

The following is an example of how one might use the Vector-based Mueller function. The sample is assumed to be tilted in the y-direction by an angle tilt, while the light is incident at an angle thetai and the receiver is collecting light at a polar angle of thetas and azimuthal angle phis.

Vector source(-sin(thetai),0.,cos(thetai));
Vector receiver(sin(thetas)*cos(phis),sin(thetas)*sin(phis),cos(thetas));
Vector normal(0.,sin(tilt),cos(tilt));
StokesVector incidentlight;
Some_BRDF_Model model; // Assume that Some_BRDF_Model is a BRDF_Model...
StokesVector stokes = model.Mueller(source,
                                     receiver,
                                      normal,
                                       Vector(0,0,0))*incidentlight;

Top of Page

virtual void setup()

All functions that modify parameters for a model should set recalc to 1. The function setup() performs any housekeeping that is necessary if the parameters have been changed. All inherited classes should have such a setup() function if they require such operations. They should also call the parent's setup() function.

Top of Page

int recalc

All functions that modify parameters for a model should set recalc to 1. The state of recalc=1 indicates that some housekeeping must be performed by setup().

Top of Page

virtual JonesMatrix jones()

This function returns the Jones scattering matrix. It uses the variables thetai, thetas, phis, and rotation, defined above. If this function is not defined for an inherited class, it throws an exception if called. One of the functions, mueller or jones, must be defined by any inherited class.

Top of Page

virtual MuellerMatrix mueller()

This function returns the Mueller scattering matrix. It uses the variables thetai, thetas, phis, and rotation, defined above. If this function is not defined for an inherited class, it defaults to a JonesMatrix to MuellerMatrix conversion. One of the functions, mueller or jones, must be defined by any inherited class.

The convention of the SCATMECH library is that the 00 term of the Mueller matrix is the bidirectional reflectance distribution function (BRDF), fr, defined as

scatter2   [L]

where dPhis/dOmega is the scattered power per unit solid angle, Phii is the incident power, and thetas is the scattering angle.

Top of Page

typedef Model_Ptr<BRDF_Model> BRDF_Model_Ptr

The typedef BRDF_Model_Ptr behaves like a pointer to an instance of class BRDF_Model. The following statement will query the user for an instance of class BRDF_Model:

BRDF_Model_Ptr model = Get_Model_Ptr();

The next statement will also create an instance of class BRDF_Model:

BRDF_Model_Ptr model = "Microroughness_BRDF_Model";

See Model_Ptr<model>.

Top of Page


For More Information

SCATMECH Technical Information and Questions
Optical Technology Division (OTD) Home Page
OTD Technical Inquiries
OTD Website Comments

Current SCATMECH version: 6.00 (February 2008)
This page first online: Version 1.00 (March 2000)
This page last modified: Version 6.00 (February 2008)