Springen naar inhoud

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


  • Log in om te kunnen reageren

#1

Kakoen

    Kakoen


  • 0 - 25 berichten
  • 3 berichten
  • Gebruiker

Geplaatst op 14 mei 2006 - 18:32

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?

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

Kakoen

    Kakoen


  • 0 - 25 berichten
  • 3 berichten
  • Gebruiker

Geplaatst op 14 mei 2006 - 20:47

ondertussen heb ik de volgende code uitgevogeld:

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:

Geplaatste 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)

#3

Rogier

    Rogier


  • >5k berichten
  • 5679 berichten
  • VIP

Geplaatst op 14 mei 2006 - 21:27

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.

#4

Kakoen

    Kakoen


  • 0 - 25 berichten
  • 3 berichten
  • Gebruiker

Geplaatst op 14 mei 2006 - 22:49

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!





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures