Programmering

3D computergrafik: Model din verden

Udforsk din verden

Så vidt jeg ved, kan vi ikke bare holde lidt af vores verden direkte inde i en computer (uden at beskadige computeren, alligevel). Det bedste, vi kan gøre, er at skabe en computermodel af vores verden. I betragtning af denne begrænsning, hvordan modellerer vi f.eks. En stol?

Objekter i vores verden har egenskaber eller egenskaber, såsom form, størrelse, vægt, position, orientering og farve (og listen fortsætter og fortsætter). Lad os overveje et øjeblik kun deres form, position og orientering - disse egenskaber er det, vi kalder rumlige ejendomme. Og lad os starte med noget lettere at arbejde med end en stol - for eksempel en terning.

Se illustrationen i figur 1. Den viser en terning, der sidder i et ellers tomt rum. (Okay, rummet har også en dør, men det er der kun for at få rummet til at ligne et rum mere.)

Figur 1: Et rum med en terning

For at specificere formen, placeringen og orienteringen af ​​en terning skal vi specificere placeringen af ​​hvert af hjørnerne. For at gøre det, vi kunne brug sprog som dette:

Det første hjørne er en fod (eller meter, hvis du foretrækker det) over gulvet og to og en halv fod (eller meter) fra væggen bag mig. Det andet hjørne er også en fod over gulvet og en fod fra væggen til venstre for mig.

Bemærk, at begge hjørner blev specificeret i forhold til noget andet (væggen og / eller gulvet). I vores computermodel, vi kunne definer et gulv og en mur og brug dem som referencepunkter, men det viser sig at være meget lettere at blot vælge et referencepunkt (som vi kalder oprindelse) og brug det i stedet. For vores oprindelse bruger vi hjørnet dannet af de to vægge og gulvet. Figur 2 viser placeringen af ​​vores oprindelse.

Figur 2: Oprindelsen og koordinataksen

Nu skal vi angive, hvor hvert hjørne er placeret med hensyn til oprindelsen. Du kan angive stien fra oprindelsen til et hjørne af terningen på flere måder. For nemheds skyld skal vi blive enige om en standard. Lad os gøre følgende:

Forestil dig, at hver af de kanter, der dannes ved skæringen mellem en mur og en væg eller en væg og gulvet, får et navn - vi kalder dem x-akse, det y-aksen, og z-aksen, som angivet i figur 2. Og lad os også være enige foran, at vi bestemmer placeringen af ​​et hjørne ved at følge denne opskrift:

  • Mål først, hvor langt vi skal rejse fra oprindelsen i en lige linje parallelt med x-aksen
  • Mål derefter hvor langt vi skal rejse fra dette punkt i en lige linje parallelt med y-aksen
  • Endelig måler vi, hvor langt vi skal rejse fra dette punkt i en lige linje parallelt med z-aksen

Figur 3 viser den sti, vi ville følge for at komme til en af ​​terningens hjørner.

Figur 3: Find din vej

Lad os skrive en kort beskrivelse af alle disse afstande som:

  • Afstanden fra oprindelsen parallelt med x-aksen
  • Afstanden fra oprindelse parallelt med y-aksen
  • Afstanden fra oprindelsen parallelt med z-aksen

eller (endnu kortere):

(afstand x, afstand y, afstand z) 

Denne triplet af værdier kaldes hjørnerne koordinater. Vi kan specificere placeringen i rummet for hvert hjørne på en lignende måde. Vi kan f.eks. Finde ud af, at terningen er dette eksempel har hjørner ved:

(3 fod, 1 fod, 2 fod)

eller

(3 fod, 1 fod, 3 fod)

eller

(4 fod, 1 fod, 2 fod)

og så videre.

Måleenhederne (f.eks. Fod eller meter) er ikke vigtige for vores formål. Det, der er vigtigt, er, hvordan enhederne kortlægges til standardenheden for skærmejendomme - pixlen. Jeg vil tale mere om den kortlægning lidt senere.

