Programmering

3D datagrafikk: Modell din verden

Utforsk din verden

Så vidt jeg vet kan vi ikke bare stikke litt av vår verden direkte inn i en datamaskin (uten å skade datamaskinen, uansett). Det beste vi kan gjøre er å lage en datamodell av vår verden. Gitt den begrensningen, hvordan modellerer vi for eksempel noe som en stol?

Objekter i vår verden har egenskaper, eller egenskaper, som form, størrelse, vekt, posisjon, orientering og farge (og listen fortsetter og fortsetter). La oss for et øyeblikk bare vurdere deres form, posisjon og orientering - disse egenskapene er det vi kaller romlig eiendommer. Og la oss begynne med noe lettere å jobbe med enn en stol - for eksempel en kube.

Ta en titt på illustrasjonen i figur 1. Den viser en kube som sitter i et ellers tomt rom. (Vel ok, rommet har også en dør, men det er der bare for å få rommet til å se mer ut som et rom.)

Figur 1: Et rom med en kube

For å spesifisere en kubes form, posisjon og retning, må vi spesifisere plasseringen til hvert av hjørnene. For å gjøre det, vi kunne bruk språk slik:

Det første hjørnet er en fot (eller meter, hvis du foretrekker det) over gulvet og to og en halv fot (eller meter) fra veggen bak meg. Det andre hjørnet er også en fot over gulvet og en fot fra veggen til venstre for meg.

Merk at begge hjørnene ble spesifisert i forhold til noe annet (veggen og / eller gulvet). I vår datamodell, vi kunne definere et gulv og en vegg og bruke dem som referansepunkter, men det viser seg å være mye lettere å bare velge et referansepunkt (som vi vil kalle opprinnelse) og bruk det i stedet. For vår opprinnelse bruker vi hjørnet som er dannet av de to veggene og gulvet. Figur 2 viser plasseringen til opprinnelsen.

Figur 2: Opprinnelsen og koordinataksen

Nå må vi indikere hvor hvert hjørne ligger i forhold til opprinnelsen. Du kan spesifisere banen fra opprinnelsen til et hjørne av kuben på flere måter. For enkelhets skyld må vi bli enige om en standard. La oss gjøre følgende:

Tenk deg at hver av kantene dannet av skjæringspunktet mellom en vegg og en vegg, eller en vegg og gulvet, får et navn - vi vil kalle dem x akse, den y-aksen, og z-aksen, som angitt i figur 2. Og la oss også bli enige om at vi bestemmer plasseringen av et hjørne ved å følge denne oppskriften:

  • Først måler du hvor langt vi må reise fra opprinnelsen i en rett linje parallelt med x-aksen
  • Mål deretter hvor langt vi må reise fra det punktet i en rett linje parallelt med y-aksen
  • Til slutt måler du hvor langt vi har å reise fra det punktet i en rett linje parallelt med z-aksen

Figur 3 viser stien vi vil følge for å komme til en av terningens hjørner.

Figur 3: Finne din vei

Som en stenografisk notasjon, la oss skrive alle disse avstandene som:

  • Avstanden fra opprinnelsen parallelt med x-aksen
  • Avstanden fra opprinnelsen parallelt med y-aksen
  • Avstanden fra opprinnelsen parallelt med z-aksen

eller (enda kortere):

(avstand x, avstand y, avstand z) 

Denne tripletten av verdier kalles hjørnet koordinater. Vi kan spesifisere posisjonen i rommet til hvert hjørne på en lignende måte. Vi kan for eksempel finne at kuben er dette eksemplet har hjørner ved:

(3 fot, 1 fot, 2 fot)

eller

(3 fot, 1 fot, 3 fot)

eller

(4 fot, 1 fot, 2 fot)

og så videre.

Måleenhetene (for eksempel fot eller meter) er ikke viktige for vårt formål. Det som er viktig er hvordan enhetene tilordnes til standardenheten for skjermeiendom - pikselet. Jeg snakker mer om den kartleggingen litt senere.

Blir litt irritabel

Plasseringen av kubens hjørner bestemmer kubens posisjon og retning. Imidlertid gitt kun koordinatene til hjørnene, kan vi ikke rekonstruere en kube (enda mindre en stol). Vi trenger virkelig å vite hvor kantene er, fordi kantene bestemmer form.

