Waarnemen, Zien, kijken en leren kijken bij fotografieStijn Swinnen
Presentatie door Toon Blux over Waarnemen: Zien, kijken en leren kijken bij fotografie. Deze presentatie werd gegeven tijdens een clubavond voor Lenske Boortmeerbeek.
www.lenske.be
MIPOW Creative Bluetooth Solar Energy Garden Lamp, APP Software / Light Contr...Jason Gong
This document provides the specifications for the MIPOW BTL400 Intelligent Solar Energy Lawn Lamp, including its dimensions, weight, and package contents. The lamp weighs 0.270 kg and measures 14.2 x 4.5 x 4.5 cm. It comes packaged with a bilingual manual and weighs 0.425 kg total within a package measuring 16 x 18.6 x 18.6 cm.
Lightning Talk #15: Beyond Usability: Elements of Great Modern User Experienc...ux singapore
We are now at an era where reliability, speed and usability are baseline expectations in every piece of technology in our lives. We are now at a stage where we should be asking much richer, much complex questions that will guide where we focus our attention in creating great user experiences. Usability is an important part of user experience, but it is far from being the only factor in creating great user experiences.
Through this talk, you will learn about the historic development of the field of ergonomics and its influence on the field of usability and the parallel developments in computing. You will also be introduced to 10 areas of focus that constitute the success of modern user experiences.
Cooking your Ravioli "al dente" with Hexagonal ArchitectureJeroen Rosenberg
Hexagonal architecture (a.k.a. ports and adapters) is a fancy name for designing your application in a way that the core domain is separated from the outside world by input and output ports. With a little bit of imagination one can visualise this as a hexagon made up of domain objects, use cases that operate on them, and input and output ports that provide an interface to the outside world.
Many projects involve integration or communication with external software systems. Think of databases, 3rd party services, but also application platforms or SDKs. Such integrations and dependencies can quickly get in your way, clutter your core domain and reduce the testability of your core business logic. In this talk, I will demonstrate how a hexagonal architecture helps you to reduce dependencies on external software systems and enables you to apply standard software engineering best practices on the core domain of your application, such as testability, separation of concerns, and reusability.
Join this talk to learn the ins and outs (pun intended) of the hexagonal architecture paradigm and get practical advice and examples to apply to your software projects right away!
This document provides examples and explanations of different Solr query types and configurations including:
- Faceting queries to return counts of field values without results
- Filter queries to reduce the result set
- Range queries using date math syntax
- Distributed searching across multiple cores/servers
- Grouping queries to organize results by field values
- Explanations of caching, field types, indexing and other Solr concepts.
CoffeeScript attempts to expose the "good parts" of JavaScript in a simpler syntax. It compiles to plain JavaScript, so it is just JavaScript under the hood. CoffeeScript's core is good, as it allows exposing JavaScript's best features while abstracting away more complex or error-prone parts of the language. The syntax sugar in CoffeeScript makes JavaScript code more concise and readable.
This document introduces websocket-rails, a gem for building real-time web applications using websockets in Ruby on Rails. It allows asynchronous full-duplex communication by using websockets instead of traditional HTTP requests. The gem maps websocket events to controller actions, and controllers can then trigger events that are broadcast to clients. This enables features like pushing new data to only interested clients in real-time. Code examples demonstrate setting up websocket-rails, defining event mappings and controllers, and binding to events from the client-side.
This thesis is about applying the principles and patterns of Service Oriented Architecture to make a distributed system dynamic reconfigurable on hardware failure. It provides a case study of a radar chain system. In our solution we use the Service Location Protocol and the (R-)OSGI framework to make the radar chain dynamically reconfigurable.
Git is a distributed version control system that allows for easy branching and merging. It offers faster performance than centralized systems like Subversion due to its distributed nature. Key concepts in Git include branching, which is used for interrupted workflows and quick fixes, and merging, which can be done automatically with few conflicts. Tools exist to provide graphical user interfaces for Git.
This document provides examples and explanations of different Solr query types and configurations including:
- Faceting queries to return counts of field values without results
- Filter queries to reduce the result set
- Range queries using date math syntax
- Distributed searching across multiple cores/servers
- Grouping queries to organize results by field values
- Explanations of caching, field types, indexing and other Solr concepts.
CoffeeScript attempts to expose the "good parts" of JavaScript in a simpler syntax. It compiles to plain JavaScript, so it is just JavaScript under the hood. CoffeeScript's core is good, as it allows exposing JavaScript's best features while abstracting away more complex or error-prone parts of the language. The syntax sugar in CoffeeScript makes JavaScript code more concise and readable.
This document introduces websocket-rails, a gem for building real-time web applications using websockets in Ruby on Rails. It allows asynchronous full-duplex communication by using websockets instead of traditional HTTP requests. The gem maps websocket events to controller actions, and controllers can then trigger events that are broadcast to clients. This enables features like pushing new data to only interested clients in real-time. Code examples demonstrate setting up websocket-rails, defining event mappings and controllers, and binding to events from the client-side.
This thesis is about applying the principles and patterns of Service Oriented Architecture to make a distributed system dynamic reconfigurable on hardware failure. It provides a case study of a radar chain system. In our solution we use the Service Location Protocol and the (R-)OSGI framework to make the radar chain dynamically reconfigurable.
Git is a distributed version control system that allows for easy branching and merging. It offers faster performance than centralized systems like Subversion due to its distributed nature. Key concepts in Git include branching, which is used for interrupted workflows and quick fixes, and merging, which can be done automatically with few conflicts. Tools exist to provide graphical user interfaces for Git.
1. Saxion Hogeschool Enschede
D YNAMIC L IGHTING
Implementatie in OpenGL
In dit document wordt uiteengezet hoe dynamische verlichting met
behulp van OpenGL kan worden gesimuleerd. Naast een
uitgebreide introductie van het fenomeen “licht”, bevat dit verslag
tevens een met wiskundige berekeningen onderbouwde handleiding
voor toepassing van de materie in OpenGL in combinatie met c++.
Jeroen Rosenberg
31-3-2008
2. 1 Dynamic Lighting
Voorwoord
Dit document is geschreven in het kader van een studietaak voor het vak
“computer graphics”, als onderdeel van het derde studiejaar van de opleiding
Informatica aan de Saxion Hogeschool te Enschede.
Het verslag voert ons terug naar de oorsprong van licht, waardoor het de lezer
aan de nodige basiskennis in de rest van het document niet zal ontbreken.
Vervolgens wordt uitgebreid aandacht besteed aan de mogelijkheden van
OpenGL met betrekking tot het ontwerp van lichtmodellen. Na het lezen van dit
document beschikt de lezer hopelijk over voldoende kennis om de beschreven
theorie in praktijk te kunnen brengen.
Saxion Hogeschool Enschede | De oorsprong van licht
3. 2 Dynamic Lighting
Inhoudsopgave
1. De oorsprong van licht ......................................................................... 3
1.1 Een stroom van deeltjes of een golf van energie ................................... 3
1.2 De kleur van licht ............................................................................. 4
1.3 Abstracte typen licht ......................................................................... 6
1.3.1 Ambient light ............................................................................. 8
1.3.2 Diffuse light ............................................................................... 9
1.3.3 Specular light ........................................................................... 11
1.3.4 Emissive light ........................................................................... 12
1.4 Berekening van het licht op een willekeurig object .............................. 13
2. Licht in OpenGL ................................................................................ 14
2.1 Lighting en shading models ............................................................. 14
2.1.1 Object shading ......................................................................... 14
2.1.2 Light Models............................................................................. 14
2.1.3 Global ambient light model ......................................................... 15
2.1.4 Smooth shading ....................................................................... 15
2.1.5 Lichttypen ............................................................................... 16
2.1.5.1 Definiëring van een lichtbron................................................. 16
2.1.5.2 In- en uitschakeling van een lichtbron .................................... 17
2.1.5.3 Het definiëren van oppervlakmateriaal.................................... 18
2.1.5.4 Polygon winding .................................................................. 19
2.1.5.5 Materiaal eigenschappen ...................................................... 20
2.1.5.6 Overige eigenschappen ........................................................ 22
2.2 Normaal berekening ....................................................................... 23
2.2.1 Berekening van de vectoren ....................................................... 24
2.2.2 Berekening van het uitwendig product ......................................... 25
2.2.3 Normaliseren van de normaal ..................................................... 26
Saxion Hogeschool Enschede | De oorsprong van licht
4. 3 Dynamic Lighting
1. DE OORSPRONG VAN LICHT
Licht is het belangrijkste aspect achter visuele representatie van elk willekeurig
signaal dat een mens visueel waarneemt. Perceptie van licht vindt zijn oorsprong
in het feit dat wat men kan zien niet gebaseerd is op de objecten die men
bekijkt, maar op de reflectie van lichtstralen, die uitgezonden zijn vanuit een
lichtbron, door deze objecten. Het is belangrijk om te beseffen dat onze ogen
objecten niet direct zien, omdat hier tussen geen lichamelijke correlatie bestaat.
Lichtstralen reizen theoretisch in een rechte lijn. Op het moment dat men een
object visueel waarneemt, zijn het deze lichtstralen die door dat object
gereflecteerd of verstrooid zijn. Bij het programmeren van een 3D licht engine,
waarbij men gebruik maakt van de OpenGL lichtmodellering functies, is het
belangrijk de volgende twee regels te begrijpen:
Je ogen zijn mechanismen die gemaakt zijn om deeltjes van licht waar te
nemen en niet de objecten zelf. Als een programmeur zul je deze werking
op het computer scherm moeten simuleren.
Een lichtstraal reist in een rechte lijn.
1.1 Een stroom van deeltjes of een golf van energie
Het laatstgenoemde punt hoeft niet per definitie waar te zijn. Er zijn twee
manieren om licht te beschouwen. Een theorie beschrijft het licht als een stroom
van deeltjes. Een tweede theorie ziet licht als een golf van energie. De oude
Grieken zagen licht als een stroom van deeltjes die reizen in een rechte lijn en
tegen een muur kaatsen op dezelfde manier als andere fysieke objecten doen.
Men kon het licht niet zien, omdat de deeltjes simpelweg te klein of te snel voor
het oog waren.
In de zeventiende eeuw werd voorgesteld dat licht een golf van energie was die
niet exact in een rechte lijn reisde. Dit werd in het jaar 1807 bevestigd met een
experiment dat demonstreerde dat het licht, wanneer het een smalle opening
passeerde, extra licht uitstraalde aan de andere kant van de opening. Hierdoor
was bewezen dat het licht zich in de vorm van een golf moest verplaatsen om
zich op deze manier te spreiden.
Albert Einstein ontwikkelde de theorie van licht verder in het jaar 1905. Hij sprak
van het “foto-elektrische effect”, waarbij ultraviolet licht elektronen van het
oppervlak dat het raakte uitstraalde. Deze theorie beschouwde licht als een
stroom van energie pakketjes, de zogenaamde fotonen.
Hieruit kunnen we concluderen dat licht zich zowel als een golf als pakketjes van
energie deeltjes (fotonen) kan gedragen.
Saxion Hogeschool Enschede | De oorsprong van licht
5. 4 namic Lighting
Dyn
1.2 De kleu van lic
ur cht
Het licht dat he menselijk oog kan zien bestaa in het alg
et ke at gemeen uit een mix
van allerlei soor
rten licht ve
erstrooid en weerkaatst tegen de o
t omringende objecten
met elk hun eigen materiaal eigensc chappen. Alle fysieke ddeeltjes bestaan uit
atom
men. De manier van ref flectie van f
fotonen doo fysieke de
or eeltjes hang o.a. af
gt
van het soort a atoom, het a aantal atommen van elk soort en de volgorde van de
ke
men in het object dat de fotone weerkaatst. Sommi
atom t en ige fotonen worden
n
weerrkaatst en ssommige ge eabsorbeerd Dit conce bepaald de visuele kwaliteit
d. ept
van materiaal. De kleur lic cht die het materiaal w weerkaatst wordt gezie als de
en
kleur van dat materiaal. Des te me
r eer licht erd
door het mmateriaal weeerkaatst
word des te m
dt, meer het lijjkt
te glimmen voor het
h
menselijk oog.
Elke verschillende kle
eur
bestaaat eenvo oudigweg uitu
enerrgie die weergegeve en
kan worden door eeen
golfle
engte die zichtbaar is
voor het oog. Een golfleng
r E gte
word gemeten tussen twe
dt ee
toppen of dalen van ee en
enerrgiegolf.
F
Figuur 1 – Een golflengte w
n wordt gemete tussen
en
twee toppen of dalen van een golf
n n
Saxion Hogeschool En
nschede | D oorsprong van licht
De
6. 5 namic Lighting
Dyn
Het zzichtbare lic ligt tusse de golflengtes variërend van 39 nanometer (violet
cht en 90
licht) tot 720 nanometer (rood licht Het segment van golflengtes die hier
) t).
tusse liggen wo
en ordt het kleurenspectru genoemd.
um
Figuur 2 – Het kleu
urenspectrum
m
Bij het “pr
j rogramm meren van
n
lic
cht” hoev
ven wij a
alleen
rekening t houden met
te
zic
chtbaar llicht.
Saxion Hogeschool En
nschede | D oorsprong van licht
De
7. 6 namic Lighting
Dyn
1.3 Abstrac typen licht
cte n
Om het effect vvan licht in OpenGL te begrijpen, is het goed om stil te staan bij
de drie verschillende soorte lichtbronn
en nen die Ope
enGL onders scheidt:
Directio
onal lights, waarbij we ons voorstellen dat d lichtbron oneindig
e de
ver weg is, zodat de lichtstralen parallel aa elkaar lop
e n an pen.
Point lig ghts, waarb de lichtb
bij catie heeft in de ruimte en licht
bron een loc e
in alle ric
chtingen uitzendt.
hts, waarbij de lichtbro eveneens een locatie heeft in de ruimte,
Spotligh on s e e
maar alle
een licht uitzendt binne een kegel.
en
Figuu 3 – Directio
ur onal light
Figuu 4– Point lig
ur ght
Figuu 5 - Spotligh
ur ht
Saxion Hogeschool En
nschede | D oorsprong van licht
De
8. 7 Dynamic Lighting
Echte lichtbronnen zenden licht uit van area sources (bronnen die licht vanuit
een bepaald gebied uitzenden) of volume sources (driedimensionale bronnen
van uitzendend licht). Point lights zijn een redelijke benadering van werkelijke
lichtbronnen, maar produceren niet altijd visueel correcte informatie. Zo hebben
schaduwen die gegenereerd worden door point lights scherpe hoeken, terwijl
schaduwen gegenereerd door echte lichtbronnen een vloeiende rand hebben.1
Voor het representeren van licht bij het programmeren zijn er een aantal
abstracte termen die specifieke effecten van licht beschrijven samengevoegd tot
abstracte typen licht. De terminologie van deze typen is essentieel voor een
grafische programmeur. Deze set van effecten geeft bij langer na niet alle
effecten die licht kan produceren weer, maar doet dienst als een redelijke
benadering hiervan.
Het is belangrijk om te begrijpen welk effect elk van deze abstracte typen licht
hebben op het oppervlak van 3D objecten. De typen zijn bedacht omdat het
noodzakelijk is dat bepaalde effecten van licht op objecten beschreven zijn om
zo de ingewikkelde wiskundige berekeningen te distilleren. Dit betekent echter
niet dat deze typen in werkelijkheid bestaan. Het zou erg tijdrovend zijn om de
werkelijke mechaniek van licht te berekenen. Derhalve onderscheidt OpenGL de
volgende soorten licht:
Ambient light (omgevingslicht)
Diffuse light (diffuus licht)
Specular light (spiegelend licht)
Daarnaast kent OpenGL emissive light (uitzendend licht). Deze wordt los
gezien van de andere typen, omdat het licht beschrijft dat uitgezonden wordt
door objecten, waar de andere drie typen licht beschrijven afkomstig van een
lichtbron. Elke lichtbron in OpenGL heeft naast een positie en een richting
verschillende additionele attributen. Elk licht kan monochroom zijn, een RGB
kleur en zelfs meerdere kleuren bevatten om de bijdrage van ambient, diffuse en
specular light te vertegenwoordigen. Ook kan voor deze kleuren de intensiteit
worden ingesteld en heeft elk licht een flag om aan te geven of het licht aan of
uit is. De overige attributen zijn afhankelijk van het type licht.
In de volgende paragrafen worden de verschillende typen licht die OpenGL
onderscheidt nader toegelicht.
1
D.H. Eberly, 3D Game Engine Design, Amsterdam: Morgan Kaufmann
publishers, 2007, p. 92-94.
Saxion Hogeschool Enschede | De oorsprong van licht
9. 8 namic Lighting
Dyn
1.3. Ambien light
.1 nt
Amb bient light is eigenlijk oo geen ech lichtbron maar het gemiddelde volume
ok hte n, t e
van licht dat wo ordt gecreëe door het uitzenden van licht door alle om
erd mringende
bronnen. Wanneer zon
lichtb W nnestralen door het ra
aam van e een kamer schijnen,
raken ze de muur en worden ze gereflecte eerd en ve erstrooid in allerlei
n
verscchillende ric
chtingen, wa aardoor de hele kamer verlicht wo
r ordt. Dit effe wordt
ect
bereikt door de kleur van het ambient light te co
h t ombineren m de kleu van de
met ur
ambient factor van het mat
v teriaal:
De vertegenwwoordigd de scalaire v
e vermenigvuldiging waa
armee het inwendig
berekend2.
product wordt b
Door alleen gebruik te mak
r ken van amb kan een 3D object niet compleet
bient light k
word
den weerge egeven, om mdat alle v vertices evenredig ve erlicht wordden door
deze
elfde kleur licht. Hierdoo lijkt een 3 object tw
or 3D weedimensionaal te zijnn.
Figuur 6 – Een bol
verlicht door
amb bient light
Een 3D bol slechts v
n verlicht
doo ambient light l
or lijkt
twe
eedimenssionaal te zijn.
2
D.H Eberly, 3D Game Eng
H. D gine Design Amsterdam Morgan Kaufmann
n, m:
publishers, 2007 p. 95.
7,
Saxion Hogeschool En
nschede | D oorsprong van licht
De
10. 9 namic Lighting
Dyn
1.3. Diffuse light
.2 e
Diffu
use light, geebaseerd op de wet v
p van Lambert vertegenw
t, woordigd directional
d
light en kan wo
t orden besch hreven als licht met ee positie in de ruimte komend
en n e
vanu een enk
uit kele richting Een zakl
g. lamp die scchuin boven een objeect wordt
gehoouden, kan b beschouwd worden als een lichtbro die diffus light uitze
on se endt.
In de onderstaa ande afbeelding zendt een lichtbron diffuse light met e een rode
kleur uit op de linker kant van onze bo Wanneer het licht h oppervla van de
r ol. r het ak
bol raakt, wordt het verstro
r t ooid en weerkaatst het evenredig o
over dat opp
pervlak.
Figuur 7 – Een bol
erlicht door rood
ve r
diffuse li
ight
Diffuse light met een rod
de
kleur sc
chijnt op een zwaarte
bol, waa
ardoor zi 3D vo
ijn orm
zichtbaa wordt.
ar .
De intensiteit van het wee erkaatste liccht wordt bepaald door de cosinus van de
r
hoek tussen de normaal N van het o
k e oppervlak w
waar het lic
cht op schijnt en de
vecto D van de richting va het licht. Wanneer de hoek tussen N en D kleiner of
or e an e k
ende formule3:
gelijk is aan π / 2. Dit leidt tot de volge
k
Voor directional lights is de D al beken Voor poi lights en spotlights kan de D
r e nd. int
berekend worde door (V – P) / | V – P |, waar P de locatie van de lich
en e htbron en
P he te verlicht
et ten punt is.
3
D.H Eberly, 3D Game Eng
H. D gine Design Amsterdam Morgan Kaufmann
n, m:
publishers, 2007 p. 95,96.
7,
Saxion Hogeschool Ennschede | D oorsprong van licht
De
11. 10 namic Lighting
Dyn
afbeeldingen hieronder demonstr
De a reren hoe ambient ligght en diffu
fuse light
enwerken om zo een re
same ealistischere weergave van object t creëren.
e te
Figuur 8 – Een bol
n Figuur 9 – Dezelfde
verlicht d
door bol nu b
bovendien
donkerr rood verlicht do
oor diffuse
ambient l light light
Door combin
r natie van ambient
n
en d
diffuse lig lijkt d bol ec
ght de cht
3D te zijn.
Het eerste figuur geeft on nze 3D bol weer waar donkerroo ambient light op
r od
schijnt. Het tweeede figuur is een weer
rgave die ontstaan is u het eerst figuur,
uit te
door lichtbron met diffuse light aan d linkerkan van de b te plaatsen. Ons
r m de nt bol
object lijkt nu ec 3D te zij
cht jn.
Saxion Hogeschool En
nschede | D oorsprong van licht
De
12. 11 namic Lighting
Dyn
1.3. Specula light
.3 ar
Net als diffuse light is spec
l cular light e
een vorm va directiona light. Het verschil
an al t
tusse twee typ
en pen is dat sspecular ligh op een sc
ht cherpe en u
uniforme ma anier van
een oppervlak w weerkaatst. Specular lig vertegen
ght nwoordigd m andere woorden
met
de wweerkaatsing van licht o glimmend oppervlakken, terwij diffuse lig die op
g op de jl ght
matt oppervlak
te kken verteggenwoordigd De verto
d. olking van s
specular ligh berust
ht
op d hoek tussen de kijker en de lic
de chtbron. Vanuit het ooogpunt van de kijker
creëe specular light een sterk opge
ert elicht gebie
ed, de speccular highlig
ght of de
speccular reflecti
ion, op het oppervlak v van het bek
keken objec De intens
ct. siteit van
dit g
gebied is afhhankelijk va het materiaal waarvan het obje gemaakt is en de
an ect t
sterk
kte van de lichtbron. Met de volg
M gende formule4 kan sp pecular light worden
t
berekend:
De U kan berek kend worden door (V – E) / | V – E |, waar E het oogp
n punt en P
het t verlichten punt is. R is de reflectie vector.
te n
In de onderstaa ande afbeel
lding vinden we onze bol waar nu naast am
n mbient en
diffuse light ook specular light op sc
chijnt. Het is duidelijk te zien da de 3D
k at
weer rgave van h object st
het terk verbete is door de eigensch
erd happen van specular
light
t.
Het is evid
dent dat de 3D
weergave van het object
w t
st beterd is.
terk verb
4
D.H Eberly, 3D Game Eng
H. D gine Design Amsterdam Morgan Kaufmann
n, m:
publishers, 2007 p. 96.
7,
Saxion Hogeschool En
nschede | D oorsprong van licht
De
13. 12 namic Lighting
Dyn
1.3. Emissiv light
.4 ve
Emis
ssive light verschilt va de hier
an rboven bespproken lichttypen. Dit type is
t
verantwoordelijk voor de e
k eigenschap van het ma ateriaal van de objecte om te
n en
reflecteren of te abso
n orberen. Waanneer emisssive light
Figuur 10 – Dezelfde bol wordt toe egepast op het materi iaal van ee object
en
met toeevoeging van
sppecular light simuleert het licht dat van het ob
bject weerkaaatst.
Zond der extra licchtbronnen heeft de k kleur van eeen object mmet alleen emissive
light dezelfde v
t visuele kwa aliteit als m
met alleen ambient ligght. De rea actie van
diffuse light of specular ligh op het op
s ht ppervlak van het object met alleen emissive
n
light is echter anders. In de onderstaa
t e ande afbeeld
ding zien we een objec die een
e ct
normmale groene kleur uitstr raalt.
Het resultaa is gelijk aan dat w
H at wanneer er ambient
light in plaa
l ats van em missive light zou zijn gebruikt,
t
totdat er ad
t dditionele ty
ypen licht wworden toegevoegd.
De
D ondersta aande afbee elding laat d verschil duidelijk
dit
zien.
z
Figuur 11 – Een bol die
F E
groen emisssive light
uitstraalt
Zondder toevoeg ging van het groene emissive
light zou de bol rood hebbe geleken. Wanneer
t en
de lichtstralen van de bron het opper
v n rvlak van
de bol raken mengt zij jn kleur, hhet rode
ambient en diff fuse light en het witte specular
n
light zich me de kleur van het groene
t, et t
emisssive lightt, waardoo or een g geelachtig
oppeervlak ontstaaat.
Figuur 12 - Dezelfde boll
met een lichtbron die
e
rood ambien light, rood
nt d
diffuse light and wit
t
specular li
ight uitzendt.
.
Saxion Hogeschool En
nschede | D oorsprong van licht
De
14. 13 Dynamic Lighting
1.4 Berekening van het licht op een willekeurig object
Nu we alle drie de typen licht kunnen berekenen en we het effect van emissive
light hebben gezien, kunnen we met de onderstaande formule5 de kleur van een
willekeurig belicht object berekenen:
°
°
°
waarbij de afstandsvermindering voor het ie licht is, berekend
met de volgende formule:
,
,
| | | |
waarbij P de positie van het licht is en V het te belichten punt. De
coëfficiënten zijn I voor de intensiteit (meestal 1), voor de
constante term, voor de lineaire term en voor de
kwadratische term.
is de spot vermindering, die de waarde 1 heeft voor point en
directional lights, maar voor spotlights berekend moet worden met
de formule:
·
, · cos
0,
met hoek θ (0, π / 2) gemeten tussen de as A en de muur van de
kegel. D = (V – P) / | V – P |, waarbij P de locatie van de
lichtbron en P het te verlichten punt is.
5
D.H. Eberly, 3D Game Engine Design, Amsterdam: Morgan Kaufmann
publishers, 2007, p. 98.
Saxion Hogeschool Enschede | De oorsprong van licht
15. 14 Dynamic Lighting
2. LICHT IN OPENGL
In de volgende paragrafen wordt uiteengezet hoe OpenGL gebruik maakt van
polygoon shading om licht te simuleren en hoe eigenschappen van lichtbronnen
en materialen kunnen worden beïnvloed.
2.1 Lighting en shading models
2.1.1 Object shading
OpenGL baseert zijn lichtmodel op de Gourad Shading implementatie. Elke
vertex in een polygoon krijgt een specifieke kleur toegewezen. Deze kleur wordt
berekend aan de hand van de eigenschappen van het materiaal van het object
en de omringende lichtbronnen. Daarna worden de kleuren van elke vertex over
de hele polygoon geïnterpoleerd.
2.1.2 Light Models
OpenGL heeft twee belangrijke functies, “glEnable(param)” en
“glDisable(param)”, waarmee vele features van OpenGL in- en uitgeschakeld
kunnen worden. Om licht toe te voegen in een OpenGL applicatie moet men de
volgende stappen uitvoeren:
Schakel het verlichtingssysteem aan
Stel de lichtmodellen in
Stel de shading modellen in
De eerste stap is eenvoudig en wordt uitgevoerd met de volgende regel:
glEnable(GL_LIGHTING);
De tweede stap, het instellen van het lichtmodel, wordt later behandeld. De
derde stap, het instellen van het shading model, wordt uitgevoerd met een
aanroep van de functie glShadeModel en kan twee instellingen hebben:
SMOOTH, waarbij gebruik wordt gemaakt van Gourad shading.
FLAT, waarbij de polygonen slechts een kleur hebben en er dus minder
realistisch uitzien.
OpenGL heeft een aantal functies voor het initialisatie gedeelte van een
applicatie om specifieke globale eigenschappen in te stellen voor het gedrag van
de applicatie. Het visuele gedrag van het lichtmodel wordt gespecificeerd door
een aanroep van de functie “glLightModel”. Er zijn twee typen van deze functies:
glLightModelf(GLenum pname, GLfloat param)
glLightModelfv(GLenum pname, const GLfloat *params)
Deze gebruiken respectievelijk scalaire en vector waarden als parameters.
Saxion Hogeschool Enschede | Licht in OpenGL
16. 15 Dynamic Lighting
2.1.3 Global ambient light model
Naast het instellen van de hoeveelheid ambient light van een lichtbron of
materiaal is het mogelijk om deze hoeveelheid globaal in te stellen door het
toevoegen van een Global Ambient Light, zodat het op alle objecten in het
systeem wordt toegepast. Dit lichtmodel kan worden toegevoegd met een
aanroep van de functie “glLightModelfv”. Eerst specificeren we de kleur van de
Global Ambient Light in met:
Glfloat global_ambient[] = { 0.5f, 0.5f, 0.5f, 1.0f };
// R=0.5, G=0.5, B=0.5, ALFA=1.0.
// DE STANDAARD INTENSITEIT VAN GLOBAL AMBIENT LIGHT
IS R=0.2, G=0.2, B=0.2, ALFA=1.0.
vervolgens vertellen we OpenGL dat we een Global Ambient Light instellen en
geven we de hierboven gespecificeerde kleur mee:
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, global_ambient);
Normaalgesproken gebeurt dit in het initialisatie gedeelte van een applicatie. De
alfa parameter wordt gebruikt om de doorzichtigheids factor van een object te
definiëren en kan worden gebruikt om doorzichtig materiaal, zoals glas, te
simuleren.
2.1.4 Smooth shading
De volgende stap is het opzetten van het shading model wat gebeurt door het
aanroepen van de functie glShadeModel. Aangezien we gebruik willen maken van
het smooth shading model doen we de volgende aanroep:
glShadeModel(GL_SMOOTH);
Na deze aanroep wordt voor alle polygonen gebruik gemaakt van Gourad-
shading, waarbij de “vermindering” exact berekend wordt voor de vertices en
deze waarden over de hele polygoon geïnterpoleerd worden.
Naast Gourad-shading is er nog een andere shading techniek, Phong-shading,
waar ik niet verder op in zal gaan. Phong-shading geeft realistischere beelden,
maar door zijn tijdrovende berekeningen wordt vaak de voorkeur gegeven aan
Gourad-shading.
Saxion Hogeschool Enschede | Licht in OpenGL
17. 16 Dynamic Lighting
2.1.5 Lichttypen
Lichtbron en oppervlakmateriaal
Theoretisch gezien zijn er twee typen lichteigenschappen te beschouwen
wanneer men het lichtmodel gaat implementeren in OpenGL. Het eerste type
beschrijft de eigenschappen van de lichtbron en de tweede de eigenschappen
van het licht dat door het materiaal van het oppervlak van een object wordt
gereflecteerd. Voor beiden moet de kleur van het licht worden ingesteld.
De kleur van elke lichtbron wordt gekarakteriseerd door de kleur, in RGBA
formaat, die het uitzendt en kan worden ingesteld door een aanroep van de
functie “glLight”. De eigenschappen van het materiaal worden ingesteld door een
aanroep van de functie “glMaterial” en worden gekarakteriseerd door de
hoeveelheid licht dat het materiaal weerkaatst, eveneens in RGBA kleur formaat.
2.1.5.1 Definiëring van een lichtbron
OpenGL staat het gebruik van maximaal acht lichtbronnen tegelijkertijd in een
scene toe. Elk van deze lichtbronnen kan in- of uitgeschakeld zijn; ze zijn initieel
uitgeschakeld en worden ingeschakeld door een aanroep van de functie
“glEnable”, waarbij als parameter “GL_LIGHTn” meegegeven wordt, waar n het
nummer van het licht identificeert (de waarde van n kan variëren van 0 t/m 7).
OpenGL heeft een aantal basis functies om een lichtbron te definiëren. Voor elk
abstracte type licht dat OpenGL kent, heeft het een model gedefinieerd:
GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR en GL_EMISSIVE.
Voor elke lichtbron moet de “glLightfv” functie worden aangeroepen. Zo kan
bijvoorbeeld een specular light component aan een lichtbron toe worden
gevoegd:
GLfloat specular[] = {1.0f, 1.0f, 1.0f , 1.0f};
glLightfv(GL_LIGHT0, GL_SPECULAR, specular);
Op eenzelfde wijze kunnen andere componenten van abstracte typen licht
worden toegevoegd aan een lichtbron.
Daarnaast moet de positie van de lichtbron worden gespecificeerd. Dit gebeurt
eveneens met de glLight functie en wel op de volgende manier:
Glfloat position[] = { -1.5f, 1.0f, -4.0f, 1.0f };
GlLightfv(GL_LIGHT0, GL_POSITION, position);
Saxion Hogeschool Enschede | Licht in OpenGL
18. 17 Dynamic Lighting
2.1.5.2 In- en uitschakeling van een lichtbron
Tenslotte moet het gecreëerde licht worden ingeschakeld:
glEnable(GL_LIGHT0);
Zoals gezegd zijn alle acht ter beschikking staande lichtbronnen standaard
uitgeschakeld. Wanneer men een lichtbron manueel wil uitschakelen, maakt men
gebruik van de “glDisable” functie:
glDisable(GL_LIGHT0);
Saxion Hogeschool Enschede | Licht in OpenGL
19. 18 Dynamic Lighting
2.1.5.3 Het definiëren van oppervlakmateriaal
In werkelijkheid worden objecten opgelicht door de zon, waardoor ze licht met
een witte intensiteit uitstralen. Zoals we weten, is de kleur wit een combinatie
van alle kleuren. Wanneer het witte licht het oppervlak van een object raakt,
worden sommige golflengtes van licht weerkaatst en anderen geabsorbeerd. Het
licht dat wordt weerkaatst bepaald de kleur van het object waar men naar kijkt.
Verschillende objecten zijn gemaakt van verschillend materiaal, wat de manier
van reflectie beïnvloedt. Een rood voorwerp weerkaatst bijvoorbeeld alleen de
rode deeltjes van licht en absorbeert alle andere kleuren. Wanneer er wit licht op
objecten schijnt, ziet men hun “natuurlijke” kleur. Het witte licht bevat immers
alle kleuren, zodat het object altijd een kleur heeft om te reflecteren. Wanneer
het rode voorwerp echter alleen door een blauwe lamp wordt verlicht, lijkt hij
zwart te zijn, omdat er geen rode kleur is om te weerkaatsen.
Wanneer men in OpenGL een eigenschap van een materiaal toewijst aan een
object wijst men theoretisch gezien de kleur toe die het object reflecteert. Als
men een kleur aan een object toewijst door middel van de “glColor” functie, wijst
men eigenlijk de eigenschap toe die de kleur van het object beschrijft; deze
kleur zal dus niet reageren op licht. Dit is het verschil tussen het toewijzen van
een kleur aan een object en het toewijzen van een materiaaleigenschap aan een
object.
Het is belangrijk te beseffen dat bij het inschakelen van de verlichten
(“glEnable(GL_LIGHTING)”) eigenlijk van men verwacht wordt om
materiaaleigenschappen toe te wijzen door een aanroep van de “glMaterialfv”
functie:
float mcolor[] = { 1.0f, 0.0f, 0.0f, 1.0f };
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mcolor);
// WANNEER MEN NU EEN POLYGOON TEKENT WORDEN ZIJN
MATERIAALEIGENSCHAPPEN BEÏNVLOED.
Saxion Hogeschool Enschede | Licht in OpenGL
20. 19 Dyn
namic Lighting
2.1.5.4 Polygo winding
on
De e
eerste param meter (GL__FRONT) van de functie glMateria alfv, zoals h
hierboven
besc
chreven, bepaald welk vlak van de polygoo het licht wat door “mcolor”
on
gesp
pecificeerd is zou moe
i eten weerka aatsen. Klaa arblijkelijk zijn er echhter twee
kanten van een polygoon, namelijk de voor- en de achterka
n e ant. Welke kant van
onze polygoon i nu de voor- (GL_FRONT) en we
e is elke de achterkant (GL L_BACK)?
Dat is eenvoudig. Er zijn tw
wee manieren om een polygoon te specificere in een
e en
3D r
ruimte. Het met-de-klo ok-mee en t tegen-de-klok-in specif ficeren van vertices.
De richting waa
r arin je de vertices spec epaalde welk kant de voor- en
cificeert, be ke
welk kant de achterkant is
ke s.
Met de functie “
“glFrontFace is het mogelijk om de regels v
e” voor dit zogenaamde
gon winding mechanism te specif
polyg g me ficeren:
glF
FrontFace( GL_CCW);
// D
DIT IS DE STANDAARD INSTELLING TEGEN D KLOK IN
S G: DE
De o
onderstaande afbeelding verduidelij het princ
g jkt cipe van pol
lygon windin
ng.
Figuu 13 – Polygon winding
ur
Om een polygoo tegen-de
on e-klok-in te definiëren, zoals in voorbeeld A te zien is,
speccificeert men eerst vert
n tex v0, waaarna men v vervolgt met het definiëren van
t
zijn basis door v1 te specif ficeren en e
eindigt met de specificaatie van de top: v2.
Met deze config guratie kijkt men tegen de voorka
t n ant van de polygoon a aan, mits
GL_CCCW is ingeesteld met d “glFrontFace” functie Als men d polygoon met-de-
de e. de n
klok--mee probe eert te speecificeren, zzoals in vooorbeeld B t zien is, wijst de
te
voorrkant van d polygoon weg van de kijker en zal men de polyg
de n goon niet
kunnnen zien.
Sax
xion Hogeschool Ensche
ede | Licht in OpenGL
21. 20 Dynamic Lighting
2.1.5.5 Materiaal eigenschappen
Om reflecterende materiaaleigenschappen in te stellen voor een oppervlak van
een bepaald polygoon, moet de “glMaterial” functie vóór het definiëren van de
vertices van de betreffende polygoon worden aangeroepen:
// STEL DE REFLECTERENDE EIGENSCHAPPEN VAN HET MATERIAAL
IN
float colorGreen[] = { 0.0f, 1.0f, 0.0f, 1.0f };
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE,
colorGreen);
// TEKEN EEN POLYGOON WAAR OP DE INGESTELDE
EIGENSCHAPPEN WORDEN TOEGEPAST
glBegin(GL_TRIANGLES);
glVertex3f(-1.0f, 0.0f, 0.0f);
glVertex3f(0.0f, -1.0f, 0.0f);
glVertex3f(1.0f, 0.0f, 0.0f);
glEnd();
Deze versie van de “glMaterial” functie, met het achtervoegsel “fv”, accepteert
op vectoren gebaseerde kleur coördinaten. De parameter
“GL_AMBIENT_AND_DIFFUSE” zorgt ervoor dat “colorGreen” op zowel ambient
als diffuse light componenten van het materiaal wordt toegepast. Deze declaratie
is handig, omdat aan de ambient en diffuse eigenschappen van materiaal in de
meeste gevallen dezelfde kleur moet worden toegewezen.
Deze procedure, wordt vervelend en onhandig wanneer men te maken heeft met
een groot aantal polygonen. Een meer toegankelijke manier van definiëren is het
zogenaamde color tracking. Hiermee is het mogelijk om materiaaleigenschappen
te specificeren door enkel de “glColor” functie aan te roepen voor elk object
waarvan men de materiaaleigenschappen wil specificeren. Om color tracking te
gebruiken moet het eerst ingeschakeld worden, op de gebruikelijke wijze
waarmee dat in OpenGL gebeurd: een aanroep van de “glEnable” functie:
glEnable(GL_COLOR_MATERIAL);
Vervolgens moet men de materiaaleigenschappen voordefiniëren, zodat ze aan
objecten worden toegewezen wanneer de “glColor” functie wordt aangeroepen:
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
Saxion Hogeschool Enschede | Licht in OpenGL
22. 21 Dynamic Lighting
Nu weet OpenGL dat elke keer wanneer de “glColor” functie wordt aangeroepen,
voorafgaand aan het definiëren van (de vertices van) een polygoon, de ambient
en diffuse eigenschappen worden toegewezen aan die polygoon.
Resumerend moet men het volgende goed beseffen. De materiaaleigenschappen
van het object specificeren het soort en de hoeveelheid licht dat door een object
wordt gereflecteerd. De drie componenten van lichteigenschappen die zijn
toegepast op het object om zijn uiterlijk te bepalen zijn:
AMBIENT component
DIFFUSE component
SPECULAR component
De componenten van de kleur van een materiaal worden ingesteld door een
aanroep van de functie “glMaterial” op eenzelfde manier als het instellen van de
kleur, door middel van het aanroepen van de “glColor” functie, van een
polygoon. De “glMaterial” functie dient te worden aangeroepen voordat een
vertex van een polygoon wordt gespecificeerd, zodat de
weerkaatsingeigenschappen van die vertex en alle hierop volgende vertices
worden toegepast. Bovendien kan gebruik worden gemaakt van de functie
“glColor” om materiaaleigenschappen te specificeren, mits color tracking is
ingeschakeld.
Saxion Hogeschool Enschede | Licht in OpenGL
23. 22 Dynamic Lighting
2.1.5.6 Overige eigenschappen
Het ambient component bepaalt de algehele kleur van het object en heeft het
meeste effect wanneer een object niet wordt belicht. Het diffuse component is
het meest belangrijk voor het bepalen van de kleur van een object wanneer er
licht schijnt op zijn oppervlak. Voor “normale” verlichting is het verstandig om de
ambient en diffuse componenten van het materiaal dezelfde waarden te geven,
zoals hierboven in het voorbeeld is laten zien.
Dan nu het specular component. Voor realistische verlichting door een
theoretische lichtbron volstaat het in veel gevallen om alleen ambient en diffuse
componenten te definiëren. Echter, wanneer men bijvoorbeeld een metalen
object wil definiëren is het wenselijk om de reflectie van licht meer te
benadrukken, zodat het object ook echt van metaal gemaakt lijkt te zijn.
Hiervoor stelt OpenGL eigenschappen beschikbaar die onder te verdelen vallen in
twee categorieën:
SPECULAR component of SPECULAR REFLECTION component
SHININESS component of SPECULAR EXPONENT component
Het eerstgenoemde component bepaald het effect van het materiaal op het
weerkaatste licht. Deze eigenschap maakt het oppervlak van het object glanzend
en kan worden ingesteld via het “GL_SPECULAR” component het materiaal van
een object.
Het laatstgenoemde component voorziet in een uitbreiding van het
eerstgenoemde, namelijk de mate van glans. Via het “GL_SHININESS”
component van het materiaal van het object kan de grootte en helderheid van
de specular reflection worden ingesteld. Dit is de zeer heldere witte plek die te
zien is op objecten die gemaakt zijn van materiaal met een hoge glans. Om het
specular component van een materiaal in te stellen, moet men dus beide
subcomponenten definiëren. Een aandachtspunt hierbij is dat zowel het specular
component van de lichtbron als dat van het materiaal van het object moet zijn
ingesteld. Hieronder staat een voorbeeld van het instellen van het specular
component van het materiaal:
// STEL DE REFLECTERENDE EIGENSCHAPPEN VAN HET MATERIAAL
IN
float specReflection[] = { 0.8f, 0.8f, 0.8f, 1.0f };
glMaterialfv(GL_FRONT, GL_SPECULAR, specReflection);
// STEL DE “SHININESS” IN
glMateriali(GL_FRONT, GL_SHININESS, 96);
Bij de tweede aanroep wordt gebruik gemaakt van de versie van “glMaterial”
met het achtervoegsel “i”, wat betekend dat we de factor instellen met een int
waarde tussen de 1 en de 128 voor dof respectievelijk helder.
Saxion Hogeschool Enschede | Licht in OpenGL
24. 23 Dyn
namic Lighting
2.2 Normaa bereke
al ening
Er is nog een ander zeer belangrijk c
s a concept om te begrijpe en, wannee we het
er
hebbben over he programm
et meren van licht in OpenGL. Zelfs als alle lichtbronnen
op hhun plaats zijn gezet en alle ob bjecten preccies zo zijn gedefiniee
n erd zoals
geweenst, is er nog een an nder aspect nodig om de bereken
t ningen van het licht
goed uitgevoerd te laten w
d d worden. Het is hiervoo namelijk noodzakelij om de
t or jk
richting waarin de zijden va de objec
an cten “wijzen” te weten. Deze richting wordt
de normaal genoemd.
Elk v
vlak of 3D oppervlak h
heeft een nnormaal. De eze normaal bepaald de reactie
l
van het vlak o verlichtin in een 3 scene. De normaa is een ve
op ng 3D al ector die
loo
odrecht op het vlak sta en daar
aat rvan weg
wijjst. Als een lichtbron p
parallel loop met de
pt
normaal van een vlak is het opper
s rvlak het
meeest helder en vice verssa.
Om de normalen te berek
m kenen hebben we de
x e y coördi
en inaten van drie vertice nodig.
es
Vo
oor vlakken bestaande uit meer dan drie
vertices kieze we willekeurig drie vertices
en
uit Zo zoude we bij berekening van de
t. en
normaal van h onderste figuur A,B,C
het e
Figuur 14 – Normaa (a)
r al
kunnen gebruik ken, maar oook A,B,D o B,C,D.
of
De berekening van de no ormaal van een vlak
taat uit drie stappen:
best e
Eerst moeten we de vectoren
bereekenen, die in de afbeeeldingen in het rood
zijn aangegeve en
Vervolge ens berekenen we hie eruit het
uitw
wendig product (kruisprroduct).
Ten slo otte moeten we deze vector
e
normmaliseren.
Figuur 1 – Normaal (b)
15
Sax
xion Hogeschool Ensche
ede | Licht in OpenGL
25. 24 Dynamic Lighting
2.2.1 Berekening van de vectoren
Een vector is de beweging van een punt naar een ander punt. Om de vector te
krijgen van vertex A en B trekken we de x, y en z coördinaten van deze vertices
van elkaar af. Het is hierbij van groot belang dat de punten tegen-de-klok-in zijn
gedefinieerd. De eerste vector is van vertex A tot het eerste punt dat we tegen
komen, punt B. De tweede vector is van punt A tot het tweede punt dat we
tegen komen, punt C. Hieruit volgt:
Vector 1 = Vertex B – Vertex A
Vector 2 = Vertex C – Vertex A
Saxion Hogeschool Enschede | Licht in OpenGL
26. 25 Dyn
namic Lighting
2.2. Bereke
.2 ening van het uitwe
endig prod
duct
Verv
volgens moe
eten we he uitwendig product b
et g berekenen van deze vectoren,
v
zod
dat we een punt krij jgen dat
loo
odrecht op het vlak in kwestie
n
sta
aat.
Vo
oor onze normaal heb bben we
een x,y,z vec ctor nodig. Voor al
deze drie de coördinaten moeten
n
we een berek
e kening uitvo
oeren om
de waarde van x, y en z voor de
potentiële nor
rmaal te ver
rkrijgen.
Figu
uur 16 – Uitw
wendig produc
ct
Dit b
bereiken we door de onderstaande berekening uit te voeren.
g
Normaal.x = (Vector1 × Vector2.z) – (V
N 1.y Vector1.z × Vector2.y
y)
Normaal.y = (Vector1 × Vecto
N 1.z or2.x) – (V
Vector1.x × Vector2.z
z)
Normaal.z = (Vector1 × Vecto
N 1.x or2.y) – (V
Vector1.y × Vector2.x
x)
Let o Dit is no niet per definitie de normaal wa naar we op zoek zijn.
op! og aar
Sax
xion Hogeschool Ensche
ede | Licht in OpenGL
27. 26 Dynamic Lighting
2.2.3 Normaliseren van de normaal
OpenGL gebruikt de lengte van de normaal om de helderheid van het object te
bepalen. Dit levert problemen op, aangezien niet alle vlakken even groot zijn en
kleinere objecten dus donkerder worden weergegeven dan grotere objecten.
Omwille hiervan moet men de normaal normaliseren. Men moet met andere
woorden de eenheidsvector berekenen van de normaal.
. . .
. . ⁄
. . ⁄
. . ⁄
Eerst berekenen we de normalisatie factor door gebruik te maken van de stelling
van Pythagoras. We tellen de kwadraten van onze normaal coördinaten op en
berekenen hieruit de vierkantswortel, de normalisatie factor. Wanneer we nu de
gevonden coördinaten delen door de normalisatie factor, de lengte van de
normaal, hebben we de coördinaten van de eenheidsvector berekend, die tussen
-1 en 1 liggen.
Saxion Hogeschool Enschede | Licht in OpenGL