Bliver lidt kantet

Placeringen af ​​terningens hjørner bestemmer placeringen og orienteringen af ​​terningen. Dog givet kun koordinaterne for hjørnerne, kan vi ikke rekonstruere en terning (meget mindre en stol). Vi har virkelig brug for at vide, hvor kanterne er, fordi kanterne bestemmer form.

Alle kanter har en meget flot egenskab - de begynder og slutter altid i hjørner. Så hvis vi ved, hvor alle kanter er, ved vi helt sikkert, hvor alle hjørner er.

Nu skal vi lave en stor forenkling antagelse. I vores verdensmodel vil vi forbyde buede kanter (du lærer hvorfor senere); kanter skal altid være lige linjer. For at tilnærme buede kanter lægger vi lige kanter ende-til-ende, som i figur 4.

Figur 4: Den lige linje tilnærmelse af en kurve

Kanter bliver derefter intet andet end enkle linjesegmenter. Og linjesegmenter specificeres af koordinaterne til deres start- og slutpunkter. Derfor er modellen til et objekt intet andet end en samling af linjesegmenter, der beskriver dens form.

Visualisering: Det er ikke kun til afslapning længere

Nu hvor vi ved, hvordan man modellerer et objekt, er vi klar til at tackle problemet med at repræsentere en model på computerskærmen.

Tænk på computerskærmen som et vindue ind i vores virtuelle verden. Vi sidder på den ene side af vinduet, og den virtuelle verden sidder på den anden. Figur 5 illustrerer dette koncept.

Figur 5: Vores vindue ind i den virtuelle verden

Der er mange måder at placere oplysningerne i modellen på vinduet (eller computerskærmen). Muligvis er det enkleste, hvad der kaldes en isometrisk projektion.

Da vores model har tre dimensioner, og computerskærmen kun har to, kan vi kortlægge modellen til skærmen ved først at fjerne z-koordinaten (den tredje af de tre koordinater) fra hvert punkt i modellen. Dette efterlader os med x- og y-koordinaterne for hvert punkt. X- og y-koordinaterne skaleres korrekt (baseret på enhedens modeller) og kortlægges til pixels på skærmen. Vi kan bruge disse trin til ethvert interessepunkt i modellen for at finde ud af, hvor den vises på skærmen.

Som det viser sig, er det ikke nødvendigt at transformere hvert punkt i vores model på denne måde. En af konsekvenserne af at have tilnærmet hver kant i modellen med linjesegmenter er, at vi virkelig kun behøver at transformere slutpunkterne for et linjesegment, ikke hvert punkt på linjesegmentet. Dette er sandt, fordi enkle fremspring (som en isometrisk projektion) altid omdanner linjesegmenter til linjesegmenter - linjesegmenter bliver ikke kurver. Derfor, når du først kender positionerne for de transformerede slutpunkter, kan vi bruge AWT's indbyggede linjetegningsrutiner til at tegne linjesegmentet selv.

Jeg tror, ​​et eksempel kan være i orden. Jeg skal oprette tre enkle modeller af samme form i forskellige retninger.

Tabel 1 indeholder de data, der beskriver en enkel form i sin første position. Hver række i tabellen svarer til en kant. Tabellen viser koordinaterne for kantens start- og slutpunkter. Lad os antage, at vi ser på formen udefra langs z-aksen.

SegmentBegyndeEnde
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
Tabel 1: Data for en enkel form - første position

Applet i figur 6 viser, hvad vi ville se.

Du har brug for en Java-aktiveret browser for at se denne applet.Figur 6: En enkel form - første position

Lad os nu dreje formen et par grader. Tabel 2 indeholder de data, der beskriver den samme form i sin anden position. Bemærk, at kun positionen og orienteringen har ændret sig, ikke formen.

