Omrekenen 3d naar 2d coordinaten.

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

  • André
  • Registratie: Maart 2002
  • Laatst online: 12-12 12:54

André

Analytics dude

Topicstarter
Ik wil een functie maken in een programmeertaal (welke maakt niet uit) die van 3d coordinaten 2d coordinaten maakt. :9

Dus op de manier: x, y = Omreken(x, y, z);

Hoe en welke formules moet ik daarvoor gebruiken/toepassen. Moet ik daarvoor ook een aantal vaste waarden vaststellen zoals bijvoorbeeld de plek van de doorsnede van het 2d beeld, enz.

Ik ben in ieder geval een paar hints nodig in de goede richting. Ik heb geen goede (ook geen slechte) documentatie kunnen vinden. :'(

Staat dit in het goede forum (dit is wetenschap), of moet hij naar P&W omdat er waarschijnlijk ook redelijk wat programmeur's zijn die hier iets mee gedaan hebben.

Verwijderd

Wat wil je nu eigenlijk precies? Een loodrechte projectie van een ruimtelijk figuur op het xy vlak? Dan moet je gewoon de z coordinaat weglaten... Dus de functie omreken maakt dan van de vector (x, y, z) de vector (x, y). Een projectie op een ander vlak dan het x,y vlak vergt wat meer berekening, maar dat hangt af van het vlak. Het mooiste zou natuurlijk een functie zijn waarin je ook het vlak kan invoeren en die vervolgens voor elk punt en elk vlak de coordinaten van de projectie van een punt op dat vlak kan geven, maar dat wordt meer werk.

[ Voor 12% gewijzigd door Verwijderd op 13-05-2003 21:30 ]


  • André
  • Registratie: Maart 2002
  • Laatst online: 12-12 12:54

André

Analytics dude

Topicstarter
Verwijderd schreef op 13 May 2003 @ 21:28:
Het mooiste zou natuurlijk een functie zijn waarin je ook het vlak kan invoeren en die vervolgens voor elk punt en elk vlak de coordinaten van de projectie van een punt op dat vlak kan geven, maar dat wordt meer werk.
Dat is wat ik bedoel...

Dus het projectievlak ligt niet perse op het x-y vlak

[ Voor 8% gewijzigd door André op 13-05-2003 21:36 ]


  • Commander Zulu
  • Registratie: December 1999
  • Laatst online: 25-11 14:27
Misschien is een matrix handig?
code:
1
2
3
[x y z] . [a b  = [x' y']
           c d
           e f]

met a = 1 en d = 1 en de rest 0 heb je een projectie op het XY vlak, voor andere getallen heb je andere lineaire projecties.

  • windancer
  • Registratie: Maart 2000
  • Laatst online: 09-12 13:08

  • André
  • Registratie: Maart 2002
  • Laatst online: 12-12 12:54

André

Analytics dude

Topicstarter
Inderdaad, dat is wat ik nodig ben. De term "ProjectieMatrix" doet bij mij weer een aantal belletjes rinkelen. Hier kan ik verder mee, thnx.
Commander_Zulu schreef op 13 mei 2003 @ 23:59:
Misschien is een matrix handig?
code:
1
2
3
[x y z] . [a b  = [x' y']
           c d
           e f]

met a = 1 en d = 1 en de rest 0 heb je een projectie op het XY vlak, voor andere getallen heb je andere lineaire projecties.
Oke, dit begrijp ik. Heb ik alleen nog een vraag hoe de matrix abcdef werkt.

[ Voor 62% gewijzigd door André op 14-05-2003 14:33 ]


  • Thijsch
  • Registratie: Februari 2002
  • Laatst online: 07-12 14:46
Ik zat hier een tijdje terug ook mee. Een wiskunde student vertelde mij toen dit:
3d : x1,y1,z
2d : x2,y2

x2 = x1 + ( sqrt(3) / 2 * z )
y2 = y1 + ( 0.5 * z )

Bij mij heeft het altijd goed gewerkt. Ik ga ervan uit dat het klopt. het wiskundige bewijs ken ik echter niet.

  • Lord Daemon
  • Registratie: Februari 2000
  • Laatst online: 29-11 13:38

Lord Daemon

Die Seele die liebt

ParaDot schreef op 15 May 2003 @ 17:28:
Ik zat hier een tijdje terug ook mee. Een wiskunde student vertelde mij toen dit:
3d : x1,y1,z
2d : x2,y2

x2 = x1 + ( sqrt(3) / 2 * z )
y2 = y1 + ( 0.5 * z )

