[ALG] Normaal vectoren

Pagina: 1
Acties:
  • 111 views sinds 30-01-2008
  • Reageer

  • AuC
  • Registratie: Januari 2003
  • Laatst online: 10-07 15:00
Hey iedereen,

Ik ben momenteel druk bezig met het boek "OpenGL Gamesprogramming". De meeste dingen snap ik wel, maar ik vraag me nogsteeds af wat normaal vectoren (normalized vector) precies inhouden?

Ik weet dat het een vector is met een lengte van precies 1.0. Ik weet ook dat dit erg belangrijk is bij lighting, maar waarom? wat is hier nou precies het nut van?

Als iemand deze vraag voor me kan beantwoorden bedankt! :)

[ Voor 6% gewijzigd door AuC op 09-10-2003 00:39 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

De normaal-vector is degene die loodrecht op een vlak staat. Bij lichtberekening wordt de normaal gebruikt om de hoek van lichtinval te berekenen (evenwijdig aan de normaal levert meeste licht op).

Bij moderne grafische kaarten kun je ook dmv zogenaamde bumpmaps voor iedere pixel van de texture een aparte normaalvector definieren. Dit staat je toe om aparte lichtafwijkingen te genereren op de plek waar een eigenlijk platte texture een kuil of zo heeft, wat het geheel een erg slick 3d-effect geeft.

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-08 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

mja, ik kan het wel uitleggen, maar ik denk dat je beter eerst de lightingmethodes door kunt nemen en daarna zelf tot die conclusie kan komen :)

Het is iig nodig voor het inwendig product (dotproduct). Daarmee kun je de lengte van een vector v1 geprojecteerd op een andere vector v2 uitrekenen. Als v1 en v2 beide lengte 1 zijn krijg je dus ook waardes tussen -1 en 1 terug. En dat is precies wat je wilt, want 0 is geen belichting en 1 is volledige belichting

immers, v1 * v2 = cos (alpha (v1, v2)) * |v1| * |v2|
waarbij alpha (a, b) de hoek tussen a en b voorstelt

Als v1 en v2 beide lengte 1 hebben, dan |v1| = |v2| = 1, dus v1 * v2 = cos (alpha (v1, v2))

Staat een licht recht op de normaal, dan is de hoek 180 graden, en is het resultaat dus -1 (dus volledige belichting). Als een licht loodrecht op de normaal staat dan komt het licht van opzij en valt er dus ook geen licht op het object. De hoek is dan 90 graden, en het resultaat is 0 :)

[ Voor 38% gewijzigd door .oisyn op 09-10-2003 20:11 . Reden: acos ipv cos |:( ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • AuC
  • Registratie: Januari 2003
  • Laatst online: 10-07 15:00
Ik heb het hoofdstuk lighting al doorgenomen, en had al zo een vermoeden van wat het zou kunnen zijn, maar wist het absoluut niet zeker dus besloot ik het toch maar eens te vragen. :) Je kan het beter zeker weten, dan twijfelen. ^_^

Het is een erg goed boek, maar soms staan dingen vrij onduidelijk uitgelegd. Best jammer.

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 21-02 23:50
Misschien gaat het uit van meer wiskundige voorkennis dan jij dacht? Ik ken het boek verder niet, maar 95% van de onduidelijkheden in boeken komen van die richting.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-08 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

Logisch ook, vector en matrix algebra is gewoon een vereiste als je met 3d computer graphics aan de slag wilt... daar kom je gewoon niet omheen
En het boek beschrijft hoe je een 3d spel kunt maken met opengl, niet hoe de achterliggende wiskunde in elkaar zit :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • AuC
  • Registratie: Januari 2003
  • Laatst online: 10-07 15:00
Het is niet alleen bij wiskunde. Dat snap ik grotendeels wel (ook al heb ik enkel basis gehad). Het probleem van het boek is dat hij bij veel hoofdstukken schrijft dat hij het later wel in een voorbeeld laat zien, en niet alles voldoende uitlegt.

Het enige wat ik nog niet snap is sin en cos 8)7 Okay, wel zo ongeveer. Tenminste, ik denk dit te weten:

