2d map om een bol leggen (3d coordinaten berekenen)

Moderators: dirkwb, Xilvo

Forumregels
(Middelbare) school-achtige vragen naar het forum "Huiswerk en Practica" a.u.b.
Zie eerst de Huiswerkbijsluiter
Reageer
Berichten: 3

2d map om een bol leggen (3d coordinaten berekenen)

Ik wil voor een spelletje een map-previewer maken. Dit is een map van (128x128) met hoogtes. Alleen mijn probleem is dat ik die map op een wereldbol wil krijgen. Wat ik nodig heb, is dat ik een (x,y,h) in 3d coordinaten kan omzetten, waarbij x,y een coordinaten op de map zijn, en h de hoogte van het land.

Wat ik tot nu toe geprobeerd heb zijn 2 hoeken uit te rekenen:

hoekX = (360 / 128) * x

hoekY = (360 / 128) * y

en dan moet ik iets met cosinus en sinus doen om de 3d coordinaten uit te rekenen, maar dat lukt me niet echt (ik krijg alles behalve een bol). Het gaat me niet eens om de hoogte, want die kan ik later d.m.v. vermenigvuldiging toepassen.

Kan iemand mij helpen met het omzetten van de coordinaten?

Berichten: 3

Re: 2d map om een bol leggen (3d coordinaten berekenen)

ondertussen heb ik de volgende code uitgevogeld:

Code: Selecteer alles

Function CalcSpherePoint(CoordsXY As XY, height As Double) As XYZ

    degY = PI / 128 * (CoordsXY.X - 64)

    degX = PI / 128 * (CoordsXY.Y - 64)

    CalcSpherePoint.X = Cos(degX) * Cos(degY) * height

    CalcSpherePoint.Y = Sin(degX) * height

    CalcSpherePoint.Z = Cos(degX) * Sin(degY) * height

End Function
waarbij er een x en y coordinaat (van de map) en een hoogte als parameter wordt opgegeven, en waarbij de functie de x, y en z coordinaten zou moeten teruggeven. Als ik deze functie doorloop met mijn grid van 128x128, krijg ik een HALVE wereldbol:

Afbeelding

Het gekke is dat wel de hele map aanwezig is, dus het is niet zo dat de helft van de map niet getekend is.

Weet iemand wat er fout is in mijn formule? (de programmeertaal (Visual Basic) werkt met radialen)

Gebruikersavatar
Berichten: 5.679

Re: 2d map om een bol leggen (3d coordinaten berekenen)

Let op dat wat je wil, eigenlijk onmogelijk is: je kunt niet een transformatie tussen een 2-dimensionaal vlak en het oppervlak van een 3-dimensionale bol maken, zonder dat één van de twee hier en daar moet scheuren of een heel gebied (lijn) moet samenknijpen tot één punt.

De manier waarop een vierkante (of in het algemeen uit één plat stuk bestaande) texture meestal om een bol wordt gewrapt is wat jij hier ook doet, en de complete bovenkant en onderkant van de map vallen dan samen op de noord- en zuidpool.

Dat hoeft niet erg te zijn, als je map daar bijv. overal dezelfde waarde heeft.

In je code maak je de fout dat je de X-hoek een halve cirkel laat doorlopen. Voor de Y-hoek is dat goed, voor de X-hoek moet je er dan wel hele cirkels van maken.

Vermenigvuldig degX eens met 2 (of liever gezegd deel door 64 i.p.v. 128), dat zou een stuk moeten schelen.

Die -64 bij degX heeft geen zin, je bol staat daardoor alleen een kwart gedraaid rond de y-as, maar dat maakt natuurlijk niet uit.
In theory, there's no difference between theory and practice. In practice, there is.

Berichten: 3

Re: 2d map om een bol leggen (3d coordinaten berekenen)

Je hebt helemaal gelijk, niet aan gedacht... Dan wordt waarschijnlijk de oplossing dat ik de zichtbare helft aan de voorkant doe, en dat ik dan de map als het ware over de bol laat schuiven bij het 'draaien'. Het enige nadeel is dan dat alles bij elk frame weer opnieuw opgebouwd moet worden ipv dat de camera verplaatst kan worden, wat een stuk langzamer werkt. In ieder geval bedankt voor je reactie!

Reageer