WaBis

walter.bislins.ch

JSG3D: JsgLightSource

JsgLightSource Objekte werden in der LightSourceList eines Scene Objektes gespeichert. Scene ist ein Property der JsGraph3D Klasse. Das Scene Objekt wird beim Erzeugen des JsGraph3D Objektes angelegt. Ein JsgLightSource Objekt wird am einfachsten mit der Funktion AddLightSource() erzeugt und in der LightSourceList gespeichert. Die JsgLightSource Properties dürfen nur gelesen werden.

JsgLightSource Klasse

JsgLightSource = {
LightColor: JsgColor; ReadOnly; Init = JsgColor.White()
Farbe der Lichtquelle.
DiffInt: Number(0..1,>1); ReadOnly; Init = 1
Lichtstärke des diffusen Lichtanteils.
SpecInt: Number(0..1,>1); ReadOnly; Init = 1
Lichtstärke des Glanzlichtanteils (Specular) der Lichtquelle.
LightDir: JsgVect3 or null; ReadOnly; Init = JsgVect3(0,0,1)
Richtung zur Lichtquelle.
LightPos: JsgVect3 or null; ReadOnly; Init = null
Position der Lichtquelle.
}

Es ist entweder die Richtung zu einer unendlich entfernten Lichtquelle LightDir oder die Position der Lichtquelle LightPos definiert. Ist LightPos definiert, ist LightDir = null und umgekehrt.

JsgLightSource Objekte werden mit der Funktion AddLightSource() in der LightSourceList eines Scene Objektes gespeichert.

JsgLightSource Properties

LightColor Farbe der Lichtquelle
DiffInt Intensität des diffusen Lichtanteils
SpecInt Intensität des Glanzlicht-Anteils
LightDir Richtung vom Ursprung zur Lichtquelle
LightPos Position der Lichtquelle

JsgLightSource Funktionen

JsgLightSource() Konstruktor eines JsgLightSource Objektes.
AddLightSource() Erzeugt eine neue Lichtquelle für die Scene oder fügt ein JsgLightSource Objekt der Scene hinzu.

JsgLightSource.LightColor

JsgLightSource.LightColor: JsgColor; ReadOnly; Init = JsgColor.White();AddLightSource()

Farbe der Lichtquelle. Die effektive Farbe hängt auch vom Property AreaColor einer Fläche ab. Sind mehrere Lichtquellen definiert, ist die effektive Farbe ein Gemisch der Farben aller Lichtquellen und der Flächenfarbe, abhängig vom Betrachtungswinkel der Fläche.

Damit die Beleuchtung der Lichtquellen berechnet wird, muss ApplyPhong = true gesetzt sein. Ist ApplyPhong = false, werden alle Lichtquellen für die Einfärbung der entsprechenden Flächen ignoriert.

JsgLightSource.DiffInt

JsgLightSource.DiffInt: Number(0..1,>1); ReadOnly; Init = 1;AddLightSource()

Diffuse Lighting Intensity: Stärke des diffusen Lichtanteils. Es sind auch Werte grösser als 1 erlaubt.

Die effektive Helligkeit des Diffusen Lichtanteils setzt sich zusammen aus DiffInt und DiffRefl der Fläche.

Damit die Beleuchtung der Lichtquellen berechnet wird, muss ApplyPhong = true gesetzt sein. Ist ApplyPhong = false, werden alle Lichtquellen für die Einfärbung der entsprechenden Flächen ignoriert.

JsgLightSource.SpecInt

JsgLightSource.SpecInt: Number(0..1,>1); ReadOnly; Init = 1;AddLightSource()

Specular Lighting Intensity: Stärke des spiegelnden Lichtanteils. Es sind auch Werte grösser als 1 erlaubt.

Die effektive Helligkeit des Glanzlichtanteils setzt sich zusammen aus SpecInt und SpecRefl der Fläche.

Damit die Beleuchtung der Lichtquellen berechnet wird, muss ApplyPhong = true gesetzt sein. Ist ApplyPhong = false, werden alle Lichtquellen für die Einfärbung der entsprechenden Flächen ignoriert.

JsgLightSource.LightDir

JsgLightSource.LightDir: JsgVect3 or null; ReadOnly; Init = JsgVect3(0,0,1);AddLightSource()

Richtung zur Lichtquelle, welche sich im unendlichen befindet. Dieser Vector ist normiert, d.h. seine Länge ist immer 1. Wenn LightDir definiert ist, ist LightPos = null.

Eine mit LightDir definierte Lichtquelle befindet sich unendlich weit weg und entspricht einer unendlich grossen Lichtfläche. Dies simuliert z.B. das Licht einer Sonne. Alle Lichtstrahlen sind parallel.

JsgLightSource.LightPos

JsgLightSource.LightPos: JsgVect3 or null; ReadOnly; Init = null;AddLightSource()

Position der Lichtquelle. Wenn LightPos definiert ist, ist LightDir = null.

Eine mit LightPos definierte Lichtquelle ist ein punktförmiges Licht an der Position LightPos im Raum. Die Lichtstrahlen sind nicht parallel, sondern schneiden sich alle an der Lichtquelle. Im Gegensatz zu realen Lichtquellen nimmt jedoch die Helligkeit des Lichtes nicht mit dem Abstand zur Lichtquelle ab.

JsgLightSource()

new JsgLightSource( Params )

Params: JsgLightSourceDef or JsgLightSource; Optional; Default = { }
Return: JsgLightSource

