Ohjelmointi

3D-tietokonegrafiikka: mallintaa maailmaa

Tutki maailmaa

Sikäli kuin tiedän, emme voi vain pitää kiinni maailmastamme suoraan tietokoneen sisällä (joka tapauksessa vahingoittamatta tietokonetta). Parasta mitä voimme tehdä, on luoda tietokonemalli maailmastamme. Kun otetaan huomioon tämä rajoitus, miten voimme mallintaa jotain esimerkiksi tuolia?

Maailman esineillä on ominaisuuksia tai ominaisuuksia, kuten muoto, koko, paino, sijainti, suunta ja väri (ja luetteloa voidaan jatkaa ja jatkaa). Tarkastellaan hetken vain niiden muotoa, asemaa ja suuntaa - näitä ominaisuuksia me kutsumme tila ominaisuudet. Ja aloitetaan jotain helpompaa työskennellä kuin tuoli - esimerkiksi kuutio.

Katso kuvan 1 kuvaa. Siinä näkyy kuutio, joka istuu muuten tyhjässä huoneessa. (No ok, huoneessa on myös ovi, mutta se on vain siksi, että huone näyttää enemmän huoneelta.)

Kuva 1: Huone, jossa on kuutio

Kuution muodon, sijainnin ja suunnan määrittämiseksi meidän on määritettävä kunkin sen kulman sijainti. Sen tekemiseksi me voisi käytä tällaista kieltä:

Ensimmäinen kulma on jalka (tai metri, jos haluat) lattian yläpuolella ja kaksi ja puoli jalkaa (tai metriä) takanani olevasta seinästä. Toinen kulma on myös jalka lattian yläpuolella ja jalka seinältä vasemmalla puolellani.

Huomaa, että molemmat kulmat määriteltiin suhteessa johonkin muuhun (seinä ja / tai lattia). Tietokonemallissamme me voisi määritä lattia ja seinä ja käytä niitä vertailukohteina, mutta osoittautuu paljon helpommaksi valita vain yksi vertailupiste (jota kutsumme alkuperää) ja käytä sitä sen sijaan. Alkuperäämme varten käytämme kahden seinän ja lattian muodostamaa kulmaa. Kuva 2 osoittaa alkuperämme sijainnin.

Kuva 2: Alkuperä ja koordinaatti-akseli

Nyt meidän on ilmoitettava, missä kukin kulma sijaitsee alkuperän suhteen. Voit määrittää polun alkuperästä kuution kulmaan monin tavoin. Yksinkertaisuuden vuoksi meidän on sovittava standardista. Tehdään seuraava:

Kuvittele, että jokaiselle seinän ja seinän tai seinän ja lattian leikkauksen muodostamalle reunalle annetaan nimi - kutsumme niitä x-akseli, y-akseli, ja z-akseli, kuten kuvassa 2 on esitetty. Ja sovitaan myös etukäteen, että määritämme kulman sijainnin seuraamalla tätä reseptiä:

  • Mittaa ensin, kuinka pitkälle meidän on mentävä origosta suoralla viivalla, joka on yhdensuuntainen x-akselin kanssa
  • Mittaa sitten, kuinka pitkälle meidän on mentävä tästä pisteestä suoralla linjalla y-akselin kanssa
  • Mittaa lopuksi, kuinka pitkälle meidän on mentävä tästä pisteestä suoralla linjalla z-akselin kanssa

Kuvassa 3 on polku, jota seuraamme päästäksesi kuution kulmaan.

Kuva 3: Polun löytäminen

Kirjoita lyhytmerkintänä kaikki nämä etäisyydet seuraavasti:

  • Etäisyys origosta x-akselin suuntainen
  • Etäisyys aloituskohdasta y-akselin suuntainen
  • Etäisyys origosta yhdensuuntainen z-akselin kanssa

tai (vielä lyhyempi):

(etäisyys x, etäisyys y, etäisyys z) 

Tätä arvojen kolmikkoa kutsutaan kulmaksi koordinaatit. Voimme määrittää kunkin kulman sijainnin avaruudessa samalla tavalla. Saatamme esimerkiksi huomata, että tässä esimerkissä olevan kuution kulmat ovat:

(3 jalkaa, 1 jalka, 2 jalkaa)

tai

(3 jalkaa, 1 jalka, 3 jalkaa)

tai

(4 jalkaa, 1 jalka, 2 jalkaa)

ja niin edelleen.

Mittayksiköt (esimerkiksi jalat tai metrit) eivät ole tärkeitä tarkoituksemme kannalta. Tärkeää on, kuinka yksiköt kartoittavat näytön kiinteistöjen vakioyksikön - pikselin. Puhun enemmän siitä kartoituksesta vähän myöhemmin.

Vähän ärtyisä

