In driedimensionale ruimte 3 is een camera opgesteld, op positie c = (c1, c2, c3). De richting van de camera specificeer ik als een vector v = (v1, v2, v3). Met andere woorden, de camera c kijkt naar het punt c + v. Deze camera "ziet" dus een willekeurig punt in de ruimte in zijn "lens". Het resultaat is een tweedimensionaal beeld. Wat ik wil opstellen is een algoritme / functie / stappenplan 3 ® 2 dat een willekeurig punt (x1, x2, x3) in de ruimte, stuurt naar een punt (s1, s2) op het beeld, zoals de camera dit punt zou "zien".
Bijvoorbeeld: twee punten die samen met c op één rechte lijn liggen, worden op hetzelfde punt afgebeeld, want gezien vanuit c liggen ze "achter elkaar". Punten die op de lijn door c en c + v liggen, worden op (0, 0) afgebeeld, die liggen "recht voor de camera". De afstand van het beeldpunt tot (0, 0) is puur afhankelijk van de hoek tussen de verbindingslijn van c tot dat punt, met de kijkrichting v. Als deze hoek groter wordt, wordt de afstand van het beeldpunt tot het midden groter. Bovendien worden drie collineaire punten op drie collineaire punten afgebeeld.
Nu dacht ik het beeldpunt te specificeren in poolcoordinaten, oftewel ik weet de afstand tot de oorsprong en ik weet de hoek met de positieve x-as. De afstand heb ik gevonden, gewoon door de hoek tussen de vectoren uit te rekenen, echter hoe bepaal ik de hoek?
Ik had eerst het idee om het volgende te doen.
Zonder verlies van algemeenheid, neem c = 0, door alles te transleren over -c.
Zonder verlies van algemeenheid, neem v = (1, 0, 0) door alles te roteren. (Mag dit zomaar?) v is alleen belangrijk op schaling na, dus v kan worden genormaliseerd. Ik heb ergens een formule waarmee ik een willekeurig punt over een willekeurige hoek om een willekeurige as kan roteren, naar mijn idee heb ik die formule nodig)
Nu zou het probleem eenvoudig moeten zijn.
Echter, als ik dit inprogrammeer om te contoleren of dit goed gaat, zie ik dat het "iets doet" maar zeker niet wat ik wil. Wat is een eenvoudige manier om dit camerabeeld correct uit te rekenen?
Erik L
Student universiteit - zondag 1 juli 2007
Antwoord
Dag Erik,
De afbeelding dit je maakt heet een projectie. In jouw aannames voor c en v zie ik geen probleem. Wel zijn er verschillende soorten projcties. De eenvoudigste is de evenweidige projectie. Je trekt dan vanaf je voorwerpspunt een lijn evenweidig aan v tot aan het YZ-vlak (algemener het vlak door c loodrecht op v). Die operatie is heel eenvoudig: (x,y,z) - (y,z). Maar hij is alleen geldig voor voorwerpen die ver genoeg weg staan.
Als het het over een camera hebt, heb je nog een extra gegeven nodig. Stel je de lens (+diafragma) voor als een klein gaatje op afstand b (=beeldafstand) van de film. De lichtstraal van een voorwerpspunt moet door het gaatje en komt vervolgens op de film aan de andere kant van de v-as met een schaalfactor die afhangt van b en v (de voorwerpsafstand van het punt tot de lens). Die afbeelding kun je vast wel uitwerken.
Ik zie nog niet zo veel redenen om poolcoordinaten te gebruiken.
Nu ik er nog eens over nadenk merk ik dat de waarde van b er niet zo veel toe doet (dat zul je ook in de praktijk wel merken). De afwijking van de evenweidige projectie ontstaat als de (diepte)afmetingen van een voorwerp van dezelfde grootteorde zijn als de afstand tot de lens.