Alle kanter har en veldig fin egenskap - de begynner og slutter alltid i hjørner. Så hvis vi vet hvor alle kantene er, vil vi absolutt vite hvor alle hjørnene er.

Nå skal vi gjøre en stor forenkling antagelse. I vår modell av verden skal vi forby buede kanter (du får vite hvorfor senere); kantene må alltid være rette linjer. For å tilnærme buede kanter legger vi rette kanter ende-til-ende, som i figur 4.

Figur 4: Den rette linjetilnærmingen av en kurve

Kanter blir da ikke annet enn enkle linjesegmenter. Og linjesegmenter spesifiseres av koordinatene til start- og sluttpunktene. Derfor er modellen til et objekt ikke mer enn en samling linjesegmenter som beskriver formen.

Visualisering: Det er ikke bare for avslapning lenger

Nå som vi vet hvordan vi skal modellere et objekt, er vi klare til å takle problemet med å representere en modell på dataskjermen.

Tenk på dataskjermen som et vindu inn i vår virtuelle verden. Vi sitter på den ene siden av vinduet, og den virtuelle verden sitter på den andre. Figur 5 illustrerer dette konseptet.

Figur 5: Vinduet vårt inn i den virtuelle verden

Det er mange måter å plassere informasjonen i modellen på vinduet (eller dataskjermen). Muligens er det enkleste det som kalles en isometrisk projeksjon.

Fordi modellen vår har tre dimensjoner og dataskjermen bare har to, kan vi kartlegge modellen til skjermen ved først å fjerne z-koordinaten (den tredje av de tre koordinatene) fra hvert punkt i modellen. Dette gir oss x- og y-koordinatene for hvert punkt. X- og y-koordinatene skaleres riktig (basert på enhetene i modellen) og tilordnes til pikslene på skjermen. Vi kan bruke disse trinnene på ethvert interessepunkt i modellen for å finne ut hvor den vil vises på skjermen.

Som det viser seg, er det ikke nødvendig å forvandle hvert punkt i modellen vår på denne måten. En av konsekvensene av å ha tilnærmet hver kant i modellen med linjesegmenter er at vi egentlig bare trenger å transformere endepunktene til et linjestykke, ikke hvert punkt på linjesegmentet. Dette er sant fordi enkle projeksjoner (som en isometrisk projeksjon) alltid forvandler linjesegmenter til linjesegmenter - linjesegmenter blir ikke kurver. Når du kjenner posisjonene til de transformerte endepunktene, kan vi derfor bruke AWTs innebygde linjetegningsrutiner til å tegne linjesegmentet selv.

Jeg tror et eksempel kan være i orden. Jeg skal lage tre enkle modeller av samme form i forskjellige retninger.

Tabell 1 inneholder dataene som beskriver en enkel form i sin første posisjon. Hver rad i tabellen tilsvarer en kant. Tabellen gir koordinatene til kantens start- og sluttpunkter. La oss anta at vi ser på formen utover langs z-aksen.

SegmentetBegynneSlutt
xyzxyz
EN250-702535-35
B2535-352500
C250025-35-35
D25-35-35250-70
E250-70-250-70
F-250-70-2535-35
G-2535-35-2500
H-2500-25-35-35
Jeg-25-35-35-250-70
Tabell 1: Data for en enkel form - første posisjon

Appleten i figur 6 viser hva vi ser.

Du trenger en Java-aktivert nettleser for å se denne appleten.Figur 6: En enkel form - første posisjon

La oss nå rotere formen noen få grader. Tabell 2 inneholder dataene som beskriver samme form i sin andre posisjon. Merk, bare posisjon og retning har endret seg, ikke formen.

SegmentetBegynneSlutt
xyzxyz
EN450-583435-25
B3435-252307
C230734-35-25
D34-35-25450-58
E450-58-20-74
F-20-74-1235-41
G-1235-41-230-7
H-230-7-12-35-41
Jeg-12-35-41-20-74
Tabell 2: Data for en enkel form - andre posisjon

Appleten i figur 7 viser hva vi ser.

Du trenger en Java-aktivert nettleser for å se denne appleten.Figur 7: En enkel form - andre posisjon

