Toon posts:

3D wiskunde:De normaal van en afstand tot een vlak

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

Verwijderd

Topicstarter
Niet helemaal zeker of dit het juiste forum is, maar er zit vast wel iemand bij die er verstand van heeft: Ik heb een vraag over wiskunde met betrekking tot 3D applicaties.

Mijn probleem is dit: Als je de normaal van een vlak wilt berekenen neem je drie punten die in dat vlak liggen, maakt er twee vectoren van (punt 0 -> punt 1 en punt 0 -> punt 2), en voert het cross-product uit op die twee vectoren. Voila, je hebt de normaal, een vector die loodrecht op dat vlak staat.

Echter, nu wil ik de afstand het vlak tot de origin (<0,0,0>) berekenen. De afstand is het negatieve dot product van een willekeurig punt in het vlak en de normaal.

De afstand is negatief als de normaal van de origin af wijst, en positief als het naar de origin toe wijst. Aangezien afstand = -DP moet het dot product dus negatief zijn als de normaal vector naar de origin wijst.

Mijn vraag: Waarom is het dot product negatief als de normaal naar de origin wijst, en waarom wijst de normaal zowieso soms naar de bron toe en soms van de bron af?

Alvast vriendelijk dank.

Verwijderd

't kan aan mij liggen, maar als je afstand definieerd als de lengte van het korste pad tussen twee punten, dan dient dit altijd positief te zijn.

Ik kan me helaas de berekening van een punt tot een vlak niet goed meer herinneren... was dat niet zo dat je door het punt (in dit geval (0,0,0)) een vlak (noem deze W) evenwijdig aan jouw vlak (noem die V) kan maken (W heeft dus de richtingsvectors van V). En verder de afstand tussen V en W berekenen?

En kan je de afstand tussen twee vlakken niet bepalen door de absoluutwaarde van het inproduct van de normaalvectoren van V en W, gedeeld door de lengte van deze normaalvectoren met elkaar vermenigdvuldigd? [mmm. dit laatste zal wel fout zijn]

De definitie van een normaalvector is toch de richtingsvector van de lijn die loodrecht op een vlak staat? Maakt het uit dat deze lijn "op de bovenkant staat" of op de "onderkant"?
Nee, want beide maken een rechte hoek met het vlak. Dus maakt het ook niet uit of je normaalvector precies de negatieve richting heeft dan een andere normaal vector.
Bovendien, maakt het van een lijn uit of zijn richtingsvector de ene of de andere kant op is (uitgaande dat een lijn een oneindig lange lengte heeft)?
Lijkt me van niet.

  • Juup
  • Registratie: Februari 2000
  • Niet online
Op vrijdag 12 juli 2002 13:45 schreef Maria_von_Trapp het volgende:
De afstand is negatief als de normaal van de origin af wijst, en positief als het naar de origin toe wijst.
Daar zit je denkfout. Afhenkelijk van de KEUZE van je twee vectoren in het vlak, of de volgorde van het uitprodukt is dit pos of neg.

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 08-07 21:15

Tomatoman

Fulltime prutser

Volgens mij haal je een paar dingen door elkaar. Het uitwendig product (Engels: cross product) van twee vectoren resulteert in een derde vector:

A x B = C

Het resultaat van een inwendig product (Engels: dot product) resulteert in een scalair getal (geen vector dus maar een eendimensionaal getal). Daarom wordt het ook wel het scalaire product genoemd:

A · B = c

Een inwendig product is geen vector en kan daarom ook geen richting hebben, maar kan wel negatief zijn. Je berekent het als volgt, ervanuit gaande dat A en B driedimensionaal zijn.

A · B = |A| |B| cos phi = AxBx + AyBy + AzBz

waarbij phi de hoek tussen A en B voorstelt en |A| de lengte van A is.

Een goede grap mag vrienden kosten.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 08-07 22:45

.oisyn

Moderator Devschuur®

Demotivational Speaker

tomatoman: hij doet het wel degelijk goed. Om de normaal n van een vlak uit te rekenen dat door de punten P0, P1 en P2 gaat uit te rekenen, doe je

