# 3.5. Optical Surface Materials¶

## 3.5.1. Absorber¶

class raysect.optical.material.absorber.AbsorbingSurface

A perfectly absorbing surface material.

>>> from raysect.primitive import Sphere
>>> from raysect.optical import World
>>> from raysect.optical.material import AbsorbingSurface
>>>
>>> # set-up scenegraph
>>> world = World()
>>> absorber = Sphere(radius=0.01, parent=world, material=AbsorbingSurface())


## 3.5.2. Emitters¶

class raysect.optical.material.emitter.UnitySurfaceEmitter

Uniform and isotropic surface emitter with emission 1W/str/m^2/ x nm, where x is the spectrum’s wavelength interval.

This material is useful for general purpose debugging and testing energy conservation.

>>> from raysect.primitive import Sphere
>>> from raysect.optical import World
>>> from raysect.optical.material import UnitySurfaceEmitter
>>>
>>> # set-up scenegraph
>>> world = World()
>>> emitter = Sphere(radius=0.01, parent=world, material=UnitySurfaceEmitter())

class raysect.optical.material.emitter.UniformSurfaceEmitter

Uniform and isotropic surface emitter.

Uniform emission will be given by the emission_spectrum multiplied by the emission scale.

Parameters
• emission_spectrum (SpectralFunction) – The surface’s emission function.

• scale (float) – Scale of the emission function (default = 1 W/m^2/str/nm).

>>> from raysect.primitive import Sphere
>>> from raysect.optical import World, ConstantSF
>>> from raysect.optical.material import UniformSurfaceEmitter
>>>
>>> # set-up scenegraph
>>> world = World()
>>> emitter.material=UniformSurfaceEmitter(ConstantSF(1.0))

class raysect.optical.material.AnisotropicSurfaceEmitter

Base class for anisotropic surface emitters.

Simplifies the development of anisotropic light sources. The emitter spectrum can be varied based on the angle between the normal and incident observation direction, and the side of the surface.

class raysect.optical.material.Checkerboard

Isotropic checkerboard surface emitter

Defines a plane of alternating squares of emission forming a checkerboard pattern. Useful in debugging and as a light source in test scenes.

Parameters
• width (float) – The width of the squares in metres.

• emission_spectrum1 (SpectralFunction) – Emission spectrum for square one.

• emission_spectrum2 (SpectralFunction) – Emission spectrum for square two.

• scale1 (float) – Intensity of square one emission.

• scale2 (float) – Intensity of square two emission.

>>> from raysect.primitive import Box
>>> from raysect.optical import World, rotate, Point3D, d65_white
>>> from raysect.optical.material import Checkerboard
>>>
>>> world = World()
>>>
>>> # checker board wall that acts as emitter
>>> emitter = Box(lower=Point3D(-10, -10, 10), upper=Point3D(10, 10, 10.1), parent=world,
transform=rotate(45, 0, 0))
>>> emitter.material=Checkerboard(4, d65_white, d65_white, 0.1, 2.0)


## 3.5.3. Lambertian¶

class raysect.optical.material.lambert.Lambert

An ideal Lambertian surface material.

A Lambertian is a perfectly diffuse surface that scatters light equally in all directions. It is a good approximation to many real world surfaces.

Parameters

reflectivity (SpectralFunction) – Reflectance function which defines the fraction of light scattered at each wavelength.

>>> from raysect.primitive import Sphere
>>> from raysect.optical import World, ConstantSF
>>> from raysect.optical.material import Lambert
>>>
>>> # set-up scenegraph
>>> world = World()
>>> sphere.material=Lambert(0.25)  # 25% diffuse reflectivity


## 3.5.4. Conductors¶

class raysect.optical.material.conductor.Conductor

Conductor material.

The conductor material simulates the interaction of light with a homogeneous conducting material, such as, gold, silver or aluminium.

This material implements the Fresnel equations for a conducting surface. To use the material, the complex refractive index of the conductor must be supplied.

Parameters
• index (SpectralFunction) – Real component of the refractive index - $$n(\lambda)$$.

