Caribu with simple python object#
This script demonstrate how to illuminate a scene with caribu algorithms using only simple python objects.
I. Create scene and lights#
# define geometry of triangles points
triangle_1 = [(0, 0, 0), (1, 0, 0), (0, 1, 0)]
triangle_2 = [(0, 0, 1e-5), (1, 0, 1e-5), (0, 1, 1e-5)]
# define triangles list (scene)
triangles = [triangle_1, triangle_2]
# define optical property associate to triangle
material_triangle_1 = (0.06, 0.04) # reflectance & transmitance
material_triangle_2 = (0.06, 0.04) # reflectance & transmitance
# define materials list
materials = [material_triangle_1, material_triangle_2]
# create a zenital light
vertical_light = (100, # horizontal irradiance of the source
(0, 0, -1)) # direction vector of the source
# define light sources
lights = [vertical_light]
II. Scene illumination#
II.1 Show result#
def show_result(res):
print("Index of the triangles : ", res['index'])
print("The internal barcode : ", res['label'])
print("The individual areas of triangles : ", res['area'])
print("Surfacic density of energy : \n")
print("\t- absorbed by the triangles : ", res['Eabs'])
print("\t- incoming on the triangles :", res['Ei'])
print("\t- incoming on the inferior face of the triangle", res['Ei_inf'])
print("\t- incoming on the superior face of the triangle", res['Ei_sup'])
II.2 Raycasting#
Raycasting allows to evaluate the direct illumination (first order = (no transmitance, no reflectance), without rediffusion) of a scene
from openalea.caribu.caribu import raycasting
# call raycasting algorithm for lightening the scene
res = raycasting(triangles, materials, lights)
show_result(res)
Index of the triangles : [0.0, 1.0]
The internal barcode : ['100001001000', '100001001000']
The individual areas of triangles : [0.5, 0.5]
Surfacic density of energy :
- absorbed by the triangles : [0.0, 89.887321]
- incoming on the triangles : [0.0, 99.87480111111111]
- incoming on the inferior face of the triangle [0.0, 0.0]
- incoming on the superior face of the triangle [0.0, 99.874802]
II.3 Radiosity#
Radiosity allows to evaluate the exact illumination (all orders, with rediffusions) of a scene
from openalea.caribu.caribu import radiosity
res = radiosity(triangles, materials, lights)
show_result(res)
Index of the triangles : [0.0, 1.0]
The internal barcode : ['100001001000', '100001001000']
The individual areas of triangles : [0.5, 0.5]
Surfacic density of energy :
- absorbed by the triangles : [3.615814, 90.104706]
- incoming on the triangles : [4.017571111111111, 100.11634]
- incoming on the inferior face of the triangle [0.0, 0.24154]
- incoming on the superior face of the triangle [4.017571, 99.874802]
II.3 Mixed radiosity#
Mixed radiosity allows to evaluate an optimised approximative solution of the illumination (all orders, with rediffusions) of an infinitly reapeated scene. The optimisation consists of using radiosity in a given neighbourhood and a turbid medium algorithm for the rest of the rediffusion.
from openalea.caribu.caribu import mixed_radiosity
# number of layers for running the turbid medium algrothm
layers = 2
# height of the canopy
height = 1
soil_reflectance = 0.2
# 2D Coordinates of the domain bounding the scene for its replication.
# (xmin, ymin, xmax, ymax)
domain = (0, 0, 1, 1)
# diameter of the sphere defining the close neighbourhood for local radiosity.
diameter = 0.1
res = mixed_radiosity(triangles, materials, lights, domain, soil_reflectance, diameter, layers, height)
show_result(res)
Index of the triangles : [0.0, 1.0]
The internal barcode : ['100001001000', '100001001000']
The individual areas of triangles : [0.5, 0.5]
Surfacic density of energy :
- absorbed by the triangles : [3.620033, 90.209846]
- incoming on the triangles : [4.022258888888889, 100.23316222222222]
- incoming on the inferior face of the triangle [0.0, 0.241822]
- incoming on the superior face of the triangle [4.022259, 99.991341]