A = P1 - P0
B = P2 - P0
n = (A x B) / |A x B|


om de afstand te berekenen van een punt V tot het vlak met normaal n (even ervan uitgaande dat het vlak door de oorsprong gaat), doe je

|n · V|

Echter wil je bij wiskundige berekeningen meestal niet puur de afstand hebben, maar ook de richting, vandaar dat het berekenen van de absolute waarde vaak wordt weggelaten.

Dus dan komen we op het volgende punt: de afstand is positief als het punt voor het vlak ligt, en negatief als het punt achter het vlak ligt.
Maar aangezien we tot nu toe ervan uitgingen dat het vlak door de oorsprong ging, moeten we eerst berekenen wat de afstand is tussen de oorsprong en het vlak. Als je weet dat de afstand punt - vlak, waarbij het vlak door de oorsprong gaat, wordt berekend door n · V, kun je de afstand berekenen tot een van de punten op dat vlak (P0 .. P2), dus dat wordt simpelweg:

a = n · P0

Nou loopt het vlak echter niet door de oorsprong, maar door P0. Je moet je voorstellen dat je het vlak dan verschuift vanaf de oorsprong net zo lang tot het door P0 valt, en die afstand is a (je verschuift in de richting van de normaal). Na de verschuiving ligt de oorsprong ligt nu natuurlijk -a van je af. Dus wat is de afstand van het vlak tot de oorsprong?

-(n · P0)

Deze berekening is overigens het laatste element in de plane equation:
A·x + B·y + C·z - D = 0
A, B en C zijn respectievelijk de x, y en z componenten van de normaal, en D is de afstand tot de oorsprong. De x, y en z in deze berekening zijn de x, y en z componenten van een willekeurig punt op het vlak.
Op die manier kun je makkelijk de afstand van het vlak tot een willekeurig punt berekenen door simpelweg de x, y en z in te vullen in de equation, en te kijken naar de uitkomst.
Is die positief dan ligt ie voor het vlak, is ie negatief dan ligt ie erachter. Als de afstand 0 is dan ligt ie er natuurlijk bovenop

Let er trouwens op dat de equation ook weleens wordt geschreven als
A·x + B·y + C·z + D = 0 (let op die laatste +), maar dat is programma-technisch gezien minder handig omdat je dan niet meer A·x + B·y + C·z > D kunt doen om te kijken of een punt voor of achter een vlak ligt (waarbij de afstand dus niet interessant is)

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.


Verwijderd

Stel je hebt een vlak M en een oorsprong O. Als je de normaalvbector n bepaalt dan is deze op het teken na bepaald. Hij kan dus beide richtingen opwijzen. Om dit op te lossen moet je nog een coordinatenstelsel definieren. Dit coordinatenstelsel geeft dan aan hoe de normaal n gekozen dient te worden.

Dan pas is het mogelijk om te zeggen of het vlak M voor of achter de oorsprong O ligt.

  • HenkS
  • Registratie: Mei 2000
  • Laatst online: 07-07 22:38

HenkS

Da_king alias HenkS

offtopic:
hoe kun je op vrijdagmiddag nog zo denken :?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 08-07 22:45

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op vrijdag 12 juli 2002 16:14 schreef HenkS het volgende:
offtopic:
hoe kun je op vrijdagmiddag nog zo denken :?
oe, voor 3d vragen kun je zelfs nog bij me terecht als ik zwaar onder de dope zit :P (maar verwacht niet dat de uitleg dan even zinnig is :+) ;)

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.


  • SilentStorm
  • Registratie: November 2000
  • Laatst online: 18-03 14:45

SilentStorm

z.o.z