• extinction (SpectralFunction) – Imaginary component of the refractive index (extinction) - $$k(\lambda)$$.

>>> import numpy as np
>>> from raysect.optical import InterpolatedSF
>>> from raysect.optical.material import Conductor
>>>
>>> wavelength = np.array(...)
>>> index = InterpolatedSF(wavelength, np.array(...))
>>> extinction = InterpolatedSF(wavelength, np.array(...))
>>>
>>> metal = Conductor(index, extinction)

class raysect.optical.material.conductor.RoughConductor

This is implementing Cook-Torrence with conducting fresnel microfacets.

Smith shadowing and GGX facet distribution used to model roughness.

Parameters
• index (SpectralFunction) – Real component of the refractive index - $$n(\lambda)$$.

• extinction (SpectralFunction) – Imaginary component of the refractive index (extinction) - $$k(\lambda)$$.

• roughness (float) – The roughness parameter in range (0, 1]. 0 is perfectly specular, 1 is perfectly rough.

>>> import numpy as np
>>> from raysect.optical import InterpolatedSF
>>> from raysect.optical.material import RoughConductor
>>>
>>> wavelength = np.array(...)
>>> index = InterpolatedSF(wavelength, np.array(...))
>>> extinction = InterpolatedSF(wavelength, np.array(...))
>>>
>>> rough_metal = RoughConductor(index, extinction, 0.25)


## 3.5.5. Dielectrics¶

class raysect.optical.material.dielectric.Dielectric

An ideal dielectric material.

Parameters
• index (SpectralFunction) – Refractive index as a function of wavelength.

• transmission (SpectralFunction) – Transmission per metre as a function of wavelength.

• external_index (SpectralFunction) – Refractive index of the external material at the interface, defaults to a vacuum (n=1).

• transmission_only (bool) – toggles transmission only, no reflection (default=False).

>>> from raysect.optical import ConstantSF
>>> from raysect.optical.material import Dielectric, Sellmeier
>>>
>>> diamond_material = Dielectric(Sellmeier(0.3306, 4.3356, 0.0, 0.1750**2, 0.1060**2, 0.0),
ConstantSF(1))

class raysect.optical.material.dielectric.Sellmeier

Material with refractive index defined by Sellmeier equation

Parameters
• b1 (float) – Sellmeier $$B_1$$ coefficient.

• b2 (float) – Sellmeier $$B_2$$ coefficient.

• b3 (float) – Sellmeier $$B_3$$ coefficient.

• c1 (float) – Sellmeier $$C_1$$ coefficient.

• c2 (float) – Sellmeier $$C_2$$ coefficient.

• c3 (float) – Sellmeier $$B_1$$ coefficient.

• sample_resolution (float) – The numerical sampling resolution in nanometers.

>>> from raysect.optical import ConstantSF
>>> from raysect.optical.material import Dielectric, Sellmeier
>>>
>>> diamond_material = Dielectric(Sellmeier(0.3306, 4.3356, 0.0, 0.1750**2, 0.1060**2, 0.0),
ConstantSF(1))


## 3.5.6. Modifiers¶

class raysect.optical.material.modifiers.Blend

Blend combines the behaviours of two materials.

This modifier is used to blend together the behaviours of two different materials. Which material handles the interaction for an incoming ray is determined by a random choice, weighted by the ratio argument. Low values of ratio bias the selection towards material 1, high values to material 2.

It is the responsibility of the user to ensure the material combination is physically valid.

By default both the volume and surface responses are blended. This may be configured with the surface_only and volume_only parameters. If blending is disabled the response from material 1 is returned.

Blend can be used to approximate finely sputtered surfaces consisting of a mix of materials. For example it can be used to crudely approximate a gold coated glass surface:

material = Blend(schott(‘N-BK7’), Gold(), 0.1, surface_only=True)

Parameters
• m1 – The first material.

• m2 – The second material.

• ratio – A double value in the range (0, 1).

• surface_only – Only blend the surface response (default=False).

• volume_only – Only blend the volume response (default=False).

