User Tools

Site Tools


tutorials:basic-spectral-light-modeling

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
tutorials:basic-spectral-light-modeling [2025/06/04 07:46] MHtutorials:basic-spectral-light-modeling [2025/06/04 14:08] (current) MH
Line 86: Line 86:
  
 <code java> <code java>
 +import de.grogra.gpuflux.scene.experiment.Measurement;
 +
 Measurement spectrum = LM.getAbsorbedPowerMeasurement(x); Measurement spectrum = LM.getAbsorbedPowerMeasurement(x);
 float absorbedPower = spectrum.integrate(); float absorbedPower = spectrum.integrate();
Line 137: Line 139:
  
 <code java> <code java>
 +import de.grogra.gpuflux.imp3d.spectral.SpectralCurve;
 +import de.grogra.gpuflux.imp3d.spectral.IrregularSpectralCurve;
 +
 const float[] WAVELENGTHS = {380, 410, 420, 450, 465, 480, 490, 600, 620, 630, 640, 655, 660, 670, 690, 700, 720}; const float[] WAVELENGTHS = {380, 410, 420, 450, 465, 480, 490, 600, 620, 630, 640, 655, 660, 670, 690, 700, 720};
-const AMPLITUDES = {0.05, 0.1, 0.4, 0.63, 0.25, 0.15, 0.05, 0.01, 0.1, 0.3, 0.4, 0.85, 0.75, 0.95, 0.6, 0.25, 0.1};+const float[] AMPLITUDES = {0.05, 0.1, 0.4, 0.63, 0.25, 0.15, 0.05, 0.01, 0.1, 0.3, 0.4, 0.85, 0.75, 0.95, 0.6, 0.25, 0.1};
  
-const ChannelSPD TEST_SPD = new ChannelSPD(new IrregularSpectralCurve(WAVELENGTHS, AMPLITUDES)); +const SpectralCurve TEST_SPD = new IrregularSpectralCurve(WAVELENGTHS, AMPLITUDES)); 
 </code> </code>
  
Line 155: Line 160:
  
 {{ :tutorials:light_SpectralCurve.png?direct&200 |}} {{ :tutorials:light_SpectralCurve.png?direct&200 |}}
- 
  
 Since these spectral curve classes all implement the same //SpectralCurve// interface, they can be used in the same way and are therefore exchangeable.  Since these spectral curve classes all implement the same //SpectralCurve// interface, they can be used in the same way and are therefore exchangeable.
  
 <code java> <code java>
 +import de.grogra.gpuflux.imp3d.spectral.SpectralCurve;
 +import de.grogra.gpuflux.imp3d.spectral.IrregularSpectralCurve;
 +import de.grogra.gpuflux.imp3d.shading.ChannelSPD; 
 +
 //user defined spectral curve, applied to an IrregularSpectralCurve //user defined spectral curve, applied to an IrregularSpectralCurve
 float[] WAVELENGTHS = {380, 485, 490, 610, 615, 720}; float[] WAVELENGTHS = {380, 485, 490, 610, 615, 720};
Line 177: Line 185:
 ChannelSPD REG_SPD = new ChannelSPD(new CIENormSpectralCurve(Attributes.CIE_NORM_D55)); ChannelSPD REG_SPD = new ChannelSPD(new CIENormSpectralCurve(Attributes.CIE_NORM_D55));
  
-// a black body spectral curve with a temperature of 5000K+//a black body spectral curve with a temperature of 5000K
 ChannelSPD REG_SPD = new ChannelSPD(new BlackbodySpectralCurve(5000)); ChannelSPD REG_SPD = new ChannelSPD(new BlackbodySpectralCurve(5000));
 </code> </code>
Line 186: Line 194:
  
 <code java> <code java>