Erzeugt eine Licht-Quelle JsgLightSource und initialisiert sie mit Werten, welche in Params übergeben werden. Wenn Params ein JsgLightSource Objekt ist, wird eine Kopie dieses Objektes zurückgegeben.

In Params müssen nur Properties definiert werden, welche von den Default-Werten abweichen.

Eine JsgLightSource muss nicht explizit erzeugt werden, sie wird implizit mit der Funktion AddLightSource() erzeugt und in die LightSourceList der JsGraph3D.Scene eingefügt.

Eine Explizit erzeugte JsgLightSource kann auch mit der Funktion AddLightSource() der Scene hinzugefügt werden.

Eine Liste von explizit erzeugten JsgLightSource Objekten kann mit der Funktion SetLight() in der Scene installiert werden. Dabei werden bereits bestehende Lichtquellen durch die Lichtquellen der Liste ersetzt:

JsgLightSourceDef

JsgLightSourceDef = {
LightColor: JsgColor; Optional; Default = JsgColor.White()
Farbe der Lichtquelle.
DiffInt: Number(>=0); Optional; Default = 1
Diffuse Intensity: Stärke des diffusen Lichtanteils (0-1). Es sind auch Werte über 1 erlaubt, wenn dieser Anteil extrem stark sein soll.
SpecInt: Number(>=0); Optional; Default = 1
Specular Intensity: Stärke des spiegelnden Lichtanteils (0-1). Es sind auch Werte über 1 erlaubt.
LightDir: JsgVect3; Optional; Default = JsgVect3.New(0,0,1)
Vektor zu einer unendlich weit entfernten Lichtquelle. Es kann nur entweder LightDir oder LightPos verwendet werden! Die Länge des Vektors muss nicht 1 sein, wird aber im Property LightDir mit Länge 1 gespeichert.
LightPos: JsgVect3; Optional; Default = null
Position einer punktförmigen Lichtquelle. Es kann nur entweder LightDir oder LightPos verwendet werden!
HAng: Number; Optional; Default = 0
Horizontaler Winkel zur Lichtquelle. Gemessen in der XY-Ebene von der X-Achse zur Y-Achse in Grad.
VAng: Number; Optional; Default = 0
Vertikaler Winkel zur Lichtquelle. Gemessen von der XY-Ebene zur Z-Achse in Grad.
Dist: Number(>0); Optional; Default = 100
Distanz zur Lichtquelle.
RefPoint: JsgVect3; Optional; Default = JsgVect3.Null()
Referenzpunkt, von dem aus die Position der Lichtquelle über die Winkel HAng und VAng, sowie der Abstand Dist berechnet wird. Wird RefPoint angegeben, so wird eine punktförmige Lichtquelle erzeugt. Wird RefPoint nicht angegeben, so wird eine unendlich weit entfernte Lichtquelle erzeugt (parallele Lichtstrahlen).
}

Es müssen nur jene Properties definiert werden, welche von den Defaultwerten abweichen.

Die ersten 5 Properties entsprechen den JsgLightSource Properties. Wenn einer der anderen 4 Properties definiert ist, wird LightDir bzw. LightPos aus diesen 4 Werten berechnet. Für nicht definierte Properties wird jeweils der Defaultwert verwendet.

Hinweis: Von den Farben wird keine Kopie erstellt, sondern es werden die Referenzen auf die Farben in Params im JsgLightSource Objekt gespeichert. Änderungen an diesen Farben wirken sich daher auf die Lichtquelle aus. Ist dies nicht erwünscht, kann in Params mit der Funktion JsgColor.Copy() eine Kopie des Farb-Objektes übergeben werden.

Code-Beispiele

var lsList = [];

lsList.push( new JsgLightSource( { 
  LightColor: JsgColor.RGB(1,0,0),
  LightDir: JsgVect3.New( 0, 0.5, 1 )
} ) );

lsList.push( new JsgLightSource( { 
  LightColor: JsgColor.RGB(0,0,1),
  LightDir: JsgVect3.New( 0, -0.5, 1 )
} ) );

g3d.SetLight( { LightSourcList: lsList } );

Mit dieser Methode können mehrere JsgLightSource-Listen extern verwaltet werden und bei Bedarf mit SetLight() einer Scene hinzugefügt werden.

Ein Beispiel wie die Funktion AddLightSource() verwendet werden kann, um einzelne Lichtquellen zu erzeugen:

g3d.AddLightSource( { 
  LightColor: JsgColor.RGB(1,0,0),
  LightDir: JsgVect3.New( 0, 0.5, 1 )
} );

g3d.AddLightSource( { 
  LightColor: JsgColor.RGB(0,0,1),
  LightDir: JsgVect3.New( 0, -0.5, 1 )
} );

Es kann auch die gesamte Beleuchtung auf einmal mit der Funktion SetLight() erzeugt werden:

g3d.SetLight( {
  LightSourceList: 
  [
    {
      LightColor: JsgColor.RGB(1,0,0),
      LightDir: JsgVect3.New( 0, 0.5, 1 )
    },
    {
      LightColor: JsgColor.RGB(0,0,1),
      LightDir: JsgVect3.New( 0, -0.5, 1 )
    }
  ]
} );

Weitere Infos zur Seite
Erzeugt Mittwoch, 27. Januar 2016
von wabis
Zum Seitenanfang
Geändert Montag, 8. Februar 2016
von wabis