Hmm pas nog op school gehad. Ik zal het ff uitleggen aan de hand van een voorbeeld:
  • afstand punt tot vlak: [u]gegevens:[/u] punt P: (1,-1,2) vlak V: 2x + 3y -z = 5 [u]gevraagd:[/u] afstand P -> V [u]oplossing:[/u] [code]Eerst een hulpvector (W) trekken: [ 1] [ 2] x = [-1] + L[ 3] [ 2] [-1] (x is vector, maar kan er binnen code tags geen streepje onder/pijltje boven zetten) L is lambda, die ik hier ook niet neer kon zetten) Dan het Snijpunt S in Vlak V wat het dichtst bij punt P ligt: (mbv 2x +3y -z = 5) [x] [ 1 + 2L] [y] = [-1 + 3L] [z] [ 2 - L] Ok, maar dan moeten we lambda berekenen. Dit is eigenlijk gewoon herleiden. 2(1 + 2L) + 3(-1 + 3L) - (2 - L) = 5 2 + 4L -3 + 9L - 2 + L = 5 14L = 8 L = (8/14) = (4/7) Ok, rekenen we bovenstaande uit met lambda is (4/7) [x] [ 1 + ( 8/7)] [2(1/7)] [y] = [-1 + (12/7)] = [ (5/7)] [z] [ 2 - ( 4/7)] [1(3/7)] Dus de lijn d tussen de twee punten S (2(1/7), (5/7), 1(3/7)) en P (1, -1, 2) is (pythagoras): V((2(1/7) - 1)^2 + ((5/7) + 1)^2 + 1(3/7) - 2)^2) V(64/49 + 144/49 + 16/49) V(224/49) (V staat hierbij voor wortel)[/code] Dus antwoord: V(224/49) (is ongeveer 2,14)
Kun je het nu nog eens doen voor je eigen waarden of er een programma voor schrijven als je toch hier bent :)

edit: dit is dus wat infinitive ook bedoelde (neem ik aan)

Localhost is where the heart is


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 08-07 22:45

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op vrijdag 12 juli 2002 16:23 schreef SilentStorm het volgende:
Hmm pas nog op school gehad. Ik zal het ff uitleggen aan de hand van een voorbeeld:
wel een omweg hoor :)

V = 2x + 3y - z = 5

Dus de normaal n = [2, 3, -1] / |[2, 3, -1]| = [2 / sqrt (14), 3 / sqrt (14), -1 / sqrt (14)]

de afstand van het vlak tot de oorsprong D = 5 / sqrt (14)

afstand willekeurig punt P tot het vlak:
a = (n · P) - D ~= -2.1380899

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.


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 08-07 21:15

Tomatoman

Fulltime prutser

Het lijkt erop dat we het allemaal wel eens zijn. Nu maar eens de berekening aan de hand van een voorbeeld waarbij je wel drie punten in het vlak hebt, maar niet de vergelijking van het vlak zelf.

Punten in het vlak (vette letters zijn vectoren):
a = (1, 0, 0)
b = (0, 2, -3)
c = (4, -1, -2)
Vraag: wat is de afstand van het vlak door deze punten tot de oorsprong?

Eerst de normaal n1 van het vlak bepalen. Daarvoor kun je twee willekeurige vectoren in het vlak gebruiken. In dit geval de vector van a naar b en de vector van a naar c:
P = ab = (-1, 2, -3)
Q = ac = (3, -1, -2)

P x Q = (-7, -11, -5)
|P x Q| = sqrt(195) --> wortel 195
n1 = P x Q / |P x Q| = (-0,501; -0,286; -0,358)

Nu de afstand d tot het vlak berekenen. Daarvoor kun je een willekeurig punt in het vlak gebruiken. We kiezen voor punt a:
d = -n1 · a = -{[-0,501 x 1] + [-0,286 x 0] + [-0,358 x 0]} = 0,501
d = 7/sqrt(195)
Als hier een negatieve waarde uit was gekomen, hadden we de absolute waarde van de uitkomst moeten nemen.

De vergelijking voor het vlak kunnen we op dit moment bepalen, want de normaal is bekend en de afstand ook:

-0,501 x - 0,286 y - 0,358 z = -0,501

Nu nog vermenigvuldigen met die rottige wortel 195 om een mooie vlakvergelijking te krijgen:

7x + 11y + 5z = 7

Een goede grap mag vrienden kosten.


  • SilentStorm
  • Registratie: November 2000
  • Laatst online: 18-03 14:45

SilentStorm

z.o.z

Op vrijdag 12 juli 2002 17:18 schreef .oisyn het volgende:

[..]

wel een omweg hoor :)

V = 2x + 3y - z = 5