-const float[] WAVELENGTHS = {380,385,...}; +import de.grogra.gpuflux.imp3d.objects.SpectralLight; 
-const float[] AMPLITUDES = {0.000967721, 0.000980455...};+import de.grogra.gpuflux.imp3d.spectral.SpectralCurve; 
 +import de.grogra.gpuflux.imp3d.spectral.IrregularSpectralCurve; 
 +  
 +//user defined spectral curve, applied to an IrregularSpectralCurve 
 +const float[] WAVELENGTHS = {380, 485490, 610, 615, 720}; 
 +const float[] AMPLITUDES = {0,0,1,1,0,0}; 
 +const SpectralCurve TEST_SPD = new IrregularSpectralCurve(WAVELENGTHS, AMPLITUDES);  
  
 module MyLamp extends LightNode() { module MyLamp extends LightNode() {
     {     {
         setLight(         setLight(
-            new SpectralLight(new IrregularSpectralCurve(WAVELENGTHS, AMPLITUDES)).(+            new SpectralLight(TEST_SPD).(
                 setPower(100), // [W]                 setPower(100), // [W]
                 setLight(new PointLight())                 setLight(new PointLight())
Line 199: Line 214:
     }     }
 } }
 +
 +protected void init() [
 + Axiom ==> MyLamp;
 +]
 </code> </code>
  
 +Note: //ChannelSPD// are the input for shader, while //SpectralCurve// is the expected input data type for //LightNodes// objects.
  
 Within the //CIENormSpectralCurve// class, a small database of several predefined standard spectral curves is given: Within the //CIENormSpectralCurve// class, a small database of several predefined standard spectral curves is given:
Line 221: Line 241:
   {   {
     setLight(     setLight(
-      new SpectralLight( +      new SpectralLight( new CIENormSpectralCurve(Attributes.CIE_NORM_D65) ).(
-        new CIENormSpectralCurve(Attributes.CIE_NORM_D65) +
-      ).(+
  setPower(100), //[W]  setPower(100), //[W]
  setLight(new PointLight())  setLight(new PointLight())
Line 235: Line 253:
 Using the SPD, we define the light 'composition' or light quality. Using the SPD, we define the light 'composition' or light quality.
  
-In the above example, a PointLight is used as light source to emit the wanted spectrum. In the next step, we will continue and show how to define and use user-defined light emission pattern. The keyword here is **PLD** = **P**hysical **L**ight **D**istribution.+In the above example, a //PointLight// is used as light source to emit the wanted spectrum. In the next step, we will continue and show how to define and use user-defined light emission pattern. The keyword here is **PLD** = **P**hysical **L**ight **D**istribution.
  
 This is especially helpful or necessary for any definition of artificial light sources, such as those found in greenhouses, including HPS lamps or modern LED-based light systems, which are usually equiped with a reflector. This is especially helpful or necessary for any definition of artificial light sources, such as those found in greenhouses, including HPS lamps or modern LED-based light systems, which are usually equiped with a reflector.
Line 313: Line 331:
  
 <code java> <code java>
-float[] WAVELENGTHS = {380, 485, 490, 610, 615, 720}+import de.grogra.gpuflux.imp3d.shading.ChannelSPD
-float[] AMPLITUDES = {0,0,1,1,0,0}+import de.grogra.gpuflux.imp3d.spectral.IrregularSpectralCurve
-ChannelSPD GREEN_SPD = new ChannelSPD(new IrregularSpectralCurve(WAVELENGTHS, AMPLITUDES))+import de.grogra.gpuflux.imp3d.spectral.RGBSpectralCurve; 
 +import de.grogra.gpuflux.imp3d.spectral.ConstantSpectralCurve;
  
-ChannelSPD RED_SPD new ChannelSPD(new RGBSpectralCurve(0.8,0,0));  +static float[] WAVELENGTHS {380, 485, 490, 610, 615, 720}; 
-ChannelSPD CONST_SPD = new ChannelSPD(new ConstantSpectralCurve(0.25)); +static float[] AMPLITUDES = {0,0,1,1,0,0}
 +static ChannelSPD GREEN_SPD = new ChannelSPD(new IrregularSpectralCurve(WAVELENGTHS, AMPLITUDES)); 
  
-// shader definition as global variable+static ChannelSPD RED_SPD = new ChannelSPD(new RGBSpectralCurve(0.8,0,0));  
 +static ChannelSPD CONST_SPD = new ChannelSPD(new ConstantSpectralCurve(0.25));  
 + 
 +//shader definition as global variable
 Phong myShader0 = new Phong(); Phong myShader0 = new Phong();
 static { static {
Line 327: Line 350:
 } }
  
-//as a module that is interpreted as Box+//and use of the global shader within a module that is interpreted as Box
 module TestBox ==> { module TestBox ==> {
 } Box(0.001,1,1).(setShader(myShader0)); } Box(0.001,1,1).(setShader(myShader0));
  
  
- +//or define the shader within a module that extends a Box
-//within a module that extends a Box+
 module TestBox extends Box(0.001,1,1) { module TestBox extends Box(0.001,1,1) {
          
Line 356: Line 378:
  
  
-==== Sensor nodes ==== 
- 
-To monitor light distributions with a scene without interfering, GroIMP provides the //SensorNode// class, a sphere that can be placed arbitrarily within the scene. To obtain the sensed spectrum, the //getSensedIrradianceMeasurement()// function needs to be called. 
- 
-Note: The size of the sensor node directly correlates with the probability of got hit by a light ray. For a very small sphere the probability to got hit by a light ray is relatively low, so the number of light rays simulated by the light model needs to be much larger to get repayable results. Therefore, better not to use very small sensor nodes. 
- 
-Note: The colour of the sensor node determines which wavelengths should be observed. The default value is white, what stands for monitor all colours. If, for instance, the sensor colour is set to red, only red spectra will be sensed. 
- 
-Note: The output of a sensor node is normalized to absorbed radiance per square meter, independent of the actual size of the sensor.  
- 
-Note: Sensor nodes can be enabled and disabled for the light model using the LM.setEnableSensors(true/false) function. By default they are disabled, since GroIMP version 2.1.4, before they were enabled by default. Having them disabled speeds up the light computation time for scenarios where not sensor nodes are involved.  
- 
-<code java> 
-// create a 5cm, white sensor node 
-Axiom ==> SensorNode().(setRadius(0.05), setColor(1, 1, 1)); 
- 
-//check what the sensor node has sensed 
-x:SensorNode ::> { 
-    Measurement spectrum = lm.getSensedIrradianceMeasurement(x); 
-    float absorbedPower = spectrum.integrate(); 
-    ... 
-} 
-</code> 
  
  
Line 404: Line 403:
 </code> </code>
  
 +GroIMP supports the inport of 'Spectral Distribution Files, *.spd' as input for spectral curves, and 'Luminance Files, *.lum' as well as 'IES Light Distribution Files, *.ies' as inport formats for PLDs.
  
 ==== Example ==== ==== Example ====
Line 442: Line 441:
 </code> </code>
  
-The model will run and directly when saved, creates an instance of the light model, set wanted parameters and run it. there will be no output (except the one form the light model itself, stating that it was executed and giving some statistics on the scene). +The model will run and directly when saved, creates an instance of the light model, set wanted parameters and run it. there will be no output (except the one form the light model itself, stating that it was executed and giving some statistics on the scene and further stating that no light sources could be found within the scene). 
  
 If you already get errors here, your system most probably does not support spectral light modelling. If you already get errors here, your system most probably does not support spectral light modelling.
tutorials/basic-spectral-light-modeling.1749015972.txt.gz · Last modified: 2025/06/04 07:46 by MH