SegmentBegyndeEnde
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
Tabel 2: Data for en enkel form - anden position

Applet i figur 7 viser, hvad vi ville se.

Du har brug for en Java-aktiveret browser for at se denne applet.Figur 7: En enkel form - anden position

Tre er en charme, så lad os dreje den en gang til - denne gang opad et par grader. Tabel 3 indeholder de data, der beskriver formen i dens tredje position.

SegmentBegyndeEnde
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
Tabel 3: Data for en enkel form - tredje position

Applet i figur 8 viser, hvad vi ville se.

Du har brug for en Java-aktiveret browser for at se denne applet.Figur 8: En enkel form - tredje position

Afslutter

Nu er du sandsynligvis kommet til den konklusion, at det ikke er meget sjovt at ændre orienteringen af ​​et objekt i hånden. Og resultatet er heller ikke særlig interaktivt. I næste måned viser jeg dig, hvordan du manipulerer objekter interaktivt (og vi får computeren til at gøre alt nummeret - trods alt er det ikke den type arbejdscomputere, der skal være god til?). Vi ser også på perspektivproblemet - især vil jeg vise dig, hvordan du kan indarbejde det i synspunkter på vores model.

Todd Sundsted har skrevet programmer, siden computere blev tilgængelige i stationære modeller. Selvom det oprindeligt var interesseret i at oprette distribuerede objektapplikationer i C ++, flyttede Todd til Java-programmeringssproget, da Java blev det oplagte valg for den slags ting. Todd er medforfatter af Java Language API SuperBible, nu i boghandlere overalt. Ud over at skrive er Todd præsident for Etcee, der leverer Java-centreret træning, mentoring og rådgivning.

Lær mere om dette emne

  • For en lille smule af alt relateret til 3D-grafik, se:

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

  • Yahoo giver en bekvem måde at starte din søgning på 3D-grafikemner

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

  • Du kan downloade denne artikel, kildekoden og klassefilerne som en gzipped tar-fil:

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

  • Tidligere vejledning til Java-artikler
  • "Når statiske billeder bare ikke klipper" - Lær hvordan du krydrer dine applets og applikationer

    med animerede billeder.

  • "Hvordan Java bruger producenten / forbrugermodellen til at håndtere billeder - En insiders udseende" - Lær mere om Java's kraftfulde billedhåndteringsteknik, og følg derefter mine enkle procedurer til at opbygge din egen producent og forbrugerkomponenter.
  • "Lær, hvordan applets indlæser netværksbaserede billeder asynkront" - Her ser du nøje på, hvordan Java-applets håndterer billeder i et netværksbaseret miljø.
  • "Det er let at tegne tekst med tre Java-klasser" - Find ud af, hvordan du opretter tekst, der er visuelt tiltalende gennem denne forklaring på, hvilke klasser der skal bruges, og hvordan de arbejder sammen.
  • "Undersøgelse af HotSpot, et objektorienteret tegningsprogram" - Lær, hvordan stykkerne i Java-sproget og klassebiblioteket passer sammen gennem en undersøgelse af denne Java. program
  • "Brug af grafikklassen" - Et nøje kig på grafikklassen og de tegningsprimitiver, den giver, og en demonstration af brugen.
  • "Observer and Observable" - En introduktion til Observer-interface og Observable-klasse ved hjælp af Model / View / Controller-arkitekturen som vejledning.
  • "Den effektive brugergrænseflade" - En introduktion til Observer-interface og Observable-klasse ved hjælp af Model / View / Controller-arkitekturen som vejledning.
  • "Java og begivenhedshåndtering" - Hvordan begivenheder overføres til brugergrænsefladekomponenter, hvordan man opretter begivenhedshåndterere og mere.
  • "Introduktion til AWT" - En beskrivelse af Java's værktøjssæt til brugergrænseflade.

Denne historie, "3D computergrafik: Model din verden" blev oprindeligt udgivet af JavaWorld.