Eli eli, parin päivän nettisurffailun ja kaverien hiillostuksen jälkeen tulin tänne koettelemaan teitä pitkän matematiikan kävijöitä. Itselläni numerot jäi kesken, mutta tässä 3D-grafiikkaa ja koodailua harrastaessani olen joutunut opettelemaan yhtä jos toistakin. Nyt tuli seinä eteen kumminkin.
---->
Minulla on kaksi normalisoitua vektoria. Miten voin verrata niitä keskenään niin että saisin lopputulokseksi yhden luvun joka kuvastaa kuinka paljon vektorit eroaa toisistaan?
<----
Kiitoksia jos joku vaivautuu. Jatkan etsimistä sillä aikaa.
Edit: Ei tarvii enää. Juuri näin, heti kun kysyy foorumilta ongelma ratkeaa kuin itsestään. :)
"Miten paljon eroaa" on ehkä hieman epämääräinen käsite, mutta siihen yleensä käytetään erotusta eli vähennyslaskua. Normalisoitujen vektorien välisen kulman kosini puolestaan löytyy pistetulolla eli kertomalla komponenteittain ja laskemalla tulot yhteen.
Jees, heti kun löysin tuon pistetulon (dotproduct) ja crossproduct kaavan niin sain tehtyä funktion kätevästi. Kerrotaan nyt kun kerran tuli postattua tänne:
Funktioni ottaa nyt pistetulon vektorien väliltä ja muuttaa sen pienellä laskukaavalla prosenttiluvuksi (mitä suurempi kosini sitä enemmän vektorin suunta poikkeaa toisen vektorin suunnasta, eiks jeh).
Tein tämän funktion QBasiciin (frendi joka koodaa C++:aa is lost in time and space) jotta saan testattua uutta ideoimaani Sprite Normal-Mapping engineä (varmaan joku toinenkin on tehnyt tämän). Alkaa näyttää jo aika hyvältä. Voisin varmaan ensi viikolla postata aika tiukkaa settii miten 2D isometrisessä pelissä voidaan käyttää normal- ja offset-mäppejä laskemaan valoisuuksia ynnä muita ennen vain 3D-peleille ominaisia efektejä.
Tuota, jos kosini on 1, kyseessä on sama vektori, ja vastaavasti -1, niin vektorit ovat vastakkaissuuntaiset. Eli juuri päinvastoin.
"jos kosini on 1, kyseessä on sama vektori"
Tai siis saman suuntaiset.. pituus voi olla vielä eri.
msdos464, alkuperäisessä kysymyksessä vektorit olivat normalisoituja.
Uuups, joo tottakai. Kosini = 1 tarkoittaa samansuuntaista. Koska laskukaava tulee normal-mäppeihin niin jäi huomaamatta koko juttu koska 1 tarkoittaa että pixeli ei ota valoa (osoittaa poispäin valosta) ja -1 tarkoittaa että pixeli ottaa maksimivalon (osoittaa valon suuntaan).
Sain tekastua jo QuickBasicilla aika hienon normaali valotuksen lattiaan joka ottaa valonlähteen vektorin ruuduittain. Pitää katsoa jos saan iltaan mennessä per-pixel normaalivalotuksen niin voisin lähettää tutkimustyön tulokset huomenna teidän ihmeteltäväksenne.
Tässä screenshotti ruuduittain valotuksesta:
http://danankai.net/media/scrap/qhax.gif
Noniin, PerPixel valotus valmis. Lisätty myös kirkas alue valolle. Vois varmaan lopettaa tän topicin ja siirtyä ihan tonne koodauspuolelle.
Mjum, mjum, seuraavaksi seinät ja offset-mäppäys...
Näyttää hienolta. Vielä kun teet tuohon vaikka kiilto-mappauksen niin vaikka lasinen lattia heijastaa peilikuvan ukosta joka kävelee sen yli :) Voisi olla aika nätti ominaisuus.
Meitsi kirjoitti:
Näyttää hienolta. Vielä kun teet tuohon vaikka kiilto-mappauksen niin vaikka lasinen lattia heijastaa peilikuvan ukosta joka kävelee sen yli :) Voisi olla aika nätti ominaisuus.
Isometrisessä grafiikassa tuo "peilikuvan" tekeminen vaan ei onnistukaan niin helposti. Ylösalaisin kääntäminen tuo vaan sellaisen bugisen fiiliksen, jos tuohon lisää esim. ihmisiä (jalkojen heijastukset menevät miten sattuu).
Hyvältä näyttää! Ainakin minua kiinnostaa, miten tuollainen tehdään.
Okei, FPS 0.3 mutta ainakin toimii. Toisaalta en ole järin hyvä koodaaja. Minäkin mietin noita specular-, reflection- ja refraction-mäppejä, mutta niiden teho menee suurimmilta osin hukkaan kun kamera ei liiku. Pittee kattoo onko ne liian vaikeita/raskaita tehdä erikoisefekteiksi.
Tässä se nyt on. Kahden viikon aivomyrskyn ja kolmen päivän rankan koodaamisen ja tekstuurien tekemisen jälkeen (joojoo, ne on Doom kakkosesta fuxxoroituja), saanen esitellä teille:
"Done in QBasic 4.5, mit der AK-Lib for 1280x1024 resolution"
-Kirjotan design documentin ton enginen toimintamallista ja miten sitä tulisi jatkaa, mutta nyt on vähän sippi rankan ohjelmointiurakan jälkeen.
Varsin vakuuttavaa sinänsä, kerrankin joku oikeasti tekee jotakin eikä vain metelöi tulevasta 3D-sotapeliprojektihirvityksestään. Mutta aika tavanomainen 3D-systeemi tuo sinänsä on. Jos haluat joskus laittaa koodia esille tai selittää toimintaa noin teknisesti, niin kiinnostaisi kuulla tuon toteutuksesta. Itse taidan SW-valaistuksessa tyytyä laskemaan polygonien kulmat, kun OpenGL osaa kuitenkin vetää ne sitten liukuvärisiksi sillä perusteella.
Valaistuksen voimakkuus on tyypillisesti pinnan normaalin ja valoa kohti osoittavan vektorin pistetulo jaettuna etäisyyden neliöllä. Jotakin optimointia vain kaivataan, jotta laskenta sujuisi sutjakkaammin.
Jos tuon kääntäisi QBasicista C/C++:saksi ja käyttäisi grafiikkaan vaikka SDL:lää, voisi fps nousta aika reippaasti. Tietenkin tuollainen onnistuisi sitten myös käyttäen valmiita rajapintoja. OpenGL ja DirectX kait tukevat noita efektejä suoraan, joten luultavasti riittäisi vain niiden päällekytkeminen ja asetuksien viilaus, laitteistokiihdytys astuisi tällöin myös kehiin. Tällöin kyllä menisi koodaustyötä hukkaan, mutta tuotahan voisi soveltaa vaikka selain java-appletissa (saako selain-javassa hw kiihdytyksiä?)
Pikselivalaistusta ei taida noista ihan suoraan löytyä, tai ainakin se on hyvin heikoilla. OpenGL:n sisäinen valaistusjärjestelmä ei tue kuin kahdeksaa valoa, mikä ei kunnon peleissä riitä minnekään, noista kun joutuu vielä kaksi käyttämään ympäristö- ja hajavaloon. Valaistus täytyy siis itse kirjoittaa GLSL:ää tai vastaavaa varjostinkieltä käyttäen, jotta sen saa rautapuolelle.
Täytyy myöntää, että hyvältä näyttää! Ja kuten Metabolix aikaisemmin ilmoitti, mukava nähdä tämmöistä, että saadaan oikeasti jotain aikaiseksi, kuin noita "3D-sotapeliprojektihirvityksiä". ;)
Mitäköhän mun serverille tapahtui? Itseasiassa mitä koko Introitelle tapahtui? Joudun sortumaan ilmaispalveluihin, hyi.
Okei, viimeinen testi: Objektit. Tämähän toimii kuin junan vessa. Minulta ei puutu muuta kuin plugini tai tekniikka 3D-Maxiin jolla saisin noita korkeuskarttoja näppärästi (testiversion korkeuskartat ovat kivuliaasti maalattu pixeli pixeliltä, usko tai älä). Pitää kokeilla jos Mental Ray'tä sais fuxxoroitua vähän. Kun sen saan on visuaalinen tuotantolinjani valmiina.
Joo OpenGL:n tai Direct3D:n kautta vois saada näyttökortit laskemaan noita normaalivektoreita ainakin. Vissiin. Ehkä... mutta sehän olisi vastoin isometrisen 2D pelin etiikkaa. Ei tarvitse FPS:stä huolehtia sen jälkeen kunhan QuickBasicista on päästy.
Nyt ei muuta kuin Design Documenttia kirjottaa, aloitan päivän parin päästä saalistamaan ihmisiä jotka osaavat C-kieltä ja ovat innostuneita uudenlaisen retro-enginen kehittämisestä. Homman ideana se, että jos he aluksi tekisivät tämän Ceelle ja jatkavat sitten sen kehittämistä (itselläni loppui laskupää tähän). Minä aloitan tekstuurien ja spraittien takomisen. Niin no miksei myös lisää ihmisiä jotka osaavat tehdä contentia (kuvaa, ääntä, jne)...
Kahtellaan mitä saadaan aikaiseksi.
Hieno on. Varjot objekteille voisi olla myös asiallinen feature. Ihan perus varjothan saisi että tekisi jokaiselle objektille vaikka 2d-maskin jossa olisi merkitty pikselit joista valonsäde kulkee ja ne, joista se ei pääse läpi. Esim pöydän jalat olisi merkitty maskiin neljänä neliönä kuvan reunoilla. Kun vielä laittaa ukkelille taskulampun käteen jota voi hiirellä pyöritellä niin ShadowGrounds-klooni on valmis :)
Varjot olivat yksi aivoriihen topikeista. Jeps, perusvarjot olisi helppo tehdä uhraamalla yksi väri paletista "varjoväriksi" joka tummentaisi taaksejääviä pixeleitä 50% tai jotain. Toisaalta jos grafiikka näyttää jo tuolta niin varjoja ei välttämättä tarvita ollenkaan. Olisihan se mahtava Esan-venytys feature taas lisää...
Mutta kun kerran valot ovat aika epä-ortodoksiset niin eihän varjot voi pistää pekkaa pahemmaksi. Nuo perusvarjot näyttäisivät aika pahalta jos alkaa kunnolla hyödyntää tätä valaistusmoottoria jonka olen jo väsännyt.
Koska pystymme height-mapin ja objektin z-offsetin avulla määrittämään jokaiselle pixelille sen kolmiulotteisen sijainnin niin periaatteessa voisimme raytraceta valonlähteestä kohdepixeleihin. Itse en osaa tämmösiä väsätä, mutta teoriassa mahdollista. Siitä miten se pyörii ja miten pakollinen feature se on, voi olla montaa mieltä.
Hmmm...
Pixel = x,y,color (in two dimensional space)
Voxel = x,y,z,color (in three dimensional space)
Therefore:
Poxel = x,y,z,color (in two dimensional space)
:D
Pyrkyri millä kielellä teit ton?
Lukee tuolla jossain:
QBasic 4.5
(käytin AK-lib:iä saadakseni näytön resoluutioksi 1280x1024)
Se saa kyllä nyt kyytiä sillä sain viimeisenkin työkalun (tai tarkemmin sanottuna tekniikan) jolla teen noita height-mäppejä (aloin kutsumaan niitä jo hate-mäpeiks pixeleitä paukuttaessa) eräs ystävällinen sielu CG-Talk foorumilla kertoi sen minulle.
Design Document valmistuu hyvää tahtia, jos saan sen valmiiksi huomenna (pitää testata mitä puhuu koodaamalla tolla QBasicilla uudestaan ettei puhu p**kaa) niin alan etsimään kiinnostuneita C-ohjelmoijia. En siis jatka enempää tuota QB-versiota koska tiedän ettei engine pyöri sillä.
Projektin ideana alustavasti siis että minä teen Grafiikkaa ja orj... ohjelmoijat moottoria. 8=)
JÄYRGH, sain tänään rahaa = ->Kaljalle. :D
Mutta minuapa kiinnostaisi tuon Qb-enginen koodi. Kyllä sillä vähintään pystyisi leikkimään ;-)
-Grey-
Ah damn, kerkesin jo muuttaa koodin kelvottomaksi, mutta tottakai, saat sen sitten kun oon koodannu sen kunnolla.
Ei sillä kyllä kovin hauska ole pelleillä. Ehkä jos ois parempi kone (800mhz) niin sitten, tein sen vain testatakseni teoriaa. Mutta tiedätkö millä on hauska pelleillä? Tein tossa Tammi-Helmikuussa haasteen Thomas Biskupille (ADOM:in tekijä), en kerenny lähettää tätä hänelle ja sitten se vähän räjähti pelkästä Rogue-Like tutoriaalista jo aivan omaksi engineksi.
Jos saatte jotain aikaseksi tuosta niin ilmottakaa.
Ohhoh, aamen backupeille.
Imuttaessa tiedoston hyväksyt täysin ettei ohjelman tekijä ole missään vastuussa käyttäjän (sinun!) koneen, näyttökortin tai näytön hajoamisesta, ennakkoluulojen romahtamisesta QBasicia kohtaan, elämän jatkumisesta tai mielenrauhasta ylipäätäänsä.
edit: Hei, oikeesti ihmiset, ottakaa selvää voiko tuo AK-Lib tehdä hallaa näytölle/näyttökortille. Oon kuullu et nuo QBasicin resoluutiovaihdokset + kryptinen näyttis = paljon kyyneliä
He-he-hei, eipäs laiteta sitä laitonta QB:tä pakettiin mukaan!
Eipä tuo edes toiminut. VESA-tukea ilmeisesti jäi kaipaamaan.
Jos saatte (uskon että saatte) tuon pelimoottorin käännettyä c/c++ kielille niin kirjoittakaa ihmeessä ohje siitä, miten voi tehdä pelimoottorin. Uskoisin, että sellainen kiinnostaisi monia koodaajia, jotka eivät vielä ole perehtynny pelien tekemiseen ja miks ei niitäkin, jotka ovat perehtyneet peliohjelmointiin.
Uuups. Sorkee, korjaan asian välittömästi.
Joo se AK-Lib vissii heittää vaa pihalle jos näyttis ei tue. Harmi. Tsekkaa tuo QHack ihmeessä, siinä ei oo mitään kummallisuuksia.
Siis koko tuo "moottori" käsitys on aika hanurista. Sitä alettiin käyttää yleisesti Duke3D:n ja Quaken aikoina. Se ei ole mitään muuta kuin pohja jossa on kaikki tarvittava (funktiot tekoälyyn, taisteluun, liikkumiseen, jne.) ainoa mikä puuttuu on sisältö (content).
Jos imutat ja avaat esimerkiksi tuon Qhack:in niin se on aika mallillaan oleva moottori jo. Voisin käydä siihen tekemään kenttiä joita saisin helposti ladattua (muistaakseni, en oo availlu tuota pitkään aikaan), pystyn muuttamaan fontteja mieleisemmäksi ja saisin hirviöt pieksee toisiaan (pelaaja on vain yksi hirviö muiden joukossa).
Toisaalta tuo selventää asioita aika paljon. Aina kannattaa ensin tehdä moottori ja vasta sitten sisältö. Kaikki sisältöihin tarvittava koodaus tehdään skripteillä (QHackin skripti engine on melkein valmis, kunhan innostuisi jatkamaan sitä joskus).
Wow! Tosi hieno. Valaistus on erittäin aidon oloinen. Jos joku tekee tuosta C-version, ja jos C-versio nostaa fps:ää huomattavasti, tuohon voisi tehdä vielä jonkun jutun, joka Ja peilikuvasta puheen ollen, eikö tuohon voisi saada peilikuvan, jos sen kuva olisi erillinen kuva?
Hmm...entäs jos halutaan kaksi soihtua tai erillisiä soihtuja seinille? Voisitko näyttää esimerkit niistä?
Aihe on jo aika vanha, joten et voi enää vastata siihen.