jos ajatellaan että taulukossa on pallon sijainti (vaikka vain x ja z) ja tiedetään myös kameran sijainti ja kulma, tästä voidaan laskea pallon etäisyys kamerasta ja se x missä ne asuvat kameran ruudulla, siis käytännössä 3d -moottorin alku. mutta miten (etäisyyden laskemisesta selviän luultavasti itse)?
No, mikäli käytössä ovat vain x ja z, et ilmeisesti aio laskea korkeutta, vaan se pysyy vakiona ruudun keskellä ja ainoastaan sijainti vaaka-akselilla vaihtelee. Korjaa, jos käsitin väärin.
Itse olen käyttänyt Linkku3D:ssäni laskemiseen arkustangenttia. Etäisyyden laskemista en itse asiassa koko moottorissani tarvitse, mutta mikäli toistaiseksi käytät esimerkkinä vain palloja, etäisyyden laskemisella on huomattava merkitys.
Eli kysytään ensinnäkin: Teetkö QB:lle, vai VB:lle, ja osaatko laskea kulman kahden 2d-pisteen välillä?
joo en tosiaan tarvitse korkeutta olit täysin oikeassa kyllä niin aivan justiinsa. itse asiassa en käytä palloja vaan laatikoista koostuvia linellä tehtyjä skaalattavia kuvia (=rumaa mutta yksinkertaista).
kulman osaan laskea, ja teen vb:lle, mutta ei kai se laskutoimituksen komennot nyt niin paljon näillä kielillä vaihtele..
Joo ne laskuthan on periaatteessa ihan samat. Mutta yritätkö nyt siis tehdä samantyylistä moottori kuin Linkku3D (jos nyt yleensä olet kokeillut sitä) vai sellaista moottoria, jossa pyöritellään vain kameraa kohteen ympärillä, kuten esim.
https://www.ohjelmointiputka.net/koodivinkit/
teen toisen maailmansodan merisodankäynnistä kertovaa sukellusvenesimua :), toiset laivat näkyy periskooppi-ikkunassa, ja niiden koko on suoraan verrannollinen etäisyyteen. haluaisin vaan tietää että mille kohdalle ne pitää piirtää siihen periskooppinäkymään. kamera siis on sukellusvene.
ps. linkku on upea, olen kyllä kokeillut sitä, mutta en ihan sellaista tee.
Luullakseni viimeinen kysymys, jonka tarvitsen neuvoakseni: Ovatko laivat siis ainoita liikkuvia kappaleita, eli toisin sanoen pysyykö sukellusvene koko ajan paikoillaan?
ajatuksena on, että sukellusvene liikkuu. voi tietenkin tehdä myös niin, että vene pysyy paikoillaan ja muut laivat liikkuvat (kuten esim. doomissa aikoinaan)
Tällaisilla kaavoilla lasketaan kolmiulotteisen pisteen koordit kaksiulotteiseen ruutuun:
s = 25 'tämä on hyvä arvo, mutta voi pistää isommaksikin 'jos haluaa laajemman katselukulman cx = 320 'pakopisteen koordinaatit olettaen että ruutu on cy = 240 'kokoa 640*480. toisinsanottuna nämä koordit on '2D-ruudun origo, eli keskipiste pistex = 50 'Piirrettävän pisteen koordit kolmiulotteisessa pistey = -24 'koordinaatistossa. jos x,y = 0,0 piste piir- pistez = 30 'retään origoon, eli keskelle ruutua. 'eli jos haluat pisteen näkymään keskipisteen 'vaikkapa vasemmalla puolella, x:n tulee olla 'negatiivinen. sama y:ssä. x = pistex * s / pistez + cx 'pisteen x-koordi 2D-ruudussa y = pistey * s / pistez + cx 'pisteen y-koordi 2D-ruudussa 'sitten piirrät pisteen koordeihin x ja y
Toivottavasti tajusit :P
kiitos
Selvisikö ongelma täysin vai tarvitsetko vielä tuon minun neuvoni? En kyllä käsitä, missä kohtaa tuossa Gwaurin koodissa on kameran sijainti ja kulma.
hunajavohveli kirjoitti:
En kyllä käsitä, missä kohtaa tuossa Gwaurin koodissa on kameran sijainti ja kulma.
Ei siinä olekaan, mutta onhan se mahdollista tehdä semmoinenkin. Itse en osaa ;)
Niin, eli tässä tapauksessa tuo koodi ei oikein kelpaa. Joten on ilmeisesti käytettävä samaa periaatetta kuin Linkussa: Laske siis sukellusveneen ja laivan välinen kulma. Sitten lasket sen kulma ja kameran kulman erotuksen. Jos erotus on 0, kameraa katsoo suoraan kohti sukellusvenettä. Jos erotus on negatiivinen, kamera katsoo sukellusveneestä vasemmalle jne.
kelpaa, koska jos ajatellaan että sukellusvene on koko ajan origossa, eli se ei liiku vaan sukellusveneen liikkuessa muut alukset liikkuvat ja vene pysyy paikoillaan. niin se toimii.
edit: ja sen kulman voi tehdä niin että kun vene kääntyy niin kaikki muut alukset liikkuvat silleen jännästi. ulkonäkö on sama, eikä kukaan saa tietää kuinka se tosiasiassa toimii ;D
niin kiitos molemmille
Niin, kaikkihan on tietysti suhteellista. Voit kääntää kameraa, tai pyörittää maailmaa päinvastaiseen suuntaan, ja homma näyttää ihan samalta. Olet siinä ihan oikeassa.
hunajavohveli kirjoitti:
Voit kääntää kameraa, tai pyörittää maailmaa päinvastaiseen suuntaan, ja homma näyttää ihan samalta.
Ajattelin ihan samaa mutten keksinyt miten sen selittäisi :P
Puhveli kirjoitti:
eikä kukaan saa tietää kuinka se tosiasiassa toimii
Ellei tee lähdekoodista julkista :)
Huomauttaisin vielä tuosta koodista, että mikäli z, eli suora etäisyys on negatiivinen, piste on tietysti kuvitteellisen kameran takana. Tällöin tuo konversio ei kuitenkaan toimi oikein, vaan piste vain tulee ruudulle peilikuvana (molemmilla akseleilla). Joten on syytä tehdä tarkistus:
If z > 0 Then Piirretään piste
Myös, mikäli etäisyys on 0, eli kamera on samassa kohtaa kuin esine (mikä ei siis käytännössäkään voisi olla mahdollista), tulee virheilmoitus nollalla jakamisesta. Tuo tarkistus sulkee kuitenkin pois myös tämän mahdollisuuden. (olettaen tietysti, että konversiokaava on If-lausekkeen sisällä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.