cb3d - 3D Coolbasicilla

Jaa meneillään olevat projektisi tai valmiit pelit muun yhteisön kanssa täällä.
Post Reply
Untitled.bmp
Member
Posts: 52
Joined: Sat May 12, 2012 7:11 pm
Location: C:/WINDOWS/system32

cb3d - 3D Coolbasicilla

Post by Untitled.bmp »

Ennen cbE:tä olen kauan miettinyt tälläista, mutta homman on laittanut paskaksi cb:n tehon puute, mutta cbE muutti kaiken. Avasin editorin ja aloin kehitellä piirtokomentoihin ja matematiikkaan keskittyvää 3D-moottoria Koodaajahan jo teki tällaisen, mutta silloinpa ei ollut käytössä nykyajan huippuaseita, kuten cbE ;) 3D-moottori siis mahdollistaa melko alkeelliset 3D-pelit. Tähän asti suunnittelemani 3D-moottorilla ei saada edes perus FPS-peliä(Liiku ja tapa), mutta, jos tämä edistyy, niin voin/voimme ainaki YRITTÄÄ tehdä sellaisen 3D-moottorin joka mahdollistaa moisen. Tällä saa ihan hyvin, vaikka autopelin tehtyä, jos tämä valmistuu.

Tarkoitus oli laitta screenshottia, mutta muutaman ratkaisevan virheen(Funktiot leikattu, sitten katosivat, kun vahingossa copypastesin muutamia koordinaatteja..) Auttavia käsiä olisi mukava saada,tarvitaan matematiikan taitajaa(geometrian, edes sen perusasiat olisi mukava hallita) ja koodinaputtelijoitakin saa tulla auttamaan. Viestitys tavat ovat mese,IRC,YV(ei mielellään, koska voi tulla isokin lössi) ja Skype.

Jos saamme 3D-moottorin valmiiksi tai edes jonkinlaiseen toiminta kuntoon, voisimme tehdä jonkinlaisen pelin. ;)

Niin ja kiitos TOSI PALJON Nille, jotka mahdollistivat tämän projektin aloituksen, eli cbE:n kanssa verta itkien painineet urheat koodisoturimme :D
Intel core i7 3960X 3,9ghz 15mb
Sapphire Radeon HD7970
160gb ssd
2tb hdd
8gb Ram
Windows 7 Ultimate 64-bit & Linux Ubuntu 12.04LTS
User avatar
esa94
Guru
Posts: 1855
Joined: Tue Sep 04, 2007 5:35 pm

Re: cb3d - 3D Coolbasicilla

Post by esa94 »

cbSDK toteuttaa jo ihan mukavasti 3D-funktiot. (Tai cbFun?)

En tosin tiedä missä sitä nykyään hostataan, jos missään.
Viltzu
Guru
Posts: 1132
Joined: Sun Aug 26, 2007 5:45 pm
Location: Alavieska
Contact:

Re: cb3d - 3D Coolbasicilla

Post by Viltzu »

esa94 wrote:cbSDK toteuttaa jo ihan mukavasti 3D-funktiot. (Tai cbFun?)

En tosin tiedä missä sitä nykyään hostataan, jos missään.
Kyllä. cbSDK juurikin tukee .obj tiedostoja.
K-Peleistä löytyypi cbSDK. http://www.kpelit.fi/?c=1633 ja jos haluaa niille syntaksivärjäyksen ja että komennon selitys avautuu klikkaamalla: viewtopic.php?p=47903#p47903
Last edited by Viltzu on Sat Jun 16, 2012 10:37 pm, edited 1 time in total.
User avatar
axu
Devoted Member
Posts: 854
Joined: Tue Sep 18, 2007 6:50 pm

Re: cb3d - 3D Coolbasicilla

Post by axu »

Untitled.bmp wrote:Tähän asti suunnittelemani 3D-moottorilla ei saada edes perus FPS-peliä(Liiku ja tapa), mutta, jos tämä edistyy, niin voin/voimme ainaki YRITTÄÄ tehdä sellaisen 3D-moottorin joka mahdollistaa moisen. Tällä saa ihan hyvin, vaikka autopelin tehtyä, jos tämä valmistuu.
Ihan vain sivuhuomautuksena, FPS on helpoin kolmiulotteisista genreistä (kameran ja hahmon ohjaamisen suhteen). Autopelit lienevät sieltä hankalemmasta päästä (sitten kun kameran saa jotenkuten toimimaan, auton fysiikat kolmessa ulottuvuudessa menee tod. näk. kyli hilseen ainakin itselläni).