Als ik een kubus heb. Dan kan ik met cos eromheen draaien, en met sin ernaartoe?

Voor een hoop dingen is er gelukkig een bron aan informatie genaamd internet :)

@.oisyn: Daar gaat hij erg goed op in. :)

[ Voor 5% gewijzigd door AuC op 09-10-2003 01:09 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-08 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

AuC schreef op 09 oktober 2003 @ 01:07:
Het is niet alleen bij wiskunde. Dat snap ik grotendeels wel (ook al heb ik enkel basis gehad).

... knip ...

Het enige wat ik nog niet snap is sin en cos 8)7 Okay, wel zo ongeveer.
daar spreek je jezelf een beetje tegen :X
je weet toch wel dat cos (a) de horizontale afstand van de oorsprong tot het punt op de eenheidscirkel met hoek a is, en sin (a) de bijbehorende verticale afstand?

Mag ik vragen hoe oud je bent / welke opleiding je nu doet?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

AuC schreef op 09 October 2003 @ 01:07:
Het enige wat ik nog niet snap is sin en cos 8)7 Okay, wel zo ongeveer.
Uhm dit is toch wel VWO-3 wiskunde als ik me niet vergis?

Sinus is de golfbeweging van 0 tot 360 graden (of 2pi radialen) die van 0 naar 1 naar 0 naar -1 naar 0 golft.

Cosinus is dezelfde golf maar dan 90 graden verplaatst, dus beginnend vanaf 1.

Met sinus en cosinus kun je alle rotaties e.d. perfect beschrijven. Ter voorbeeld, om een cirkel te tekenen gebruik je de volgende code (loosely Win32):
C:
1
2
3
4
5
6
7
8
void DrawCircle(HDC DC, int X, int Y, int Radius)
{
MoveTo(DC, X, Y + Radius);
for(float i = 0; i < 2*PI; i += (PI / 1000))
  {
  LineTo(DC, X + sin(i) * Radius, Y + cos(i) * Radius);
  }
}

Professionele website nodig?


  • AuC
  • Registratie: Januari 2003
  • Laatst online: 10-07 15:00
.oisyn schreef op 09 October 2003 @ 01:15:
[...]


daar spreek je jezelf een beetje tegen :X
je weet toch wel dat cos (a) de horizontale afstand van de oorsprong tot het punt op de eenheidscirkel met hoek a is, en sin (a) de bijbehorende verticale afstand?

Mag ik vragen hoe oud je bent / welke opleiding je nu doet?
Momenteel ben ik 17, en doe geen opleiding meer. Dit is wegens concentratie problemen, en nog wat persoonlijke redenen. (Zit wel te denken om snel weer een studie op te pakken).

Ik heb echter wel MAVO (tot de 3e) en ICT Lyceum (MBO niveau) gevolgd, maar beiden niet afgemaakt.

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
curry684 schreef op 09 October 2003 @ 01:16:
Met sinus en cosinus kun je alle rotaties e.d. perfect beschrijven. Ter voorbeeld, om een cirkel te tekenen gebruik je de volgende code (loosely Win32):
Misschien ook handig voor de topicstarter om een makkelijke manier te zien van het opstellen van een rotatie matrix.
We gaan nu uit van een rotatie om een vlak welke door de oorsprong gaat.
code:
1
2
3
a  d  h
b  e  i
c  f  j

Hierbij stellen de letters het volgende voor:
(a,b,c) is het geroteerde beeld van de basisvector (1,0,0)
(d,e,f) is het geroteerde beeld van de basisvector (0,1,0)
(h,i,j) is het geroteerde beeld van de basisvector (0,0,1)

Laten we eens roteren door het vlak dat loopt door de z-as (left handed, loopt naar achteren zeg maar) en door de lijn x + y = 0. Als je het tekent zie je het wel voor je ;)

(1,0,0) roteert naar (0,-1,0)
(0,1,0) roteert naar (-1,0,0)
(0,0,1) roteert naar (0,0,1) (het vlak loopt over de z-as)

Hierbij heb je simpel je rotatiematrix opgesteld:
code:
1
2
3
 0 -1  0