Bij mij heeft het altijd goed gewerkt. Ik ga ervan uit dat het klopt. het wiskundige bewijs ken ik echter niet.
Wat dit ook mag zijn, in ieder geval geen projectie? Immers, de vector (0,0,1) (met lengte 1) wordt afgebeeld op (sqrt(3)/2, 0.5), wat opnieuw een vector met lengte 1 is. Evenzo worden de vectoren (1,0,0) en (0,1,0) afgebeeld op andere vectoren met lengte 1 (namelijk zichzelf). Maar alleen vectoren in het projectievlak worden lengtebehoudend afgebeeld, dus zouden (1,0,0), (0,1,0) en (0,0,1) allemaal in het projectievlak moeten liggen. Maar die drie liggen niet in 1 vlak. Er is dus geen sprake van een orthogonale projectie.

Ik zie al wat het is: een niet-orthogonale projectie op het xy-vlak, onder een of andere vage hoek. Dit is het soort ding dat je zou gebruiken om 'schaduwen' van objecten uit te rekenen (bij 1 bepaalde stand van de lichtbron). Het is echter expliciet niet een loodrechte projectie.

[ Voor 15% gewijzigd door Lord Daemon op 15-05-2003 18:23 ]

Welch Schauspiel! Aber ach! ein Schauspiel nur!
Wo fass ich dich, unendliche Natur?


  • Lord Daemon
  • Registratie: Februari 2000
  • Laatst online: 29-11 13:38

Lord Daemon

Die Seele die liebt

Wat de topicstarter wil begrijp ik overigens niet helemaal. Othogonale projectie op een vlak (in een 3-d ruimte) is natuurlijk een functie van 3 coordinaten naar 3 coordinaten. Alleen als je op het xy-vlak, het yz-vlak of het xz-vlak projecteert 'verlies' je een coordinaat, maar dat schijnt niet te zijn wat hij wil. Maar in andere gevallen impliceert een projectie van 3 naar 2 coordinaten dat de twee coordinaten niet 2 van de 3 eerder coordinaten zijn - maar onafhankelijk gekozen -, en lijkt het me dus niet dat er regels voor bestaan voordat je de coordinaatkeuze geeft?

Welch Schauspiel! Aber ach! ein Schauspiel nur!
Wo fass ich dich, unendliche Natur?


  • André
  • Registratie: Maart 2002
  • Laatst online: 12-12 12:54

André

Analytics dude

Topicstarter
Lord Daemon schreef op 15 May 2003 @ 18:19:
Wat de topicstarter wil begrijp ik overigens niet helemaal. Othogonale projectie op een vlak (in een 3-d ruimte) is natuurlijk een functie van 3 coordinaten naar 3 coordinaten. Alleen als je op het xy-vlak, het yz-vlak of het xz-vlak projecteert 'verlies' je een coordinaat, maar dat schijnt niet te zijn wat hij wil. Maar in andere gevallen impliceert een projectie van 3 naar 2 coordinaten dat de twee coordinaten niet 2 van de 3 eerder coordinaten zijn - maar onafhankelijk gekozen -, en lijkt het me dus niet dat er regels voor bestaan voordat je de coordinaatkeuze geeft?
Om het verhaal kort te houden: Ik ben aan het experimenteren (spelen) met 3d programmeren in JavaScript. Daarvoor worden de objecten in de berekeningen 3d berekent, maar op het beeldscherm hebben we (vooralsnog) maar 2 dimensies.

En deze vraag is niet in 13 gesteld omdat het Javascript gedeelte geen moeite opleverd, maar de wiskunde wel. :)

  • Lord Daemon
  • Registratie: Februari 2000
  • Laatst online: 29-11 13:38

Lord Daemon

Die Seele die liebt

André schreef op 15 mei 2003 @ 18:57:
[...]
Om het verhaal kort te houden: Ik ben aan het experimenteren (spelen) met 3d programmeren in JavaScript. Daarvoor worden de objecten in de berekeningen 3d berekent, maar op het beeldscherm hebben we (vooralsnog) maar 2 dimensies.

En deze vraag is niet in 13 gesteld omdat het Javascript gedeelte geen moeite opleverd, maar de wiskunde wel. :)
Ok, dan heb jij dus inderdaad een loodrechte projectie nodig op een vlak; maar hoe zitten de coordinaten in je 3-d ruimte dan in elkaar? Roteren die ten opzichte van de 'scherm'-coordinaten?

Welch Schauspiel! Aber ach! ein Schauspiel nur!
Wo fass ich dich, unendliche Natur?


  • windancer
  • Registratie: Maart 2000
  • Laatst online: 09-12 13:08