Kuution kulmien sijainti määrää kuution sijainnin ja suunnan. Kuitenkin annettu vain sen kulmien koordinaatit, emme voi rekonstruoida kuutiota (vielä vähemmän tuolia). Meidän on todella tiedettävä, missä reunat ovat, koska reunat määräävät muodon.

Kaikilla reunoilla on yksi erittäin hieno ominaisuus - ne alkavat ja päättyvät aina kulmista. Joten, jos tiedämme missä kaikki reunat ovat, tiedämme varmasti missä kaikki kulmat ovat.

Nyt teemme yhden suuren yksinkertaistavan oletuksen. Maailmamallissamme aiomme kieltää kaarevat reunat (opit miksi myöhemmin); reunojen on aina oltava suoria. Kaarevien reunojen arvioimiseksi asetamme suorat reunat päästä päähän, kuten kuvassa 4.

Kuva 4: Käyrän likiarvo

Reunoista tulee tällöin vain yksinkertaisia ​​viivasegmenttejä. Ja viivasegmentit määritetään niiden alku- ja loppupisteiden koordinaateilla. Siksi objektin malli ei ole muuta kuin kokoelma viivan segmenttejä, jotka kuvaavat sen muotoa.

Visualisointi: Se ei ole enää vain rentoutumista varten

Nyt kun tiedämme kuinka mallintaa objekti, olemme valmiita ratkaisemaan ongelman edustaa mallia tietokoneen näytöllä.

Ajattele tietokoneen näyttöä ikkunana virtuaalimaailmaan. Istumme ikkunan toisella puolella ja virtuaalimaailma toisella puolella. Kuva 5 kuvaa tätä käsitettä.

Kuva 5: Ikkunamme virtuaalimaailmaan

On monia tapoja sijoittaa tiedot malliin ikkunaan (tai tietokoneen näyttöön). Mahdollisesti yksinkertaisin on mitä kutsutaan isometrinen projektio.

Koska mallissamme on kolme ulottuvuutta ja tietokoneen näytöllä on vain kaksi, voimme yhdistää mallin näytölle poistamalla ensin z-koordinaatin (kolmannen kolmesta koordinaatista) mallin jokaisesta pisteestä. Tämä jättää meille x- ja y-koordinaatit jokaiselle pisteelle. X- ja y-koordinaatit skaalataan asianmukaisesti (mallin yksikköjen perusteella) ja kartoitetaan näytön pikseleihin. Voimme käyttää näitä vaiheita mihin tahansa mielenkiintoiseen malliin saadaksesi selville, missä se näytetään näytöllä.

Kuten käy ilmi, se ei ole välttämätöntä muuttaa jokainen piste mallissamme tällä tavalla. Yksi seurauksista siitä, että mallin jokaisen reunan on lähennetty linjasegmenteillä, on se, että meidän on todella muunnettava vain viivasegmentin päätepisteet, ei jokainen piste linjasegmentillä. Tämä pitää paikkansa, koska yksinkertaiset projektiot (kuten isometrinen projektio) muuttavat viivasegmentit aina viivasegmenteiksi - linjasegmenteistä ei tule käyriä. Siksi, kun tiedät muunnettujen päätepisteiden sijainnit, voimme käyttää AWT: n sisäänrakennettuja linjapiirustuksia itse linjasegmentin piirtämiseen.

Mielestäni esimerkki saattaa olla kunnossa. Aion luoda kolme yksinkertaista samaa muotoista mallia eri suuntiin.

Taulukko 1 sisältää tiedot, jotka kuvaavat yksinkertaista muotoa sen ensimmäisessä sijainnissa. Jokainen taulukon rivi vastaa reunaa. Taulukko antaa reunan alku- ja loppupisteen koordinaatit. Oletetaan, että katsomme muotoa ulospäin z-akselia pitkin.

SegmenttiAlkaaLoppu
xyzxyz
A250-702535-35
B2535-352500
C250025-35-35
D.25-35-35250-70
E250-70-250-70
F-250-70-2535-35
G-2535-35-2500
H-2500-25-35-35
Minä-25-35-35-250-70
Taulukko 1: Yksinkertaisen muodon tiedot - ensimmäinen sijainti

Kuvan 6 sovelma näyttää mitä näemme.

Tarvitset Java-yhteensopivan selaimen nähdäksesi tämän sovelman.Kuva 6: Yksinkertainen muoto - ensimmäinen asento

Kierretään nyt muotoa muutama aste. Taulukko 2 sisältää tiedot, jotka kuvaavat samaa muotoa sen toisessa sijainnissa. Huomaa, että vain sijainti ja suunta ovat muuttuneet, eivät muoto.

SegmenttiAlkaaLoppu
xyzxyz
A450-583435-25
B3435-252307
C230734-35-25
D.34-35-25450-58
E450-58-20-74
F-20-74-1235-41
G-1235-41-230-7
H-230-7-12-35-41
Minä-12-35-41-20-74
Taulukko 2: Yksinkertaisen muodon tiedot - toinen sijainti

Kuvan 7 sovelma näyttää mitä näemme.

Tarvitset Java-yhteensopivan selaimen nähdäksesi tämän sovelman.Kuva 7: Yksinkertainen muoto - toinen asento

Kolme on viehätys, joten käännetään sitä vielä kerran - tällä kertaa muutama aste ylöspäin. Taulukko 3 sisältää tiedot, jotka kuvaavat muotoa sen kolmannessa asemassa.

SegmenttiAlkaaLoppu
xyzxyz
A45-26-523419-38
B3419-382336
C233634-42-6
D.34-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
Minä-12-49-20-2-33-66
Taulukko 3: Yksinkertaisen muodon tiedot - kolmas sijainti

Kuvan 8 sovelma näyttää mitä näemme.

Tarvitset Java-yhteensopivan selaimen nähdäksesi tämän sovelman.Kuva 8: Yksinkertainen muoto - kolmas asento

Käärimistä

Nyt olet todennäköisesti tullut siihen tulokseen, että kohteen suunnan muuttaminen käsin ei ole kovin hauskaa. Eikä tulos ole kovin interaktiivinen. Ensi kuussa näytän sinulle, miten esineitä voidaan käsitellä vuorovaikutteisesti (ja me saamme tietokoneen suorittamaan kaikki numeromurskaukset - eikö olekin loppujen lopuksi työtietokoneiden tyyppisiä?) Tarkastelemme myös näkökulman ongelmaa - näytän erityisesti kuinka sisällyttää se mallimme näkymiin.

Todd Sundsted on kirjoittanut ohjelmia siitä lähtien, kun tietokoneita oli saatavana työpöydän malleina. Vaikka Todd oli alun perin kiinnostunut hajautettujen objektisovellusten rakentamisesta C ++: ssa, Todd muutti Java-ohjelmointikielelle, kun Java tuli itsestään selväksi valinnaksi sellaiselle. Todd on Java Language API SuperBible -kirjoittaja, joka on nyt kirjakaupoissa kaikkialla. Kirjoittamisen lisäksi Todd on Etceen presidentti, joka tarjoaa Java-keskitettyä koulutusta, mentorointia ja konsultointia.

Lisätietoja tästä aiheesta

  • Jos haluat lisätietoja kaikesta 3D-grafiikkaan liittyvästä, katso:

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

  • Yahoo tarjoaa kätevän tavan aloittaa 3D-grafiikan aiheiden haku

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

  • Voit ladata tämän artikkelin, lähdekoodin ja luokkatiedostot gzip-tar-tiedostona:

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

  • Aiemmat Java-ohjeet
  • "Kun staattiset kuvat eivät vain tee leikkausta" - Opi piristämään sovelmia ja sovelluksia

    animoituja kuvia.

  • "Kuinka Java käyttää tuottaja- / kuluttajamallia kuvien käsittelemiseen - sisäpiiriläisen ilme" - Lue lisää Java: n tehokkaasta kuvankäsittelytekniikasta ja noudata sitten yksinkertaisia ​​ohjeita omien tuottaja- ja kuluttajaosien rakentamiseen.
  • "Opi, kuinka sovelmat lataavat verkkopohjaisia ​​kuvia asynkronisesti" - Tässä on tarkka tapa, jolla Java-sovelmat käsittelevät kuvia verkkopohjaisessa ympäristössä.
  • "Tekstin piirtäminen on helppoa kolmen Java-luokan avulla" - Selvitä visuaalisesti houkuttelevan tekstin luominen tämän selityksen avulla siitä, mitä luokkia käytetään ja miten ne toimivat yhdessä.
  • "Tarkastelemalla HotSpotia, olio-piirustusohjelmaa" - Opi kuinka Java-kielen ja luokkakirjaston osat sopivat yhteen tämän Java-tutkimuksen avulla. ohjelmoida
  • "Grafiikkaluokan käyttäminen" - Tarkka grafiikkaluokka ja sen tarjoamat piirustus primitiivit sekä osoitus sen käytöstä.
  • "Tarkkailija ja havainnoitava" - Johdanto tarkkailijan käyttöliittymään ja havaittavaan luokkaan mallin / näkymän / ohjaimen arkkitehtuurin avulla.
  • "Tehokas käyttöliittymä" - Johdanto Observer-käyttöliittymään ja Observable-luokkaan mallin / näkymän / ohjaimen arkkitehtuurin avulla.
  • "Java ja tapahtumien käsittely" - miten tapahtumat välitetään käyttöliittymäkomponenteille, miten luoda tapahtumankäsittelijöitä ja paljon muuta.
  • "Johdatus AWT: hen" - kuvaus Java-käyttöliittymän työkalupakista.

Tämän tarinan "3D-tietokonegrafiikka: mallintaa maailmaa" julkaisi alun perin JavaWorld.

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