-1  0  0
 0  0  1


Mocht je vlak nou niet door de oorsprong lopen dan is er nog geen probleem, je zult dan alleen met homogene coördinaten moeten werken.

De homogene representatie van een vector a is bijvoorbeeld (x, y, z, 1), waarbij dus alleen die 1 toegevoegd is.

Terug naar de rotatie. Als je vlak niet door de oorsprong gaat, wat dan?
Kan op verschillende manieren:
• Transleer het vlak eerst zo, dat hij evenwijdig loopt met een as en door de oorsprong gaat
• Stel de rotatiematrix op voor een vlak dat door de oorsprong gaat
• Stel een translatie herstel matrix op
• Vermenigvuldig de 3 matrices met de vector

Andere manier
• Doe alsof het vlak door de oorsprong ligt en bereken de beelden van de basisvectoren als voorgaand
• Bereken het beeld van de oorsprong bij rotatie door het orginele vlak

De rotatiematrix wordt dan wel 4x4
code:
1
2
3
4
a  d  h  k
b  e  i  l
c  f  j  m
0  0  0  1

(k,l,m) zijn hier het beeld van (0,0,0) na rotatie door het orginele vlak.

Laten we eens roteren door het vlak dat evenwijdig loopt door de z-as (left handed, loopt naar achteren zeg maar) en door de lijn x + y = 2. Als je dit tekent zie je een lijn tussen (0,2,0) en (2,0,0)
Als wel (0,0,0) spiegelen in die lijn dan krijgen we het beeld van de oorsprong na de rotatie. Het is redelijk simpel in te zien dat dit beeld (2,2,0) is :)

Dus onze nieuwe rotatie matrix wordt dan
code:
1
2
3
4
 0 -1  0  2
-1  0  0  2
 0  0  1  0
 0  0  0  1

Hierbij zijn dus alleen de vierde kolom toegevoegd (beeld van (0,0,0)) en de vierde rij (homogene matrix)

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 18:33
Denk dat je toch eerst ff wat docs moet opzoeken over lineaire algebra, vectoren / matrices en goniometrie.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Cavorka
  • Registratie: April 2003
  • Laatst online: 27-03-2018

Cavorka

Internet Entrepreneur

Ehm, Glimi lijkt me niet dat hij weet hoe matrices werken, als je nog moeite hebt met sinus / cosinus.

Goede uitleg dat wel, maar dan moet je wel eerst de basics en de ideeen achter matrices weten, of hebben gehad en ik heb in 6 jaar VWO zelfs geen matrices gehad (nu juist alleen maar, studeer natuurkunde), misschien omdat ik geen Wis A heb gedaan, yet still...

[ Voor 30% gewijzigd door Cavorka op 09-10-2003 09:56 ]

the-blueprints.com - The largest free blueprint collection on the internet: 50000+ drawings.


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 17-08 23:56

Janoz

Moderator Devschuur®

!litemod

AuC schreef op 09 October 2003 @ 00:38:
normaal vectoren (normalized vector)
Deze twee dingen zijn in ieder geval niet hetzelfde!
je hebt een normaal vector (normal vector) wat een vector is die loodrecht op een oppervlak (of lijn) staat en je hebt een genormalizeerde vector (normalized vector) wat een vector is met lengte 1 (of eentje die zo lang is gemaakt). het normalizeren is het aanpassen van de lengte naar 1 zonder de richting te veranderen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Mavo en MBO ja dan mis je echt nog iets in je wiskunde... op internet is erg veel te vinden over 3D beeld verwerking.... misschien een goed idee om dat eens door te lezen. vooral over shadings... is goed voor de 3D begripsvorming! Open GL is uiteindelijk gebouwd op zo een 3D engine.

een normaal vector is zo een basis begrip in de 3D wereld.... het is erg belangrijk dat je goed begrijpt wat zo een normaal vector doet. Oja en een goed wiskunde boek matrix berekeningen is ook nooit een slecht idee!

  • MisterData
  • Registratie: September 2001
  • Laatst online: 20:35