Lord Daemon schreef op 15 mei 2003 @ 18:14:
[...]
Wat dit ook mag zijn, in ieder geval geen projectie? Immers, de vector (0,0,1) (met lengte 1) wordt afgebeeld op (sqrt(3)/2, 0.5), wat opnieuw een vector met lengte 1 is. Evenzo worden de vectoren (1,0,0) en (0,1,0) afgebeeld op andere vectoren met lengte 1 (namelijk zichzelf). Maar alleen vectoren in het projectievlak worden lengtebehoudend afgebeeld, dus zouden (1,0,0), (0,1,0) en (0,0,1) allemaal in het projectievlak moeten liggen. Maar die drie liggen niet in 1 vlak. Er is dus geen sprake van een orthogonale projectie.

Ik zie al wat het is: een niet-orthogonale projectie op het xy-vlak, onder een of andere vage hoek. Dit is het soort ding dat je zou gebruiken om 'schaduwen' van objecten uit te rekenen (bij 1 bepaalde stand van de lichtbron). Het is echter expliciet niet een loodrechte projectie.
Zoals je zelf al zegt : het is wel zeker een projectie. Dit kan je direct zien uit het feit dat de matrix bij de projectie idempotent is (het kwadraat van de matrix is gelijk aan zichzelf). De bijbehorende matrix is :
code:
1
2
3
[ 1 0 sqrt(3)/2 ]
[ 0 1       1/2 ]
[ 0 0        0  ]

Verwijderd

LD: Dan heb je juist geen loodrechte projectie nodig. Bij een loodrechte projectie zou de projectie van een kubus waarvan een vlak evenwijdig aan het beeldschermvlak staat, een vierkant worden, terwijl dat voor een realistische 2d weergave van 3d niet goed is. Hoe de vorm van projectie heet die je wel nodig hebt, weet ik niet, maar ik denk dat hij goed te bereiken is door de geprojecteerde figuur samen te stellen uit de snijpunten van het vlak met een groep rechte lijnen die allemaal door 1 punt gaan aan de ene kant van het vlak (het gezichtspunt), en elk door 1 van de punten van de 3d-figuur aan de andere kant van het vlak.

[ Voor 3% gewijzigd door Verwijderd op 15-05-2003 23:54 ]


  • Lord Daemon
  • Registratie: Februari 2000
  • Laatst online: 29-11 13:38

Lord Daemon

Die Seele die liebt

Verwijderd schreef op 15 May 2003 @ 23:54:
LD: Dan heb je juist geen loodrechte projectie nodig. Bij een loodrechte projectie zou de projectie van een kubus waarvan een vlak evenwijdig aan het beeldschermvlak staat, een vierkant worden, terwijl dat voor een realistische 2d weergave van 3d niet goed is. Hoe de vorm van projectie heet die je wel nodig hebt, weet ik niet, maar ik denk dat hij goed te bereiken is door de geprojecteerde figuur samen te stellen uit de snijpunten van het vlak met een groep rechte lijnen die allemaal door 1 punt gaan aan de ene kant van het vlak (het gezichtspunt), en elk door 1 van de punten van de 3d-figuur aan de andere kant van het vlak.
Ik begrijp er helemaal niets van? Als ik van de zijkant tegen een kubus aankijk zie ik toch inderdaad een vierkant? Wat is daar onrealistisch aan? Het lijkt me volstrekt bizar als het iets anders wordt?

Met jouw methode wordt het ook een vierkant; bovendien is het geen projectie. :)

[ Voor 5% gewijzigd door Lord Daemon op 16-05-2003 01:58 ]

Welch Schauspiel! Aber ach! ein Schauspiel nur!
Wo fass ich dich, unendliche Natur?


Verwijderd

LD: Voor een realistische 3d-weergave op je scherm wil je juist niet dat een kubus een vierkant wordt (tenzij je het niet hebt over een draadfiguur maar over een kubus met ondoorzichtige vlakken, maar ok), maar twee vierkanten waarvan de hoekpunten van de beide vierkanten met elkaar verbonden zijn. Of deze vierkanten binnen elkaar liggen (en een niet-draadmodel kubus er dus uitziet als een vierkant) hangt overigens geheel af van de plaatsing van het gezichtspunt.