Tässä joskus aikoinani tekemäni pieni 3D-moottori, muistaakseni toimi ihan hyvin. Maailmaan pystyy lisäämään pisteitä ja viivoja, ja ne piirretään keskitetysti:

Code: Select all

Global CamX#, CamY#, CamZ#, CamA#, CamP#, CamR#
Global ZPROJ#
ZPROJ = 270.0
Global ScreenWd2, ScreenHd2
ScreenWd2 = ScreenWidth() / 2 : ScreenHd2 = ScreenHeight() / 2

Type Line3D
    Field X1#
    Field Y1#
    Field Z1#
    Field X2#
    Field Y2#
    Field Z2#
    Field ColR
    Field ColG
    Field ColB
EndType

Type Dot3D
    Field X#
    Field Y#
    Field Z#
    Field Pixel
EndType

Function AddDot(X#, Y#, Z#)
    nD.Dot3D = New(Dot3D)
    nD\X = X : nD\Y = Y : nD\Z = Z
    nD\Pixel = getRGB(BLUE) + (getRGB(GREEN) Shl 8) + (getRGB(RED) Shl 16) - 16777216
    Return ConvertToInteger(nD)
EndFunction

Function AddLine(X1#, Y1#, Z1#, X2#, Y2#, Z2#)
    nL.Line3D = New(Line3D)
    nL\X1 = X1 : nL\Y1 = Y1 : nL\Z1 = Z1
    nL\X2 = X2 : nL\Y2 = Y2 : nL\Z2 = Z2
    nL\ColR = getRGB(RED) : nL\ColG = getRGB(GREEN) : nL\ColB = getRGB(BLUE)
    Return ConvertToInteger(nL)
EndFunction

Function Draw3D()
    'Lock
        For iL.Line3D = Each Line3D
            a# = GetAngle(0, 0, iL\X1 - CamX, iL\Z1 - CamZ)
            d# = Distance(0, 0, iL\X1 - CamX, iL\Z1 - CamZ)
            X1# = Cos(a# - CamA) * d#
            Z1# =-Sin(a# - CamA) * d#
            
            a# = GetAngle(0, 0, iL\X2 - CamX, iL\Z2 - CamZ)
            d# = Distance(0, 0, iL\X2 - CamX, iL\Z2 - CamZ)
            X2# = Cos(a# - CamA) * d#
            Z2# =-Sin(a# - CamA) * d#
            
            a# = GetAngle(0, 0, Z1#, iL\Y1 - CamY)
            d# = Distance(0, 0, Z1#, iL\Y1 - CamY)
            Z1# = Cos(a# - CamP) * d#
            Y1# =-Sin(a# - CamP) * d#
            
            a# = GetAngle(0, 0, Z2#, iL\Y2 - CamY)
            d# = Distance(0, 0, Z2#, iL\Y2 - CamY)
            Z2# = Cos(a# - CamP) * d#
            Y2# =-Sin(a# - CamP) * d#
            
            a# =-GetAngle(0, 0, X1#, Y1#)
            d# = Distance(0, 0, X1#, Y1#)
            X1# = Cos(a# - CamR) * d#
            Y1# = Sin(a# - CamR) * d#
            
            a# =-GetAngle(0, 0, X2#, Y2#)
            d# = Distance(0, 0, X2#, Y2#)
            X2# = Cos(a# - CamR) * d#
            Y2# = Sin(a# - CamR) * d#
            If Z1# > 0 Or Z2# > 0 Then
                Z1# = Max(1, Z1#) / ZPROJ
                X1# = (X1# / Z1#) + ScreenWd2
                Y1# =-(Y1# / Z1#) + ScreenHd2
                Z2# = Max(1, Z2#) / ZPROJ
                X2# = (X2# / Z2#) + ScreenWd2
                Y2# =-(Y2# / Z2#) + ScreenHd2
                
                Color iL\ColR, iL\ColG, iL\ColB
                Line X1#, Y1#, X2#, Y2#
            EndIf
        Next iL
        
        For iD.Dot3D = Each Dot3D
            a# = GetAngle(0, 0, iD\X - CamX, iD\Z - CamZ)
            d# = Distance(0, 0, iD\X - CamX, iD\Z - CamZ)
            X1# = Cos(a# - CamA) * d#
            Z1# =-Sin(a# - CamA) * d#
            
            a# = GetAngle(0, 0, Z1#, iD\Y - CamY)
            d# = Distance(0, 0, Z1#, iD\Y - CamY)
            Z1# = Cos(a# - CamP) * d#
            Y1# =-Sin(a# - CamP) * d#
            
            a# =-GetAngle(0, 0, X1#, Y1#)
            d# = Distance(0, 0, X1#, Y1#)
            X1# = Cos(a# - CamR) * d#
            Y1# = Sin(a# - CamR) * d#
            
            If Z1# > 0 Then
                Z1# = Max(1, Z1#) / ZPROJ
                X1# = Int( (X1# / Z1#) + ScreenWd2)
                Y1# = Int(-(Y1# / Z1#) + ScreenHd2)
                If X1# > 0 And Y1# > 0 And X1# < ScreenWd2*2 - 1 And Y1# < ScreenHd2*2 Then PutPixel2 X1#, Y1#, iD\Pixel
            EndIf
        Next iD
    'Unlock
    
EndFunction

Function MoveCamera3D(cX#, cY#, cZ#)
    CamX = CamX + Cos(CamA) * cX - Cos(CamP) * Sin(CamA) * cZ + Sin(CamP) * Sin(CamA) * cY
    CamY = CamY + Sin(CamP) * cZ + Cos(CamP) * cY
    CamZ = CamZ - Sin(CamA) * cX - Cos(CamP) * Cos(CamA) * cZ + Sin(CamP) * Cos(CamA) * cY
End Function
CamA on pystysuoran akselin suhteen pyöriminen (angle), CamP on ylös/alas katsominen (pitch) ja CamR on pyöritys (roll).

En ota vastuuta mahdollisesti täysin väärästä tavasta laskea näitä hommia, koko moottori on rakennettu lukematta mitään aiheesta.
Jos tämä viesti on kirjoitettu alle 5 min. sitten, päivitä sivu. Se on saattanut jo muuttua :roll:
Image
Untitled.bmp
Member
Posts: 52
Joined: Sat May 12, 2012 7:11 pm
Location: C:/WINDOWS/system32

Re: cb3d - 3D Coolbasicilla

Post by Untitled.bmp »

Ihan vain sivuhuomautuksena, FPS on helpoin kolmiulotteisista genreistä (kameran ja hahmon ohjaamisen suhteen). Autopelit lienevät sieltä hankalemmasta päästä (sitten kun kameran saa jotenkuten toimimaan, auton fysiikat kolmessa ulottuvuudessa menee tod. näk. kyli hilseen ainakin itselläni).
On olemassa monen laisia 3D-autopelejä, esimerkiksi sellaisia, joissa auto liikkuu suoraan eteenpain ja kaantyy aina välillä ja, jos se törmää johonkin, se vain pysähtyy ja peruuttaa takaisin. Itselläni on todella vanhassa Nokian puhelimessa(Väritön näyttö, ei nettimahdollisuuksia) kyseenlainen autopeli. Ei tuo sinun 3D-moottori näyttänyt toimivan? Tai sitten vain en osannut käyttää sitä :lol: Näyttivät muuten pirun hienoilta nuo SDK:n 3D-funktiot :o Mietin, että pitäisikö yrittää luoda systeemi, joka kääntäisi 2D-kartan 3D ulottuvuudeksi. Mokoman toteutus voi kyllä mennä mahdottoman vaikeaksi, jos vain pysyisin siinä, että 3D-maailma rakennetaan kuvioista(tetraedrit,kuutiot jne). Luulisin, että tämän projektin vaikeimmaksi asiaksi tulee saada kamera toimimaan, jos halutaan kunnon kuutioita sinne maailmaan. Tarvitaan ainakin todellista matematiikan taitajaa.

Nyt pieni kysely, olisiko ketään kiinnostunutta tähän projektiin? Kuten aloitusviestissä sanoin, että tarvitsen koodareita ja mahdollista matematiikan jauhajaa. Ongelmia aiheuttaa myös cbE, sillä minulla ainakaan ei toimi ohjelmat, joissa käytetään enemmän, kuin yhtä piirtokomentoihin perustuvaa funktiota :? Ei ole kovin varmaan, riittävätkö normin cbE:n tehot pyörittämään tätä systeemiä. Ja sitten minua huolettaa se, että, jos tämä ei valmistu ennen Cbc:n ilmestymistä, niin tämän teko meni kyllä melko turhaksi, mutta mitäs siinä? Tehdään mielenkiinnon vuoksi, ei muiden hyödyksi >:D
Intel core i7 3960X 3,9ghz 15mb
Sapphire Radeon HD7970
160gb ssd
2tb hdd
8gb Ram
Windows 7 Ultimate 64-bit & Linux Ubuntu 12.04LTS
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: cb3d - 3D Coolbasicilla

Post by Latexi95 »

Itse asiassa cbSDK:ssa on myös yhdenlainen "3d-kartta" systeemi jossa taloissa on syvyys vaikutelmaa. Suosittelen hieman tutkimaan sitä.

Tietääkseni kuitenkaan CBC:hen ei tule 3d ominaisuuksia joten tuskimpa tämän tekeminen siltä kannalta turhaa on, mutta jos jossain vaiheessa saisin cbE:n C++ APIn tietyä niin kannattaisi tehdä mielummin OpenGL kirjasto CB:lle kuin tälläistä viritelmää, koska kuitenkaan tällä ei päästä kovin huikeisiin piirtonopeuksiin. ;)

Mutta tietysti mikäs siinä jos kiinnostaa. Saahan sitä tehdä ja on tuo oikein mielenkiintoinen juttu, mutta hyödyllisyydellä projektia ei ehkä voi perustella. :(
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: cb3d - 3D Coolbasicilla

Post by koodaaja »

Kameran luonti ei ole erityisen vaikeaa, pitää vain tehdä yksi funktio joka palauttaa matriisin kameran sijainnin, kameran suunnan ja ylös-suunnan perusteella. Tähän menee parisenkymmentä riviä, riippuen miten tiukasti sen haluaa toteuttaa. En usko että FPS-moottorikaan olisi erityisen mahdoton, se vain ei näyttäisi kovin hyvältä ja vaatisi hirvittävästi säätöä. Ylipäänsä säädön määrä on se syy, miksi CB:llä on niin vähän 3D-pelejä - itse asiat eivät ole vaikeita, mutta niiden optimointi ja perusteista lähtien koodailu vievät hirvittävästi aikaa.

EDIT: Tuo oma 3D-kirjoittelunihan huipentui lentelytestiin, josta ei mitään valmista koskaan tullut, mutta ihan kivan näköinen se on. Senkin alla on alkeellinen 3D-engine, josta pitäisi joskus kirjoitella parempi versio. Esimerkiksi yhden kolmion piirtävä funktio on huono ajatus, kannattaa mieluummin tehdä globaali taulukko tai type joka täytetään ja kutsutaan sitten yhtä koko listan rendaavaa funktiota, tulee ylimääräisista funktiokutsuista johtuvaa hidastelua paljon vähemmän.
Untitled.bmp
Member
Posts: 52
Joined: Sat May 12, 2012 7:11 pm
Location: C:/WINDOWS/system32

Re: cb3d - 3D Coolbasicilla

Post by Untitled.bmp »

Tuo oma 3D-kirjoittelunihan huipentui lentelytestiin, josta ei mitään valmista koskaan tullut, mutta ihan kivan näköinen se on. Senkin alla on alkeellinen 3D-engine, josta pitäisi joskus kirjoitella parempi versio. Esimerkiksi yhden kolmion piirtävä funktio on huono ajatus, kannattaa mieluummin tehdä globaali taulukko tai type joka täytetään ja kutsutaan sitten yhtä koko listan rendaavaa funktiota, tulee ylimääräisista funktiokutsuista johtuvaa hidastelua paljon vähemmän.
*Clapclapclap* Todella onnistunut engine :o Mikset ole tuota julkaissut? Tuollahan saisi juuri sen kuvailemani autopelin tehtyä. Ja sait tuon vielä toimimaan ilman paljoakaan pätkimistä. Hienoa! Hatunosto ja 10 pistettä sinulle tuosta, koodaaja. Mutta pientä tilannepäivitystä:

Edelleen tarvitsisin edelleen porukka mukaan, keksin myös miten voisin jonkin moisen 3D-previewrin tehdä, kyseessä olisi sellainen ohjelma, jolla voi katsella kolmiulotteista laattaa mistä tahansa kulmasta. Ongelmaksi tuli osaamattomuuteni: Huomasin osaavani paljon enemmän geometriaa kuin trigonometriaa. Oli tarkoitus nimittäin aluksi piirtää normaali, 2D-neliö viivoilla, neliötä voisi pyöritellä nuolinäppäimillä, 2D-pyörittely hoituisi trigonometrialla ja 3D-pyörittelylle ei tarvita muuta kuin nurkkien liikuttelua. Tämäkin sitten pitäisi saada toimimaan trigonometrian kanssa ilman mitään outouksia :roll: Edelleen tarvitsisin osaajia, joilla sujuu geometria JA trigonometria. Pitäisiköhän tällekin apurinhaulle tehdä oma aihe tiimin haku ja rakennus-aiheeseen-- Noilla laatoilla voisi myös rakentaa kaikki geometriset kappaleet, joiden tahkot olisivat neliöitä.
Intel core i7 3960X 3,9ghz 15mb
Sapphire Radeon HD7970
160gb ssd
2tb hdd
8gb Ram
Windows 7 Ultimate 64-bit & Linux Ubuntu 12.04LTS
User avatar
Sami The Great
Advanced Member
Posts: 485
Joined: Tue Aug 28, 2007 4:15 pm
Contact:

Re: cb3d - 3D Coolbasicilla

Post by Sami The Great »

Tämä tosiaan olisi ehkä jopa helpompi toteuttaa vaikka OpenGL:llä suoraan tekemällä dll. Siinä kun on jo valmiiksi piirtofunktiot esim. kolmiolle, jossa annetaan vain x,y,z koordinaatistossa pisteet ja loput hoituukin sitten kuin itsestään. Olisikin hienoa, jos CbE:hen saisi funktion, joka antaa ikkunan kahvan, jotta pystyisi helpommin lisäämään siihen erilaisia grafiikkaa hoitavia dll tiedstoja. Yksi idea olisi myös tehdä OGRE 3D:lle wrapperi, joka olisi oma dll, ja se pyörittäisi OGREa. Renderöinnin tulos voitaisiin jotenkin kasata Allegron layerille tai vastaavalle.
http://www.rockodilegames.com
CoolBasickin käyttäjä vuodesta 2004.
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: cb3d - 3D Coolbasicilla

Post by Latexi95 »

Sami The Great wrote:Tämä tosiaan olisi ehkä jopa helpompi toteuttaa vaikka OpenGL:llä suoraan tekemällä dll. Siinä kun on jo valmiiksi piirtofunktiot esim. kolmiolle, jossa annetaan vain x,y,z koordinaatistossa pisteet ja loput hoituukin sitten kuin itsestään. Olisikin hienoa, jos CbE:hen saisi funktion, joka antaa ikkunan kahvan, jotta pystyisi helpommin lisäämään siihen erilaisia grafiikkaa hoitavia dll tiedstoja. Yksi idea olisi myös tehdä OGRE 3D:lle wrapperi, joka olisi oma dll, ja se pyörittäisi OGREa. Renderöinnin tulos voitaisiin jotenkin kasata Allegron layerille tai vastaavalle.
Juu. Jonkinlainen cbE API C++:lle pitäisi tehdä, mutta minua mietityttää vain mitenkä linkkaus pitäisi hoitaa että DLL pääsisi käsiksi esimerkiksi cbE:n objekteihin ja stackin poppaukseen yms.
cbE tekee jo valmiiksikin allegron toimesta piirron OpenGL:llä joten OpenGL APIn tekeminen CB:lle ei olisi vaikeata jos saan tehtyä cbE:n tukemaan tuollaisia headerillisia custom funktioita DLL:lle ja annettua DLL:lle pääsyn cbE:n funktioihin.
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: cb3d - 3D Coolbasicilla

Post by koodaaja »

Itse olen aina ja jatkuvasti sitä mieltä että jos lähtee DLL:illä kikkailemaan niin voisi samantien siirtyä johonkin vähän tehokkaammin dataa murskaavaan kieleen. Yleisölle julkaisematon kgl-kirjastoni sisältää/sisälsi valmiin systeemin kolmioiden sorttaukseen ja piirtoon, matriisien sekä yhden suuntavalonlähteen käyttöön, eikä siinä hirvittävän paljoa koodia ollut. Armottoman hidas se tosin on.

Ja Untitled.bmp, kannattaa selailla efektitopikkia, sieltä löytyy monia hienoja koodinpätkiä ja onpa siellä muistaakseni linkki tuohonkin lentelytestiin. Suuria harppauksia polygonigrafiikassa aloin itse tehdä siinä vaiheessa kun eräs kaveri huomautti lukitun viivan olevan syystä tai toisesta huomattavasti lukitsematonta nopeampi, tätä kannattaa käyttää hyväkseen jos 3D:tä meinaa rendailla.
Post Reply