Zoek anders even met Google op 3DICA, de eerste of tweede hit verwijst dan naar een tutorial waarin een hoop wordt uitgelegd :) Erg goede tutorial!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-08 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

ja, maak het nog moeilijker. En dan ook nog met homogene coordinaten erbij, wat voor rotaties helemaal niet uitmaakt... :X
Bovendien is een 2D uitleg nog altijd de beste, want dat is het makkelijkst voor te stellen ;)

[ Voor 17% gewijzigd door .oisyn op 09-10-2003 16:12 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • AuC
  • Registratie: Januari 2003
  • Laatst online: 10-07 15:00
MisterData schreef op 09 oktober 2003 @ 11:53:
Zoek anders even met Google op 3DICA, de eerste of tweede hit verwijst dan naar een tutorial waarin een hoop wordt uitgelegd :) Erg goede tutorial!
Bedankt :) Ik zal het eens even doorlezen.

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
.oisyn schreef op 09 oktober 2003 @ 16:12:
ja, maak het nog moeilijker. En dan ook nog met homogene coordinaten erbij, wat voor rotaties helemaal niet uitmaakt... :X
Moeilijk is niet altijd slecht en als iemand het niet snapt, dan kan hij dat natuurlijk altijd kenbaar maken en wil ik best nog een stuk verhaaltje typen hoor :)
De homogene coördinaten had ik trouwens even nodig voor de translatie naar de oorsprong.
Bovendien is een 2D uitleg nog altijd de beste, want dat is het makkelijkst voor te stellen ;)
Dat vind ik ook altijd zo wat. We zitten in een 3D topic, dus benader ik het altijd maar zo :)

  • Apollo_Futurae
  • Registratie: November 2000
  • Niet online
.oisyn schreef op 09 oktober 2003 @ 00:45:
immers, v1 * v2 = acos (alpha (v1, v2)) * |v1| * |v2|
waarbij alpha (a, b) de hoek tussen a en b voorstelt
Voor het archief: het inproduct van a en b (in mijn kringen (:z) overigens genoteerd met <a,b> (* doet me aan het uitproduct denken), maar ach, notatie...) is gelijk aan |a|*|b|*cos(hoek a en b), dus met cos, niet met acos :o.

Pas de replâtrage, la structure est pourrie.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-08 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

wat zijn jouw kringen? :)
overigens genoteerd met <a,b> (* doet me aan het uitproduct denken)
mwoa, ik had even geen zin om de · op te zoeken, vandaar de * ;). Maar ik gebruik doorgaans de x voor het uitwendig product
a · b        = |a|*|b|*cos (/ ab)
|a x b|     = |a|*|b|*sin (/ ab)
dus met cos, niet met acos :o.
wtf, hoe kom ik nou weer bij de inverse cos |:(
fixed :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Apollo_Futurae
  • Registratie: November 2000
  • Niet online
Wat dit betreft het college lineaire algebra van Edens aan de UvA (geweldige man 8)).
mwoa, ik had even geen zin om de · op te zoeken, vandaar de * ;). Maar ik gebruik doorgaans de x voor het uitwendig product
a · b = |a|*|b|*cos (/ ab)
|a x b| = |a|*|b|*sin (/ ab)
Creatieve manier trouwens om het teken voor 'hoek' te construeren :).

Pas de replâtrage, la structure est pourrie.


  • Cavorka
  • Registratie: April 2003
  • Laatst online: 27-03-2018

Cavorka

Internet Entrepreneur

LMAO, Esdert Edens? Die ruled. Heb ik ook gehad. Wis N2 voor fysici. Briljant gast,
leuke uitspraken:
'Het houd je mathematisch van de straat'
*laat wisser tegen zijn been vallen:
'Ho, ho, nou moet ik toch niet mezelf uitwissen'

Woont trouwens in een dorp naast me.

Om de hele zooi nog even chaotischer te maken: het uitprodukt tussen twee vectoren levert de inhoud van het parallele (*lelle?) pipidum op. Bedenk ook dat het uitprodukt alleen werkt voor 3 dimensies, voor andere dimensies is deze niet gedefinieerd.

