Globe i AgetoAgeSqlite
User Rating: / 0
- Details
-
Category: Development
-
Published on Tuesday, 06 September 2011 21:17
-
Written by Ove
-
Hits: 6576
Jeg har nå studert matematikken bak en 3D visning av en globe og fått den til å rotere om x, y og z aksen. Det er viktig å ha gode og korrekte formler for å vise 3D og var så heldig å finne meget gode formler her.
Nedenfor er et par eksempler på utviklingen. Jeg hadde tidligere tegnet opp hele verden og brukt ca 280 000 geografiske punkter, men før viste jeg det på en plan flate nå kan jeg vise disse punktene på en 3D kule som kan roteres. I skrivende stund er jordkloden gjennomsiktig slik at man ser landene på baksiden men dette er jo enkelt å unngå med å undersøke Z verdien på punktene. Hvis Z verdi er mindre enn null er punktet lenger borte enn planet som deler jordkloden i 2 halvdeler og skal følgelig ikke vises fra denne synsvinkel.
På skjermbildet under har jeg zoomet litt inn på Norge. Min jordklode består av ca 280 000 punkter men jeg kan redigere og legge til flere om ønskelig.
Jeg har ikke lastet opp denne versjonen av AgetoAgeSqlite som har denne Globen da litt enda gjenstår. Men kommer snart.
08-09-2011 - Lastet opp ny versjon av AgetoAgeSqlite med Globe. For å vise landene må man laste ned AtaGlobeData i tillegg og unzippe den til et eller annet sted på pc'n. Så velger man View/Globe og presser "q" på tastaturet da får man opp en fildialog der man velger denne filen (ataGlobeData.txt). Neste gang man velger View/Globe vil filen automatisk lastes.
For å rotere om x-aksen press "x" for y-aksen press "y" og for z-aksen press "z". For å zoome inn press "g" og for å zoome ut press "h". For å bevege seg i til sidene press F8 og F9 (hold nede shift for å bevege mer om gangen). For å bevege seg opp eller ned press F6 og F7 (shift for å bevege mere per gang).
Fantastisk å kunne zoome inn nesten ubegrenset. Jeg kan lett zoome inn så diameteren i globen blir over 500 000 pixler. Hvis jeg har satt oppløsning til 1200 pixler i skjerm bredden blir det ca 416 skjermbredder og sier vi skjermen er 0,5 m bred ser man altså da et bittelite utsnitt av denne globen som da er ca 208 meter i diameter.
Landarealer på baksiden av Globen blir vist i en gråtone og har man lagt til noen Locations med lengde og breddegrad blir disse markert med en grønn liten sirkel. Disse kan slås av/på med å presse "l" ("L").
11-09-2011 - Lastet opp ny versjon av AgetoAgeSqlite der Globen er blitt oppdatert med menyer for å sette farver og litt til. Jeg strevde litt med å finne riktig formel for å finne lengde og breddegrad for musepekeren når man beveger den over globen hvis man hadde rotert globen i alle retninger men det var selvsagt bare å reversere formelen for å finne x,y for en lengde og breddegrad.
12-09-2011 - Har lastet opp en ny oppdatering der Globen tegner kun de land som er på forsiden. Det oppstår litt problemer med dette da kartet mitt består av punkter som det trekkes linjer mellom. På bildet nedenunder er problemet illustrert man ser at en liten del av Afrika ligger på baksiden og det trekkes en rett linje fra de to punkter som ligger på forsiden. Jeg vil nå forsøke å løse dette problemet med å la programmet tegne opp en del av en sirkel med samme radius som globen mellom disse punktene.
13-09-2011 - Lastet opp ny versjon av AgetoAgeSqlite der Globen har blitt vesentlig raskere å bruke ved at programmet nå vil ikke plotte unødvendige detaljer når man ser hele halvkulen på en gang. Detaljene vil likevel ikke være synlig ved så liten målestokk så derfor mister man ikke noe heller. Man kan nå også dobbelklikke en steds markering (eller i nærheten) og få opp skjemaet som beskriver dette stedet. På bildet under har jeg valgt en mørk farve for stedene som er registert (hvor slektninger er født, blitt gift, bodd eller har hvilested)
13-09-2011 kl 23.58 - Lastet opp ny versjon av AgetoAgeSqlite der Globen har fått en forbedring av zoom funksjonen. Nå vil kartet zoomes inn/ut nøyaktig der musepekeren befinner seg. Dvs. hele Globen blir selvfølgelig større/mindre ved zooming men det punktet som ligger under musepekeren vil fortsatt være under musepekeren etter zooming. Jeg ble forresten ganske imponert av meg selv etter at jeg fant en utrolig enkel måte å få til dette på. Posisjonen til sentret i globen får lagt til differansen mellom avstander fra punktet som er under musepekeren til Center i globen før og etter zooming slik at sentret i Globen kanske enkelt bare blir flyttet til riktig sted for at punktet under musepekeren fortsatt skal være under musepekeren etter zooming.
Ny versjon lastet opp med mulighet for å måle distanser på Globen. Kurs og distanse blir beregnet etter storsirkel formler og en linje som følger storsirkelen blir tegnet opp. For å bruke funksjonen flytter man musen til det punktet på globen man vil reise fra og høyreklikker og velger "Measure distance/Set A" deretter flytter man musen til det punkt man vil reise til og høyreklikker og velger "Measure distance/Set B" da vil en linje som følger storsirkelen mellom disse to punkter bli tegnet opp og distansen vil bli vist.
Lastet opp ny versjon der Globen har blitt oppdatert igjen. Nå med en bedre funksjon som tegner opp en kurs fra et punkt til et annet. På bildet over har jeg satt A til et punkt i midten av Afrika og så har jeg flyttet musa rundt omkring dette punktet og satt forskjellige B steder. Når man setter B punktet kommer det nå opp et vindu der man kan klikke Calculate for å vise posisjoner mellom A og B. Jeg har satt alle avstander til å bli delt opp i 40 deler og så blir posisjonen får disse 40 punktene funnet etter storsirkel formel. Disse kan også skrives til en fil om ønskelig.
Jeg har nå lastet opp ny versjon av AgetoAgeSqlite med oppdatert Globe som nå har farve på landene. Samtidig har kurs og avstandsmåleren blitt forbedret og man får opp et vindu der man kan dele opp avstanden i ønsket antall deler og få beregnet kurs og geografisk posisjon på alle punkter mellom avreisested og fremkomststed. Jeg har definert kursen til å være 0 grader rett mot nord og 90 grader til å være rett mot øst og 180 grader rett mor sør og 270 grader rett mot vest og 360 grader eller 0 rett mot nord igjen. Dette er vel en vanlig definisjon skulle jeg tro.
24-09-2011 - Lastet opp ny versjon av AgetoAgeSqlite der Globen nå får fylt havet først med en dyp blåfarve så blir landene fylt med en gradient brush der man kan velge farvene. Man kan nå velge å vise stedsnavn eller ikke. For å zoome plasser musen der man ønsker og press "g" eller "h".
Jeg vil med det samme presisere at teknikken for denne Globen baserer seg på helt standard grafikk funksjoner innebygget i Windows slik at det vil kjøre på alle pc'er som har XP eller senere versjoner installert. Men det er mulig at jeg om litt tid vil lansere en versjon som vil benytte Direct3D som er det som benyttes i mange spill som krever rask grafikk. Jeg har allerede tatt en titt på dette og er mildt sakt himmelfallen over hvor raskt man kan rotere og snu på grafikken der. Men å programmere Direct3D krever litt innsats både når det gjelder tid og studering av eksempler på bruken av det. Men det gode er at dette biblioteket av prosedyrer og funksjoner er helt gratis og kan fritt lastes ned fra Microsoft for dem som ønsker å ta en titt på dette. Det er forøvrig to grafikk systemer som er aktuelle for programmere av rask grafikk som begge er gratis, det er OpenGL og DirectX. (DirectX er et fellesnavn for subsystemene Direct3D, DirectSound, DirectInput for å nevne det viktigste). Direct3D har innebygget funksjon for å lage en Globe der man spesifiserer ønsket oppløsning av lengde og breddegrader. Jobben min blir da å legge til Texture på Globen dvs. å legge på en overflate. Programmering av spill som bruker DirectX, OpenGl eller annet grafikk system som har direkte kontakt med skjermkortet krever at man har et 3D studio program, man kan selvsagt lage et enkelt spill uten dette men det vil ta lang tid å programmere hvordan spillet skal se ut og koden vil bli meget komplisert etterhvert, derfor bruker man et 3D studio program der man designer alt sammen, for eks. tegner et hus der man kan gå inn i rommene og male vegger og tak, sette opp bilder på veggene, blomster i vinduene, dette er det man kaller Mesh (skjelett) og farver og hvordan overflaten ser ut er Texture og så eksporter man dataene for dette og setter Direct3D til å vise dette i det programmet man vil vise dette i. Dataene er vektorer og Direct3D kan beregne hvordan huset ser ut fra en ønsket synsvinkel på nesten null komma null, det fine er at man man laster inn disse vektorene og Direct3D vil da ta seg av det meste for å beregne hvordan det vil se ut etterhvert som man beveger seg inn i rommene. Har man et godt program for å designe 3D grafikk er det slett ikke så vanskelig eller tidkrevende å lage en scene der man kan vandre rundt omkring snu og vende på blomstervaser og annet. Jeg glemte en ting... man kan også laste ned 3D modeller som andre har laget og lagt ut gratis, f.eks hvis man ønsker å vise en BMW kan man sikkert finne en ferdig designet BMW som mesh og texture og så vise denne med Direct3D. Hvis man bruker den i et kommersielt program burde man da kontakte den som har laget denne modellen for å spørre om det er greit. Skal jeg drømme litt så vil jeg drømme om å designe en gammel seilskute og så kan man seile til østkysten av USA og så kjøper jeg billett på et gammelt damplokomotiv og reiser ut på prærien for å finne steder mine slektninger bosatte seg på der. Et profesjonelt 3D studio program er dyrt og kommer fort opp i kr 20 000 eller mer men det finnes også programmer som er OpenSource (kildekoden er ikke beskyttet med opphavsrett) og som er brukbare.
02-10-2011 - Lastet opp ny versjon av AgetoAgeSqlite der Globen har blitt oppdatert slik at man kan flytte den med musa i ønsket retning. Det er praktisk når man har zoomet inn og vil se litt lenger opp, ned, venstre eller til høyre. Man kan også velge farve på havet. På skjermbildet under er de gule og røde markeringene steder der vi har slektninger, de gule er steder med foto. Litt gule og røde blomster pynter opp på kloden ja.
05-10-2011 - Ny oppdatering der man nå ser høyden man ser jordan fra, samtidig har jeg føyd til funksjon Goto som vil sentrere punktet under musen og en "Goto location" der man velger et sted fra databasen som blir sentrert på Globen. Har også rettet en liten feil i location listen.
Ny oppdatering av AgetoAgeSqlite er lastet opp. Nå er det mulighet for å slå av og på gradsirklene på globen. De er jo strengt tatt ikke nødvending for latitude og longitude vises nede til venstre i vinduet for hvor musepekeren befinner seg. Meget lærerikt å utvikle denne globen man lærer en masse om 3D og siden jeg ikke benytter noen modul for 3D grafikk må jeg programmere alt fra A til Å.
11-10-2011 - Lastet opp ny versjon der Globen har fått rettet en liten feil som oppstod når man høyreklikket og valgte Goto altitude (høyde over havet). Jeg hadde i farten snudd en formel feil, og dette er nå rettet. Så har jeg lagt til et høyreklikk valg i location listen som gir anledning til å få Globen til å sprette opp i et nytt vindu og samtidig blir altitude satt til 200 km slik at man ser dette stedet fra 200 km høyde. (dette betinger at stedet har fått satt lengde og breddegrad). Videre kan man nå også gå direkte til ønsket lengde og breddegrad (høyreklikk og velg Goto longitude, latitude). Dette punktet kommer da i senter på globen.
12-10-2011 - Ny oppdatering av globen i AgetoAgeSqlite. Jeg har skrevet ny prosedyre som tegner opp lengde og
breddegrad sirkler. Kun linjene på forsiden (halvdel av kulen som man ser) blir tegnet opp. Jeg har brukt rette linjer mellom punktene men dette kan selvfølgelig forandres til krumme linjer i senere versjon. En annen ting som er blitt oppdatert er "Goto altitude" (høyde over havet). Nå blir det punktet som var under musepekeren da man høyreklikket og valgte denne funksjonen satt til å vises på samme sted etter at høyden er satt, slik at man samtidig kan sette høyde over havet og det punkt man er interessert i å se ned på.
15-10-2011 - Lastet opp ny versjon med oppdatert gradsirkler.
17-10-2011 - Ny oppdatering av Globen. Man kan velge om man vil ha hel eller striplet gradsirkellinjer, krummet eller rett og markeringer for steder vil bli vist over disse linjene (ser bedre ut, ja).
Jeg arbeider også med en Globe som vil bruke Direct3D (Direct3D er inkludert i Windows95 eller alle senere versjoner). Jeg har nå skrevet en prosedyre som laster inn dataene (punktene for geometrien på landområdene) og kan rotere dette om x, y og z aksene. Det var nesten som sience fiction å se disse 280 000 linjene bli rotert med Direct3D. Så lett å zoome inn og ut og rotere lynkjapt om man vil.. og Direct3D har innebygget funksjon for å sette en MIN og MAX avstand for et punkt dvs at det blir enkelt å skjule landene som er på baksiden av globen. En liten demo nedenfor