Op de door mij beschreven manier bereik je een realistische illusie van diepte. In feite boots je de projectie op het netvlies na, al bevindt het netvlies zich in dit geval voor de pupil. Dat is de manier waarop wij diepte zien, en dat moet dus ook de manier zijn waarop je een 3d-figuur realistisch afbeeldt op een 2d-vlak. Ik zie overigens niet in waarom de geconstrueerde 2d-figuur geen projectie is van de 3d-figuur: Geen loodrechte projectie natuurlijk, maar wel degelijk een projectie lijkt me zo.

  • Lord Daemon
  • Registratie: Februari 2000
  • Laatst online: 29-11 13:38

Lord Daemon

Die Seele die liebt

Ik had het inderdaad over een massieve kubus - maar wat wellicht relevanter is, is dat ik niet begrepen had dat we hier beelden met perspectief aan het maken waren. :) (Mijn idee werkte perfect voor kubussen in het oneindige! Goed genoeg voor een natuurkundige.) In dat geval is jouw aanpak natuurlijk de juiste, en moet niemand zich laten verleiden door mijn voorliefde voor projecties.

Welch Schauspiel! Aber ach! ein Schauspiel nur!
Wo fass ich dich, unendliche Natur?


  • Diadem
  • Registratie: Maart 2000
  • Laatst online: 31-05-2023

Diadem

fossiel

Haha, ik heb vandaag een voordracht gevonden over dit onderwerp. Nouja, een deel van dit onderwerp. Voor overdragen van de wiskunde, de UU beta's hier wel bekend waarschijnlijk.

Perspectifisch projecteren van parabolen.

Ik volgde er niet heel veel van, maar ik weet alleen nog dat parabolen worden afgebeeld als cirkels. Wel grappig.

Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life - Terry Pratchett


  • WildernessChild
  • Registratie: Februari 2002
  • Niet online

WildernessChild

Voor al uw hersenspinsels

Het is (in de basis) veel simpeler dan je zou denken: deel gewoon de (3D) x en y coordinaten door het bijbehorende z-coordinaat en je hebt je 2D x en y coordinaten. Je moet nog wel het een en ander opschuiven (optellen/aftrekken) omdat je gezichtspunt niet linksbovenaan je beeldscherm zit. Misschien nog wat vermenigvuldigen en delen om de schaal goed te krijgen, en dan moet het al ergens op lijken...
Als je ook de 'camera' wilt verplaatsen wordt het lastiger; maar wat (iig bij OpenGL) de techniek is is dat je gewoon de hele wereld om de camera heen in de tegengestelde richting draait/verplaatst.

Maker van Taekwindow; verplaats en resize je vensters met de Alt-toets!


Verwijderd

ik oa. gebruik deze;

cxd/cyd/czd zijn arrays met mijn 3D punten
middenx en middeny is het midden van het scherm (400/300 bij 800*600)

xxd[i]=(int) (cxd[i]*(1.0f/(2.5f+czd[i]))*middeny+middenx);
yyd[i]=(int) (cyd[i]*(1.0f/(2.5f+czd[i]))*middeny+middeny);

  • mrClass
  • Registratie: April 2002
  • Laatst online: 17-04 19:14
Ik heb hier ook eens mee geklooid. En aangezien ik toen nog geen matrix rekenen heb gehad. En eigenlijk niks van 3d weet. Heb ik mijn eigen formule bedacht. Om 3 coordinatien om te rekenen naar 2 coordinaten. hier heb ik eens een Artikel over geschreven.

----Start---
Voor het omrekenen van de z-coordinaat met z-factor

z-factor = (1/z)
Hierin is Z de z-coordinaat.

Voor het omrekenen van een links-boven georienterd scherm naar een midden georienteerd scherm.

2dXoffset = (scherm.lengte/2)
2sYoffset = (scherm.hoogte/2)
Hierin is 2dXoffset het aantal punten dat erbij opgeteld moet werden voor een midden georienteerd scherm. Idem voor de 2dYoffset

De gehele formule word nu:

X2d = (x*z-factor) + 2dXoffset
Y2d = (y*z-factor) + 2dYoffset

Hierin is zijn X2d en Y2d de 2-dimensionale schermcoordinaten.

Op deze manier kunnen we dus een bepaald punt dat we voor ogen hebben in een 3d ruimte omrekenen naar een punt in een 2d ruimte om zo te weergeven, dat de illusie ontstaat dat er 3 coordinaten zijn terwijl er maar 2 beschikbaar zijn.
--Eind

Als je nu een pixel plaatst op de (X2d, Y2d) dan staat deze daar in 3-d. Je kan natuurlijk ook een lijn tekenen door meerdere van deze punten om een wire-frame model te maken. Verder ben ik ook nooit gekomen.
Pagina: 1