Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: d + d + d × pallo

Sivun loppuun

Puhveli [18.06.2004 18:30:39]

#

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)?

hunajavohveli [18.06.2004 18:57:12]

#

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ä?

Puhveli [18.06.2004 19:15:34]

#

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..

hunajavohveli [18.06.2004 19:34:58]

#

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/24076-qb-pyöritettävä-3d-pallo

Puhveli [18.06.2004 19:40:24]

#

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.

hunajavohveli [18.06.2004 20:02:41]

#

Luullakseni viimeinen kysymys, jonka tarvitsen neuvoakseni: Ovatko laivat siis ainoita liikkuvia kappaleita, eli toisin sanoen pysyykö sukellusvene koko ajan paikoillaan?

Puhveli [18.06.2004 20:05:04]

#

ajatuksena on, että sukellusvene liikkuu. voi tietenkin tehdä myös niin, että vene pysyy paikoillaan ja muut laivat liikkuvat (kuten esim. doomissa aikoinaan)

Gwaur [18.06.2004 20:06:45]

#

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

Puhveli [18.06.2004 20:10:10]

#

kiitos

hunajavohveli [18.06.2004 20:19:15]

#

Selvisikö ongelma täysin vai tarvitsetko vielä tuon minun neuvoni? En kyllä käsitä, missä kohtaa tuossa Gwaurin koodissa on kameran sijainti ja kulma.

Gwaur [18.06.2004 20:37:53]

#

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 ;)

hunajavohveli [18.06.2004 20:43:23]

#

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.

Puhveli [18.06.2004 20:46:28]

#

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

hunajavohveli [18.06.2004 20:58:27]

#

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.

Gwaur [18.06.2004 21:13:05]

#

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 :)

hunajavohveli [19.06.2004 10:39:20]

#

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ä.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta