Page 1 of 1

---

Posted: Wed Jan 18, 2012 2:20 am
by seancarrion
---

Re: 3D CoolBasicilla?

Posted: Wed Jan 18, 2012 4:41 am
by koodaaja
3D ei vaadi mitään erityisiä komentoja, esimerkiksi kyseinen naama on piirretty vanhalla tutulla box-komennolla. Renderöintihän on loppujen lopuksi samaa hommaa, ennen varsinaista piirtokomentoa täytyy vain suorittaa jonkun verran projisointiin, piirtojärjestykseen, valaistukseen ja sen semmoiseen liittyviä laskutoimituksia.

Käytännössä kannattaa tallentaa taulukko kolmioista tai verteksitauluun osoittava taulukko kolmioiden kulmien indekseistä, järjestää se kolmion keskimääräisen z-arvon perusteella ja piirtää kolmiot takaa eteenpäin lukituilla viivoilla - Line on vähintään tsiljoona kertaa nopeampi lukittuun pintaan. Lisäksi hommaan voi ympätä kolmioiden normaaleihin perustuvan zcullin eli tarkistuksen siihen, onko kolmio kameraan päin vai siitä poispäin ja poistaa ne, jotka eivät kuitenkaan näkyisi. Valaistuksenkin voi lisätä jos viitsii, se näyttää varsin kivalta.

Pieniä perusteita voi lukea jonkun verran lisää ikiwanhasta 3D-tutostani, se on tosin kovin vanhentunut ja pitäisi kirjoittaa uusiksi tai ainakin jatkaa jotta siitä olisi kunnon hyötyä. Efketitopikista löytää myös paljon helmiä, joiden koodia tutkiskelemalla paljastunee paljon uutta. 3D:stä ja CB-piirtelystä yleensä.

Re: 3D CoolBasicilla?

Posted: Wed Jan 18, 2012 10:03 am
by axu
Hyödyllistä on aina opetella koodaajan mainitsemat asiat, tosin 3D-pelin tekoon ei nykyinen CB hyvin sovellu piirto- ja laskunopeutensa vuoksi. Muistaakseni joku oli joskus tekemässä/tehnyt 3D shooterin...

Re: 3D CoolBasicilla?

Posted: Wed Jan 18, 2012 10:50 am
by koodaaja
Mgz teki aikanaan Shadow Squadin (ja mahdollisesti jatko-osan?) joka oli alkuperäisten Doomien tapainen raycastattu FPS-räiskintä. Sama mies kirjoitti omiin CB-suosikkeihini kuuluvat Top Lander -pelit, jotka taisivat olla ensimmäisiä 3D-pelejä CB:llä. Kannattaa tutustua.

Re: 3D CoolBasicilla?

Posted: Wed Jan 18, 2012 11:19 am
by MaGetzUb
Eipä 3D ole sen vaikeampaa, kuin ensin laskea z-kerroin (aka. syvyyskerroin) ja sitten sillä kertoa koordinaatteja syvyyden mukaan. :)
Tyyliin:

Code: Select all

Const NaytonLeveys = 640
Const NaytonKorkeus = 480

SCREEN NaytonLeveys, NaytonKorkeus
x# = 0
y# = 0
z# = 256

Repeat
    //Tiedot näyttöön...
    ClearText 
    AddText "Ohjaa laatikkoa nuolilla"
    AddText "Säädä laatikon syvyyttä w/s"
    AddText ""
    AddText "Koordinaatit: "
    AddText "x: "+x#
    AddText "y: "+y#
    AddText "z: "+z#
    
    //Laatikon ohjaus
    x# = x# + 2*(RightKey() -  LeftKey()) //Laatikon kaksiulotteinen liikuttelu 
    y# = y# + 2*(UpKey() -  DownKey()) //Laatikon kaksiulotteinen liikuttelu 
    z# = z# + 2*(KeyDown(cbkeyW) -  KeyDown(cbkeyS)) //Laatikon kaksiulotteinen liikuttelu 
    
    
    //Jos z on enemmäin kun nolla, niin piirretään ja lasketaan projektio 
    If z# > 0 Then 
        s_z# = 1.0/z# //<- s_z == syvyyskerroin
        //Projisoidaan 3D-illuusio ja lasketaan piirtokoordinaatit   
        s_x# = x#*s_z# * 500 //500 on melko selkeä kerroin 
        s_y# = y#*s_z# * 500 
        s_w# = 5 * s_z# * 500
        s_h# = 5 * s_z# * 500
        //Piirretään laatikko
        Box NaytonLeveys/2 - s_w#/2 + s_x#, NaytonKorkeus/2 - s_h#/2 - s_y#, s_w#, s_h# 
    EndIf 
    
DrawScreen
Forever

Kolmiulotteisessa ympäristössä pyöriskeleminen onkin sitten vähän hankalempaa, ja siihen tarvitsee kvaterniota, jota en ole itse vielä opiskellut kunnolla. koodajan 3D-tutossa on kyllä kyseisestä asiasta puhetta. ;)