class raysect.optical.material.modifiers.Add

Adds the response of two materials.

This modifier is used to sum together the behaviours of two different materials. The surface response is the simple sum of the two surface material responses. The volume response is more nuanced. The volume method of material 1 is applied first, followed by the volume method of material 2. Depending on the choice of volume material, this may result in a simple summation or a more complex interaction.

The Add modifier should be used with caution, it is possible to produce unphysical material combinations that violate energy conservation. It is the responsibility of the user to ensure the material combination is physically valid.

By default both the volume and surface responses are combined. This may be configured with the surface_only and volume_only parameters. If summation is disabled the response from material 1 is returned.

Add can be used to introduce a surface emission component to a non-emitting surface. For example, A hot metal surface can be approximated by adding a black body emitter to a metal material:

Iron(), UniformSurfaceEmitter(BlackBody(800)), surface_only=True

)

Combining volumes is more complex and must only be used with materials that are mathematically commutative, for example two volume emitters or two absorbing volumes.

Parameters
• m1 – The first material.

• m2 – The second material.

• surface_only – Only blend the surface response (default=False).

• volume_only – Only blend the volume response (default=False).

class raysect.optical.material.modifiers.VolumeTransform

Translate/rotate the volume material relative to the primitive.

Applies an affine transform to the start and end points of the volume response calculation. This modifier is intended for use with volume texture materials, allowing them to be translated/rotated.

As a modifier material, it takes another material (the base material) as an argument. Using a supplied an affine transform, this material will modify the start and end coordinate of the volume integration.

Parameters
• material – The base material.

• transform – An affine transform.

class raysect.optical.material.modifiers.Roughen

Modifies the surface normal to approximate a rough surface.

This is a modifier material, it takes another material (the base material) as an argument.

The roughen modifier works by randomly deflecting the surface normal about its true position before passing the intersection parameters on to the base material.

The deflection is calculated by interpolating between the existing normal and a vector sampled from a cosine weighted hemisphere. The strength of the interpolation, and hence the roughness of the surface, is controlled by the roughness argument. The roughness argument takes a value in the range [0, 1] where 1 is a fully rough, lambert-like surface and 0 is a smooth, untainted surface.

Parameters
• material – The base material.

• roughness – A double value in the range [0, 1].

## 3.5.7. Debugging¶

This module contains materials to aid with debugging and creating test scenes.

class raysect.optical.material.emitter.Checkerboard

Isotropic checkerboard surface emitter

Defines a plane of alternating squares of emission forming a checkerboard pattern. Useful in debugging and as a light source in test scenes.

Parameters
• width (float) – The width of the squares in metres.

• emission_spectrum1 (SpectralFunction) – Emission spectrum for square one.

• emission_spectrum2 (SpectralFunction) – Emission spectrum for square two.

• scale1 (float) – Intensity of square one emission.

• scale2 (float) – Intensity of square two emission.

>>> from raysect.primitive import Box
>>> from raysect.optical import World, rotate, Point3D, d65_white
>>> from raysect.optical.material import Checkerboard
>>>
>>> world = World()
>>>
>>> # checker board wall that acts as emitter
>>> emitter = Box(lower=Point3D(-10, -10, 10), upper=Point3D(10, 10, 10.1), parent=world,
transform=rotate(45, 0, 0))
>>> emitter.material=Checkerboard(4, d65_white, d65_white, 0.1, 2.0)

class raysect.optical.material.debug.Light

A Lambertian surface material illuminated by a distant light source.

This debug material lights the primitive from the world direction specified by a vector passed to the light_direction parameter. An optional intensity and emission spectrum may be supplied. By default the light spectrum is the D65 white point spectrum.

Parameters
• light_direction (Vector3D) – A world space Vector3D defining the light direction.

• intensity (float) – The light intensity in units of radiance (default is 1.0).

• spectrum (SpectralFunction) – A SpectralFunction defining the light’s emission spectrum (default is D65 white).

class raysect.optical.material.debug.PerfectReflectingSurface

A material that is perfectly reflecting.