Vond trouwens nog een leuk stuk over 3d stuff + reflectie vectoren, post zo de link.
*Edit:
http://wwwhome.cs.utwente...e/graphics/rendering2.ppt
(Zie blz 17 voor een kleine opmerking over het berekenen van de normaalvector v/e driehoek).
Ik ga even verder zoekn hierover, interessante stuff namelijk.

*Edit2: Damn, ik geloof dat ik de verkeerde studie heb gekozen, fuckinaye wat een coole bende: :p
http://www.hio.hen.nl/~zielman/vakken/c_g/la.pdf

[ Voor 65% gewijzigd door Cavorka op 10-10-2003 22:05 ]

the-blueprints.com - The largest free blueprint collection on the internet: 50000+ drawings.


  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08-2025
Cavorka schreef op 10 oktober 2003 @ 21:58:
het uitprodukt tussen twee vectoren levert de inhoud van het parallelepipidum op.
De lengte van het uitprodukt dan hè :P

| Toen / Nu


  • Cavorka
  • Registratie: April 2003
  • Laatst online: 27-03-2018

Cavorka

Internet Entrepreneur

Ja idd, de lengte van de resultaatvector.

Scherp! :D

the-blueprints.com - The largest free blueprint collection on the internet: 50000+ drawings.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-08 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

Cavorka schreef op 10 October 2003 @ 21:58:
Om de hele zooi nog even chaotischer te maken: het uitprodukt tussen twee vectoren levert de inhoud van het parallele (*lelle?) pipidum op. Bedenk ook dat het uitprodukt alleen werkt voor 3 dimensies, voor andere dimensies is deze niet gedefinieerd.
Niet waar, in andere dimensies heb je alleen niet 2 argumenten nodig (en het heet dan ook geen uitproduct, maar het idee blijft hetzelfde)
Het is trouwens de oppervlakte van een parallellogram, niet de inhoud van de parallellepipedum ;)

Je kunt het uitproduct in R3 zien als een matrixvergelijking
code:
1
2
3
x    y    z
v1.x v1.y v1.z
v2.x v2.y v2.z


Het uitproduct is dan de bovenste vector-rij, als je elk element vervangt door zijn onderdeterminant. En de lengte van deze vector is dan de oppervlakte van de paralellepipedum die van de 2 vectoren te vormen is, en de resulterende vector staat loodrecht op beide andere vectoren (dit natuurlijk wel allemaal mits de vectoren lineair onafhankelijk zijn)

In 2D geldt dit ook, en nu heb je slechts 1 argument nodig voor een "2d uitwending product"
code:
1
2
x   y
v.x v.y


vervang elk element op de bovenste rij met z'n onderdeterminant, en je krijgt de vector [v.y, -v.x]. De lengte hiervan is natuurlijk gelijk aan de lengte van v, en hij staat loodrecht op v.

Hetzelfde is toe te passen in 4D:
code:
1
2
3
4
x   y   z   w
v1.x v1.y v1.z v1.w
v2.x v2.y v2.z v2.w
v3.x v3.y v3.z v3.w


Hier zijn 3 argumenten nodig. De resulterende vector staat loodrecht op v1, v2 en v3, mits deze allemaal lineair onafhankelijk zijn. De lengte van deze vector geeft de inhoud van de parallellepipedum die gevormd kan worden door de drie vectoren.


En zo is het "uitwending product" in elke dimensie groter dan 1 toe te passen, en

voor een n-D uitwendig product heb je n - 1 argumenten nodig
Apollo_Futurae schreef op 10 October 2003 @ 16:40:
.oisyn: en wat zijn jouw kringen? :)
Wat dit betreft het college lineaire algebra van Edens aan de UvA (geweldige man 8)).
ah :)
Ik lees vooral internationale artikelen, meestal in het engels, maar van overal ter wereld, en de · wordt altijd gebruikt voor het inwendig product. Vandaar ook de naam dotproduct, en de x voor het uitwendig product, en ook daar de naam crossproduct :)
Creatieve manier trouwens om het teken voor 'hoek' te construeren :).
ja ik vond 'm niet in de character map dus ik moest creatief zijn ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1