Tre er en sjarm, så la oss rotere den en gang til - denne gangen noen få grader oppover. Tabell 3 inneholder dataene som beskriver formen i sin tredje posisjon.

SegmentetBegynneSlutt
xyzxyz
EN45-26-523419-38
B3419-382336
C233634-42-6
D34-42-645-26-52
E45-26-52-2-33-66
F-2-33-66-1212-52
G-1212-52-23-3-6
H-23-3-6-12-49-20
Jeg-12-49-20-2-33-66
Tabell 3: Data for en enkel form - tredje posisjon

Appleten i figur 8 viser hva vi ser.

Du trenger en Java-aktivert nettleser for å se denne appleten.Figur 8: En enkel form - tredje posisjon

Innpakning

Nå har du sannsynligvis kommet til at det ikke er mye moro å endre orienteringen til et objekt for hånd. Og resultatet er heller ikke veldig interaktivt. Neste måned skal jeg vise deg hvordan du kan manipulere objekter interaktivt (og vi får datamaskinen til å knuse hele tallet - tross alt, er det ikke den typen arbeidsdatamaskiner som skal være gode på?). Vi vil også se på problemet med perspektiv - spesielt vil jeg vise deg hvordan du kan innlemme det i synspunkter på modellen vår.

Todd Sundsted har skrevet programmer siden datamaskiner ble tilgjengelige i stasjonære modeller. Selv om han opprinnelig var interessert i å bygge distribuerte objektapplikasjoner i C ++, flyttet Todd til Java-programmeringsspråket da Java ble det åpenbare valget for den slags ting. Todd er medforfatter av Java Language API SuperBible, nå i bokhandler overalt. I tillegg til å skrive, er Todd president i Etcee, og tilbyr Java-sentrisk opplæring, veiledning og rådgivning.

Lær mer om dette emnet

  • For litt av alt relatert til 3D-grafikk, se:

    //www.3dsite.com/3dsite/

  • Yahoo gir en praktisk måte å starte søket etter 3D-grafikkemner

    //www.yahoo.com/Computers_and_Internet/Graphics/3D/

  • Du kan laste ned denne artikkelen, kildekoden og klassefilene som en gzipped tar-fil:

    /javaworld/jw-05-1997/howto/jw-05-howto.tar.gz

  • Forrige Java-artikler
  • "Når statiske bilder bare ikke klipper" - Lær hvordan du kan krydre applets og applikasjoner

    med animerte bilder.

  • "Hvordan Java bruker produsent- / forbrukermodellen til å håndtere bilder - En innsides utseende" - Lær mer om Javas kraftige teknikk for bildebehandling, og følg deretter mine enkle prosedyrer for å bygge din egen produsent og forbrukerkomponenter.
  • "Lær hvordan appletter laster inn nettverksbaserte bilder asynkront" - Her ser du nøye på hvordan Java-applets håndterer bilder i et nettverksbasert miljø.
  • "Det er enkelt å tegne tekst med tre Java-klasser" - Finn ut hvordan du lager tekst som er visuelt tiltalende gjennom denne forklaringen på hvilke klasser du skal bruke og hvordan de fungerer sammen.
  • "Undersøk HotSpot, et objektorientert tegneprogram" - Lær hvordan bitene i Java-språket og klassebiblioteket passer sammen gjennom en studie av denne Java. program
  • "Bruke grafikklassen" - En nærmere titt på grafikklassen og tegningens primitiver den gir, og en demonstrasjon av bruken.
  • "Observer and Observable" - En introduksjon til Observer-grensesnittet og Observable-klassen som bruker Model / View / Controller-arkitekturen som en guide.
  • "Det effektive brukergrensesnittet" - En introduksjon til Observer-grensesnittet og Observable-klassen som bruker Model / View / Controller-arkitekturen som en guide.
  • "Java og hendelsehåndtering" - Hvordan hendelser overføres til brukergrensesnittkomponenter, hvordan du lager hendelsesbehandlere og mer.
  • "Introduksjon til AWT" - En beskrivelse av Java's verktøygrensesnitt for brukergrensesnitt.

Denne historien, "3D computer graphics: Model your world" ble opprinnelig utgitt av JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found