Dus de normaal n = [2, 3, -1] / |[2, 3, -1]| = [2 / sqrt (14), 3 / sqrt (14), -1 / sqrt (14)]

de afstand van het vlak tot de oorsprong D = 5 / sqrt (14)

afstand willekeurig punt P tot het vlak:
a = (n · P) - D ~= -2.1380899
Hmm dat ziet er idd een stuk makkelijker uit :P
Ze zullen ons wel eerst de moeilijke manier hebben laten zien..

Localhost is where the heart is


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 08-07 21:15

Tomatoman

Fulltime prutser

En voor niet weet hoe een uitwendig product is gedefinieerd:

a = (ax, ay, az)
b = (bx, by, bz)

a x b = (aybz- azby, azbx - axbz, axby - aybx)

Een goede grap mag vrienden kosten.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 08-07 22:45

.oisyn

Moderator Devschuur®

Demotivational Speaker

en |A x B| = |A| * |B| * sin (hoek A B) :)

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.


Verwijderd

Stukkie code uit den ouden doosch die facenormals berekent
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
    // first, calculate all facenormals for each face in the model.
    for(iFaceCnt = 0;iFaceCnt < pTheModel->m_iAmFaces;iFaceCnt++)
    {
        pCurrentFace=&pTheModel->m_pFaces[iFaceCnt];
        // calculate the vectors that make up the face plane, using the 3 vertices of this face
        vA[0]=pTheModel->m_pVertices[pCurrentFace->m_iVertexIndices[0]][0] - 
                    pTheModel->m_pVertices[pCurrentFace->m_iVertexIndices[1]][0];
        vA[1]=pTheModel->m_pVertices[pCurrentFace->m_iVertexIndices[0]][1] - 
                    pTheModel->m_pVertices[pCurrentFace->m_iVertexIndices[1]][1];
        vA[2]=pTheModel->m_pVertices[pCurrentFace->m_iVertexIndices[0]][2] - 
                    pTheModel->m_pVertices[pCurrentFace->m_iVertexIndices[1]][2];
        vB[0]=pTheModel->m_pVertices[pCurrentFace->m_iVertexIndices[2]][0] - 
                    pTheModel->m_pVertices[pCurrentFace->m_iVertexIndices[1]][0];
        vB[1]=pTheModel->m_pVertices[pCurrentFace->m_iVertexIndices[2]][1] - 
                    pTheModel->m_pVertices[pCurrentFace->m_iVertexIndices[1]][1];
        vB[2]=pTheModel->m_pVertices[pCurrentFace->m_iVertexIndices[2]][2] - 
                    pTheModel->m_pVertices[pCurrentFace->m_iVertexIndices[1]][2];

        // Crossproduct to get the normal. (B x A, otherwise we end up with normals facing to the inside of the model)
        CrossProductVect3(vB, vA, vNormal);
        // Normalize vNormal
        Vector3Normalize(vNormal);
        // store face normal
        pCurrentFace->m_vFaceNormal[0]=vNormal[0];
        pCurrentFace->m_vFaceNormal[1]=vNormal[1];
        pCurrentFace->m_vFaceNormal[2]=vNormal[2];
    }

// Purpose: calculates the cross product of 2 given vectors vSrc1 and vSrc2 and returns the result
// vector vDst
inline void 
CrossProductVect3(SVect3 vSrc1, SVect3 vSrc2, SVect3 vDst)
{
    vDst[0] = vSrc1[1] * vSrc2[2] - vSrc1[2] * vSrc2[1];
    vDst[1] = vSrc1[2] * vSrc2[0] - vSrc1[0] * vSrc2[2];
    vDst[2] = vSrc1[0] * vSrc2[1] - vSrc1[1] * vSrc2[0];
}

  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08-2025
Op vrijdag 12 juli 2002 13:45 schreef Maria_von_Trapp het volgende:
en waarom wijst de normaal zowieso soms naar de bron toe en soms van de bron af?
Welke kant de normaal op wijst hangt gewoon af van de keuze die je voor de vectoren in het vlak kiest:
AxB = -BxA

| Toen / Nu

Pagina: 1